Litmus Edge 4.4.x - Flows Manager
List Flows
GET {{edgeUrl}}/flows-manager/flows
List Flows
Returns every flow configured on the device along with its lifecycle fields and the list of Node-RED tabs it contains.
Endpoint
GET {{edgeUrl}}/flows-manager/flows
```
## Authentication
HTTP Basic Auth. **Username** is your API token, **password** is empty. Tokens are managed under `System > Access Control > Tokens`.
## Parameters
None.
## Response
`200 OK` -- `application/json`. Array of flow objects.
| Field | Type | Description |
| --- | --- | --- |
| `id` | integer | Flow ID (auto-incremented from 1). Used as `{{flow_id}}` in every other endpoint in this folder. |
| `name` | string | Flow name (e.g. `flow-1`). |
| `memory_limit` | integer | Soft memory cap in MB. `0` means no explicit limit. |
| `secret` | string | Encryption key used to encrypt sensitive fields inside the flow's `flows_cred.json`. Empty if unset. |
| `tabs` | object\[\] | Node-RED tabs inside the flow. Tab CRUD happens **inside Node-RED**, not via this API. |
| `tabs[].id` | string | Node-RED tab ID (16-character hex). |
| `tabs[].label` | string | Tab display name as shown in the Node-RED editor. |
### Example response
``` json
[
{
"id": 1,
"name": "flow-1",
"memory_limit": 0,
"secret": "",
"tabs": [
{ "id": "d2c028f7.3edfd", "label": "Flow 1" },
{ "id": "6a066af5.d68d14", "label": "Flow 2" },
{ "id": "bf24c84c.f34d28", "label": "Flow 3" },
{ "id": "166b0a3cbcb7ad33", "label": "Flow 4" }
]
},
{
"id": 2,
"name": "flow-2",
"memory_limit": 0,
"secret": "",
"tabs": []
}
]
```
## Errors
| HTTP status | When it happens |
| --- | --- |
| `400 Bad Request` | Missing or malformed query/body parameter. |
| `401 Unauthorized` | Missing or invalid credentials. |
| `403 Forbidden` | Token lacks permission for this operation. |
| `404 Not Found` | Target entity does not exist. |
| `5xx` | Service is unreachable, restarting, or internally errored. Inspect device logs under `System > Support`. |
> **TLS note**: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
### Response
**Status**: 200 OK
```json
[
{
"id": 1,
"name": "flow-1",
"memory_limit": 0,
"secret": "",
"tabs": [
{
"id": "d2c028f7.3edfd",
"label": "Flow 1"
},
{
"id": "6a066af5.d68d14",
"label": "Flow 2"
},
{
"id": "bf24c84c.f34d28",
"label": "Flow 3"
},
{
"id": "166b0a3cbcb7ad33",
"label": "Flow 4"
}
]
},
{
"id": 2,
"name": "flow-2",
"memory_limit": 1024,
"secret": "",
"tabs": [
{
"id": "20c9a135.443d1e",
"label": "Flow 1"
}
]
},
{
"id": 3,
"name": "flow-3",
"memory_limit": 1024,
"secret": "",
"tabs": [
{
"id": "1f4d06ac43dd7191",
"label": "Flow 1"
}
]
}
]
Flow Status Events
GET {{edgeUrl}}/flows-manager/events
Flow Status Events
Streams the run state of every flow. The Flows Manager page uses it to update the status column without polling.
Endpoint
GET wss://{{edgeHost}}/flows-manager/events
WebSocket. Open wss://{{edgeHost}}/flows-manager/events with a WebSocket client; a plain HTTP GET does not stream. After importing this item, convert it to a Postman WebSocket request.
Authentication
HTTP Basic Auth on the WebSocket upgrade request. Username is your API token, password is empty. A token in the query string is not accepted.
An Origin header is not required by this service.
Messages
The first frame arrives right after the upgrade and lists every flow, so it doubles as a snapshot. Later frames are sent when a flow changes state. The example response lists the captured text frames, one JSON document per line.
| Field | Type | Description |
|---|---|---|
statuses[].name |
string | Flow name. |
statuses[].status |
string | Run state, the same values as List Flows (for example RUNNING, STOPPED). |
statuses[].last_error |
string | Last error reported by the flow, empty when none. |
Errors
| Response | When it happens |
|---|---|
401 Unauthorized on the upgrade |
Missing or invalid Authorization header. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 200 OK
{"statuses":[{"name":"Testcase 5","status":"STOPPED","last_error":""}]}
Create Flow
POST {{edgeUrl}}/flows-manager/flows
Create Flow
Creates a new, empty flow runtime. The runtime starts with no tabs and no nodes; open the LE UI's Flows page to launch the Node-RED editor and design tabs inside it.
The method is POST. A GET to the same URL is List Flows and ignores any body.
Endpoint
POST {{edgeUrl}}/flows-manager/flows
Content-Type: application/json
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Request body
{
"name": "flow-2",
"memory_limit": 256,
"secret": ""
}
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Display name. |
memory_limit |
integer | No | Memory cap in MB. 0 (or omit) for no explicit limit. Typical values: 128, 256, 512. |
secret |
string | No | Encryption secret for flows_cred.json. Set on creation only; changing it later means re-entering every credential. |
id |
integer | No | Ignored. The server assigns the next free ID (sending "id": 99 on a device with one flow returned 2). |
Response
200 OK -- application/json. The created flow, with the ID the server assigned. Use that id as {{flow_id}} in the other Flows Manager calls.
{
"id": 2,
"name": "flow-2",
"memory_limit": 256,
"secret": ""
}
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
{
"name": "flow-2",
"memory_limit": 256,
"secret": ""
}
Response
Status: 200 OK
{
"id": 2,
"name": "flow-2",
"memory_limit": 256,
"secret": ""
}
Stop Flow
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}/stop
Stop Flow
Stops a running flow. The Node-RED runtime is shut down cleanly; in-flight messages drain, then the process exits. flows.json and other on-disk state are preserved, so Start Flow will resume from the same point.
Not idempotent: stopping a flow that is not running returns 400 with already stopped. That includes a flow started a moment ago whose runtime is not up yet.
Endpoint
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}/stop
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID from List Flows. |
No request body.
Response
204 No Content on success.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 204 No Content
Start Flow
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}/start
Start Flow
Starts a stopped flow. Flows Manager loads flows.json, installs any missing node_modules, and brings the Node-RED runtime online. Once started, the runtime is reachable on its assigned port (managed internally; consult the LE UI for the URL).
Idempotent for already-running flows.
Endpoint
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}/start
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID from List Flows. |
No request body.
Response
204 No Content on success. Start is asynchronous: the call returns before the runtime is up, and List Flows carries no status field to poll. A Stop Flow sent in the first few seconds can return 400 already stopped while the runtime still comes up, so wait several seconds before stopping. The Node-RED editor may take longer while node_modules install.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 204 No Content
Start or Restart Flow in Safe Mode
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}/safemode
Start or Restart Flow in Safe Mode
Starts a flow, or restarts a running one, in Node-RED safe mode: the editor comes up but the flow's nodes are not started. Use it to recover a flow that crashes or hangs on start, fix it in the editor, then deploy. This is the Start in Safe Mode / Restart in Safe Mode action on a flow card in the LE UI; both send the same request.
List Flows does not report whether a flow is in safe mode, so confirm the result in the Node-RED editor.
Endpoint
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}/safemode
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID from List Flows. |
No request body.
Response
204 No Content on success, with an empty body.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 200 OK
Update Flow
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}
Update Flow
Updates the name and/or memory_limit of an existing flow. The id and secret are immutable -- to change them, remove and recreate the flow.
The update applies immediately; no restart is required.
Endpoint
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}
Content-Type: application/json
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID to update. |
Request body
{
"id": 4,
"name": "api-flow-4",
"memory_limit": 256
}
| Field | Type | Required | Description |
|---|---|---|---|
id |
integer | Yes | Must match the path parameter. |
name |
string | Yes | New display name. |
memory_limit |
integer | Yes | New memory cap in MB. 0 for no limit. |
Response
200 OK -- application/json. Echoes the updated flow.
{
"id": 4,
"name": "api-flow-4",
"memory_limit": 256,
"secret": ""
}
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
{
"id": 4,
"name":"api-flow-4",
"memory_limit": 256
}
Response
Status: 200 OK
{
"id": 4,
"name": "api-flow-4",
"memory_limit": 256,
"secret": ""
}
Remove Flow
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/instance
Remove Flow
Removes a flow entirely. The Node-RED runtime is stopped, the flow row is deleted, and all on-disk artifacts (flows.json, credentials, logs, installed node_modules) are removed.
For finer-grained cleanup (e.g. wipe logs without removing the flow), use the targeted Delete * endpoints.
Endpoint
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/instance
The option/instance suffix selects the whole instance as the target. The same family of endpoints uses different option/<x> values for targeted file cleanup (flows.json, flows_cred.json, logs, node_modules).
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID to remove. |
No request body.
Response
200 OK on success.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
Recoverability
There is no undo -- removed flows are gone. Export flows.json via Download Flow File before deleting if you may want to recreate the flow.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 204 No Content
Download Flow File
GET {{edgeUrl}}/flows-manager/flows/{{flow_id}}/download
Download Flow File
Note: a flow that has never been opened in the Node-RED editor has no
flows.jsonyet, so this returns404withnot found.
Returns the Node-RED definition (flows.json) for the flow as a JSON document. This is the source-of-truth for the flow's tabs, nodes, wires, and configuration -- back it up regularly, version-control it, or use it to clone a flow onto another device.
Endpoint
GET {{edgeUrl}}/flows-manager/flows/{{flow_id}}/download
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID to download. |
No request body.
Response
200 OK -- application/json. Top-level is an array of Node-RED objects. Tabs have type: "tab"; nodes have type: "<node-type>" (e.g. inject, function, http in).
[
{
"id": "f2a7ed7a11eeae6c",
"type": "tab",
"label": "Energy Monitoring",
"disabled": false,
"info": "",
"env": []
},
{
"id": "206292fe7131ded2",
"type": "tab",
"label": "Scheduled Work Order",
"disabled": false,
"info": "",
"env": []
}
]
To re-deploy a downloaded flows.json, use the Node-RED editor's Import feature on the destination device, or stop the target flow, overwrite its flows.json on disk, and start it again.
Secrets:
flows.jsondoes not contain credentials. Those live inflows_cred.json(encrypted with the flow'ssecret). Restoring a flow on a different device requires also copyingflows_cred.jsonand using the samesecret.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 200 OK
[
{
"id": "f2a7ed7a11eeae6c",
"type": "tab",
"label": "Energy Monitoring",
"disabled": false,
"info": "",
"env": []
},
{
"id": "206292fe7131ded2",
"type": "tab",
"label": "Scheduled Work Order",
"disabled": false,
"info": "",
"env": []
},
{
"id": "2130e0063a8c5147",
"type": "tab",
"label": "Condition Based Monitoring (CBM)",
"disabled": false,
"info": "",
"env": []
},
{
"id": "3d5ab96d4599cd0f",
"type": "tab",
"label": "Common Data Model (CDM)",
"disabled": false,
"info": "",
"env": []
},
{
"id": "ebdecfa2769805b1",
"type": "tab",
"label": "CDM - DT",
"disabled": false,
"info": "",
"env": []
},
{
"id": "b58a87045c486f7c",
"type": "tab",
"label": "TimeDifference Due",
"disabled": false,
"info": "",
"env": []
},
{
"id": "344a471357a84606",
"type": "group",
"z": "2130e0063a8c5147",
"name": "CBM Demo Flow",
"style": {
"stroke": "#92d04f",
"label": true,
"fill": "#e3f3d3"
},
"nodes": [
"f0084a0d100d744d",
"9483a53f5a24800d",
"cf8d51bf3cddbac3",
"ebd9a00145751dea",
"0deaadc52a3f2e0a",
"4dbfe0c77670d8bc",
"bfe69d07953473c2",
"de8a323d17d70ca1",
"208304af1d5d1fb6",
"d8961aed3cde1fbd",
"a18bad4b61c2079b",
"541278bcc620a54c",
"89b424edc1a46a59",
"ab69e67946c96482",
"426416ad846c7574",
"426040301f9d3df3",
"4e1743be00869bb8",
"fa53c1b01e6c090e",
"3f84b97fd164acbe",
"99b7c1174819f311",
"f6d1379a7984f9e9",
"2e856578c9a660a9",
"33ec54f808a744a2"
],
"x": 54,
"y": 19,
"w": 1952,
"h": 322
},
{
"id": "0903542732afd60e",
"type": "group",
"z": "2130e0063a8c5147",
"name": "Sim Data with Temp & State",
"style": {
"stroke": "#92d04f",
"label": true,
"fill": "#e3f3d3"
},
"nodes": [
"1e93ba93c309522a",
"74ab7b04a4e7aa38",
"3b932782560723d9",
"caeca94050bdf06c",
"f9b79c7a00cda2a0",
"e96039e8a74f8c38",
"1d08302769e3bfa9",
"5155ac709ea90e98",
"9ac529b17645ed25",
"7554ba908ca19887",
"5db9682c7bdc4ba4",
"531a1f859d94917e",
"d6719ae8d0b54fef",
"f70595d196605113",
"839930253bdd071d",
"a917b0f50ddd67fd",
"8e85b0ea74c35384",
"811868bb9f06ec3a",
"7e2642d156a8b5e3",
"f222bfb36adcd1fb",
"fc985480570da008",
"abfedb6b68babf9c",
"06b5471d82318f1e",
"f11a8a8c3271b678",
"08c17e87ba6161f3",
"faaae58d18e2d8fd",
"fc0baedc30a8cdaa",
"bba7c28b301a7d50",
"18e6652fde78e2cc",
"d736c843edddc158",
"e7d8ffbcb8bf8119",
"29aaeafe0bc12306",
"29e7173285ea6ebd",
"5b20b1be48fdf8ed",
"d68f20b29d16b31e",
"97161e37eece7bf9"
],
"x": 54,
"y": 379,
"w": 1612,
"h": 662
},
{
"id": "50dd4eba8ec312ce",
"type": "influxdb",
"d": true,
"hostname": "localhost",
"port": "8086",
"protocol": "http",
"database": "tsdata",
"name": "tsdata",
"usetls": false,
"tls": "",
"influxdbVersion": "1.x",
"url": "http://localhost:8086",
"rejectUnauthorized": true
},
{
"id": "3bfa3ae2.5f317e",
"type": "MSSQL-CN",
"tdsVersion": "7_4",
"name": "MSSQL",
"server": "172.172.0.1",
"port": "1433",
"encyption": true,
"trustServerCertificate": true,
"database": "litmus",
"useUTC": true,
"connectTimeout": "15000",
"requestTimeout": "15000",
"cancelTimeout": "5000",
"pool": "5",
"parseJSON": false,
"enableArithAbort": true
},
{
"id": "2625f216e9b28a20",
"type": "Datahub Connect",
"ipadd": "127.0.0.1",
"port": "4222"
},
{
"id": "e7e26815.57718",
"type": "Datahub Connect",
"ipadd": "127.0.0.1",
"port": "4222"
},
{
"id": "f8704fc59be439b4",
"type": "Datahub Connect",
"ipadd": "127.0.0.1",
"port": "4222"
},
{
"id": "8e5f261c.f5b538",
"type": "tls-config",
"name": "Test",
"cert": "",
"key": "",
"ca": "",
"certname": "",
"keyname": "",
"caname": "",
"servername": "",
"verifyservercert": false
},
{
"id": "bae6871353da5237",
"type": "MySQLdatabase",
"name": "",
"host": "172.172.0.1",
"port": "3306",
"db": "litmus",
"tz": "",
"charset": "UTF8"
},
{
"id": "a51e405c.10f64",
"type": "MSSQL-CN",
"tdsVersion": "7_4",
"name": "MSSQL Server",
"server": "172.172.0.1",
"port": "1433",
"encyption": false,
"trustServerCertificate": false,
"database": "litmus",
"useUTC": false,
"connectTimeout": "15000",
"requestTimeout": "15000",
"cancelTimeout": "5000",
"pool": "5",
"parseJSON": false,
"enableArithAbort": true,
"readOnlyIntent": false
},
{
"id": "df8c0b88.91b0a8",
"type": "MSSQL-CN",
"name": "Dev",
"server": "localhost",
"port": "",
"encyption": false,
"trustServerCertificate": false,
"database": "Dev",
"useUTC": false,
"connectTimeout": "",
"requestTimeout": "",
"cancelTimeout": "",
"pool": "",
"parseJSON": false,
"enableArithAbort": true
},
{
"id": "712b53e5.990dfc",
"type": "mqtt-broker",
"broker": "localhost",
"port": "1883",
"clientid": "NodeRedSQLClient",
"usetls": false,
"compatmode": true,
"keepalive": "15",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"willTopic": "",
"willQos": "0",
"willPayload": ""
},
{
"id": "5dc9c987a56098e7",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "Data from Device",
"info": "",
"x": 3120,
"y": 2440,
"wires": []
},
{
"id": "a254de4309a3c206",
"type": "Datahub Subscribe",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.P1_Electrical_Panel.L1_Machine1_1_S7_Power",
"x": 3290,
"y": 2500,
"wires": [
[
"d5d4d6c5567e33a7"
]
]
},
{
"id": "f410e5939c87a101",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "P1",
"info": "",
"x": 3080,
"y": 2180,
"wires": []
},
{
"id": "875219f74ebb476f",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "API Energy Rates US",
"info": "\n\n\n\nhttps://developer.nrel.gov/api/utility_rates/v3.json?api_key=W0MG0g1oAe2nja5Fs1WyMZNStNFP1OUGbCE2RkwU&address=London",
"x": 3640,
"y": 2300,
"wires": []
},
{
"id": "d5d4d6c5567e33a7",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 3630,
"y": 2500,
"wires": [
[
"579fd40b8dd178d5"
]
]
},
{
"id": "579fd40b8dd178d5",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.metadata.plant;\nvar extractedline = msg.payload.metadata.line_tag;\nvar extractedmachine = msg.payload.metadata.name_tag;\nvar extractedpower = msg.payload.value || 0; // Default to 0 if null/undefined\nvar extractedtimestamp = msg.payload.timestamp;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n timestamp: extractedtimestamp\n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 3800,
"y": 2500,
"wires": [
[
"f1add7e518bf8035"
]
]
},
{
"id": "f1add7e518bf8035",
"type": "join",
"z": "f2a7ed7a11eeae6c",
"name": "",
"mode": "custom",
"build": "merged",
"property": "payload",
"propertyType": "msg",
"key": "payload.outputs.industrial",
"joiner": "\\n",
"joinerType": "str",
"accumulate": true,
"timeout": "",
"count": "3",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 3960,
"y": 2500,
"wires": [
[]
]
},
{
"id": "17d1190da741effb",
"type": "Datahub Subscribe",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.P1_Electrical_Panel.L1_Machine2_1_S7_Power",
"x": 3290,
"y": 2560,
"wires": [
[
"1524208733c74d61"
]
]
},
{
"id": "c1c201110be45fb6",
"type": "Datahub Publish",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "EnergyP1L1M1",
"x": 4480,
"y": 2500,
"wires": []
},
{
"id": "86b37a4fc3570a4b",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 4270,
"y": 2500,
"wires": [
[
"c1c201110be45fb6"
]
]
},
{
"id": "1524208733c74d61",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 3630,
"y": 2560,
"wires": [
[
"4d418ff41071ce11"
]
]
},
{
"id": "4d418ff41071ce11",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.metadata.plant;\nvar extractedline = msg.payload.metadata.line_tag;\nvar extractedmachine = msg.payload.metadata.name_tag;\nvar extractedpower = msg.payload.value || 0; // Default to 0 if null/undefined\nvar extractedtimestamp = msg.payload.timestamp;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n timestamp: extractedtimestamp\n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 3800,
"y": 2560,
"wires": [
[
"b1832c46800626e9"
]
]
},
{
"id": "b1832c46800626e9",
"type": "join",
"z": "f2a7ed7a11eeae6c",
"name": "",
"mode": "custom",
"build": "merged",
"property": "payload",
"propertyType": "msg",
"key": "payload.outputs.industrial",
"joiner": "\\n",
"joinerType": "str",
"accumulate": true,
"timeout": "",
"count": "3",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 3960,
"y": 2560,
"wires": [
[
"0ad0f51e32abb97e"
]
]
},
{
"id": "0e1c28a7282d1940",
"type": "Datahub Publish",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "EnergyP1L1M2",
"x": 4480,
"y": 2560,
"wires": []
},
{
"id": "66de0f235bec9e29",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 4270,
"y": 2560,
"wires": [
[
"0e1c28a7282d1940"
]
]
},
{
"id": "050a5a2e9ebf4b08",
"type": "Datahub Subscribe",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.P1_Electrical_Panel.L1_Machine3_1_S7_Power",
"x": 3290,
"y": 2620,
"wires": [
[
"807a1b01b15e056f"
]
]
},
{
"id": "807a1b01b15e056f",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 3630,
"y": 2620,
"wires": [
[
"fa9225f91d3be5b4"
]
]
},
{
"id": "fa9225f91d3be5b4",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.metadata.plant;\nvar extractedline = msg.payload.metadata.line_tag;\nvar extractedmachine = msg.payload.metadata.name_tag;\nvar extractedpower = msg.payload.value || 0; // Default to 0 if null/undefined\nvar extractedtimestamp = msg.payload.timestamp;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n timestamp: extractedtimestamp\n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 3800,
"y": 2620,
"wires": [
[
"c03e177ab5906460"
]
]
},
{
"id": "c03e177ab5906460",
"type": "join",
"z": "f2a7ed7a11eeae6c",
"name": "",
"mode": "custom",
"build": "merged",
"property": "payload",
"propertyType": "msg",
"key": "payload.outputs.industrial",
"joiner": "\\n",
"joinerType": "str",
"accumulate": true,
"timeout": "",
"count": "3",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 3960,
"y": 2620,
"wires": [
[
"8ea33c32a0c08019"
]
]
},
{
"id": "2819220fe4849a9d",
"type": "Datahub Publish",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "EnergyP1L1M3",
"x": 4480,
"y": 2620,
"wires": []
},
{
"id": "724bc68356f68143",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 4270,
"y": 2620,
"wires": [
[
"2819220fe4849a9d"
]
]
},
{
"id": "d32612932dd45947",
"type": "Datahub Subscribe",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.P1_Electrical_Panel.L2_Machine1_1_S7_Power",
"x": 3290,
"y": 2680,
"wires": [
[
"fc115f47e70ae62e"
]
]
},
{
"id": "12ddb559b5ad116f",
"type": "Datahub Subscribe",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.P1_Electrical_Panel.L2_Machine2_1_S7_Power",
"x": 3290,
"y": 2740,
"wires": [
[
"cb18a244deccc5c0"
]
]
},
{
"id": "2fa1926a0be18dcc",
"type": "Datahub Subscribe",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.P1_Electrical_Panel.L2_Machine3_1_S7_Power",
"x": 3290,
"y": 2800,
"wires": [
[
"5f799420f87d184e"
]
]
},
{
"id": "fc115f47e70ae62e",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 3630,
"y": 2680,
"wires": [
[
"8ff82528d70b5323"
]
]
},
{
"id": "8ff82528d70b5323",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.metadata.plant;\nvar extractedline = msg.payload.metadata.line_tag;\nvar extractedmachine = msg.payload.metadata.name_tag;\nvar extractedpower = msg.payload.value || 0; // Default to 0 if null/undefined\nvar extractedtimestamp = msg.payload.timestamp;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n timestamp: extractedtimestamp\n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 3800,
"y": 2680,
"wires": [
[
"43e9bad85519783c"
]
]
},
{
"id": "43e9bad85519783c",
"type": "join",
"z": "f2a7ed7a11eeae6c",
"name": "",
"mode": "custom",
"build": "merged",
"property": "payload",
"propertyType": "msg",
"key": "payload.outputs.industrial",
"joiner": "\\n",
"joinerType": "str",
"accumulate": true,
"timeout": "",
"count": "3",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 3960,
"y": 2680,
"wires": [
[
"5137c6f87784c40a"
]
]
},
{
"id": "1435b4067db2a95a",
"type": "Datahub Publish",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "EnergyP1L2M1",
"x": 4480,
"y": 2680,
"wires": []
},
{
"id": "806933c7ae04f8f9",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 4270,
"y": 2680,
"wires": [
[
"1435b4067db2a95a"
]
]
},
{
"id": "cb18a244deccc5c0",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 3630,
"y": 2740,
"wires": [
[
"4ab88553fa42c9d3"
]
]
},
{
"id": "4ab88553fa42c9d3",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.metadata.plant;\nvar extractedline = msg.payload.metadata.line_tag;\nvar extractedmachine = msg.payload.metadata.name_tag;\nvar extractedpower = msg.payload.value || 0; // Default to 0 if null/undefined\nvar extractedtimestamp = msg.payload.timestamp;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n timestamp: extractedtimestamp\n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 3800,
"y": 2740,
"wires": [
[
"883585b04829d7ff"
]
]
},
{
"id": "883585b04829d7ff",
"type": "join",
"z": "f2a7ed7a11eeae6c",
"name": "",
"mode": "custom",
"build": "merged",
"property": "payload",
"propertyType": "msg",
"key": "payload.outputs.industrial",
"joiner": "\\n",
"joinerType": "str",
"accumulate": true,
"timeout": "",
"count": "3",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 3960,
"y": 2740,
"wires": [
[
"2ef9fd37ab437ced"
]
]
},
{
"id": "a052cd5452006998",
"type": "Datahub Publish",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "EnergyP1L2M2",
"x": 4480,
"y": 2740,
"wires": []
},
{
"id": "dbfbfc34804e7d1b",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 4270,
"y": 2740,
"wires": [
[
"a052cd5452006998"
]
]
},
{
"id": "5f799420f87d184e",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 3630,
"y": 2800,
"wires": [
[
"7f31cea5bce60770"
]
]
},
{
"id": "7f31cea5bce60770",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.metadata.plant;\nvar extractedline = msg.payload.metadata.line_tag;\nvar extractedmachine = msg.payload.metadata.name_tag;\nvar extractedpower = msg.payload.value || 0; // Default to 0 if null/undefined\nvar extractedtimestamp = msg.payload.timestamp;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n timestamp: extractedtimestamp\n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 3800,
"y": 2800,
"wires": [
[
"21864ac7c0ea48ca"
]
]
},
{
"id": "21864ac7c0ea48ca",
"type": "join",
"z": "f2a7ed7a11eeae6c",
"name": "",
"mode": "custom",
"build": "merged",
"property": "payload",
"propertyType": "msg",
"key": "payload.outputs.industrial",
"joiner": "\\n",
"joinerType": "str",
"accumulate": true,
"timeout": "",
"count": "3",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 3960,
"y": 2800,
"wires": [
[
"8ee5184efd4097d9"
]
]
},
{
"id": "de9e85211cfd719e",
"type": "Datahub Publish",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "EnergyP1L2M3",
"x": 4480,
"y": 2800,
"wires": []
},
{
"id": "136a94cab717d585",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 4270,
"y": 2800,
"wires": [
[
"de9e85211cfd719e"
]
]
},
{
"id": "d9f2576129cd377e",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "",
"method": "GET",
"ret": "obj",
"paytoqs": "body",
"url": "https://developer.nrel.gov/api/utility_rates/v3.json?api_key=W0MG0g1oAe2nja5Fs1WyMZNStNFP1OUGbCE2RkwU&address={{{query}}}",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"x": 3610,
"y": 2360,
"wires": [
[]
]
},
{
"id": "ecfc1655b03f5ad9",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "60",
"crontab": "",
"once": false,
"onceDelay": "1",
"topic": "",
"payload": "Seattle",
"payloadType": "str",
"x": 3200,
"y": 2280,
"wires": [
[]
]
},
{
"id": "1d586de26f682738",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "query",
"pt": "msg",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 3420,
"y": 2360,
"wires": [
[
"d9f2576129cd377e"
]
]
},
{
"id": "8d958d7e02d990e1",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "60",
"crontab": "",
"once": false,
"onceDelay": "1",
"topic": "",
"payload": "Dallas",
"payloadType": "str",
"x": 3200,
"y": 2320,
"wires": [
[]
]
},
{
"id": "ba9980ac8c6bc73b",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "",
"method": "GET",
"ret": "obj",
"paytoqs": "ignore",
"url": "https://api.openweathermap.org/data/2.5/weather?q={{{query}}}&appid=2468739f600808df61e96ee0fd93dd95&units=metric",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"x": 3610,
"y": 2240,
"wires": [
[
"8fb3b25e40c027ba"
]
]
},
{
"id": "618e49dcef7e8b2f",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "Weather API",
"info": "",
"x": 3610,
"y": 2180,
"wires": []
},
{
"id": "ff54145e99f4215c",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "query",
"pt": "msg",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 3420,
"y": 2240,
"wires": [
[
"ba9980ac8c6bc73b"
]
]
},
{
"id": "8fb3b25e40c027ba",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedtemp = msg.payload.main.temp;\nvar extractedhumidity = msg.payload.main.humidity;\n\nmsg.payload = {\n temperature: extractedtemp,\n humidity: extractedhumidity\n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 3780,
"y": 2240,
"wires": [
[
"f1add7e518bf8035",
"b1832c46800626e9",
"c03e177ab5906460",
"43e9bad85519783c",
"883585b04829d7ff",
"21864ac7c0ea48ca"
]
]
},
{
"id": "06dffab025dd8319",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "60",
"crontab": "",
"once": true,
"onceDelay": "1",
"topic": "",
"payload": "Chicago",
"payloadType": "str",
"x": 3200,
"y": 2360,
"wires": [
[
"1d586de26f682738",
"ff54145e99f4215c"
]
]
},
{
"id": "2da517e1b5a31952",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 4650,
"y": 2140,
"wires": []
},
{
"id": "0ad0f51e32abb97e",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.plant;\nvar extractedline = msg.payload.line;\nvar extractedmachine = msg.payload.machine;\nvar extractedpower = msg.payload.power;\nvar extractedprice = msg.payload.price;\nvar extractedtimestamp = msg.payload.timestamp;\nvar extractedaddress = msg.payload.address;\nvar extractedutility = msg.payload.utility;\nvar extracttotal = msg.payload.price * msg.payload.power;\nvar extractedtemp = msg.payload.temperature\nvar extractedhumidity = msg.payload.humidity;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n cost: extractedprice,\n value: extracttotal,\n timestamp: extractedtimestamp,\n city: extractedaddress,\n provider: extractedutility,\n temperature: extractedtemp,\n humidity: extractedhumidity\n \n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 4100,
"y": 2560,
"wires": [
[
"66de0f235bec9e29"
]
]
},
{
"id": "8ea33c32a0c08019",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.plant;\nvar extractedline = msg.payload.line;\nvar extractedmachine = msg.payload.machine;\nvar extractedpower = msg.payload.power;\nvar extractedprice = msg.payload.price;\nvar extractedtimestamp = msg.payload.timestamp;\nvar extractedaddress = msg.payload.address;\nvar extractedutility = msg.payload.utility;\nvar extracttotal = msg.payload.price * msg.payload.power;\nvar extractedtemp = msg.payload.temperature\nvar extractedhumidity = msg.payload.humidity;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n cost: extractedprice,\n value: extracttotal,\n timestamp: extractedtimestamp,\n city: extractedaddress,\n provider: extractedutility,\n temperature: extractedtemp,\n humidity: extractedhumidity\n \n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 4100,
"y": 2620,
"wires": [
[
"724bc68356f68143"
]
]
},
{
"id": "5137c6f87784c40a",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.plant;\nvar extractedline = msg.payload.line;\nvar extractedmachine = msg.payload.machine;\nvar extractedpower = msg.payload.power;\nvar extractedprice = msg.payload.price;\nvar extractedtimestamp = msg.payload.timestamp;\nvar extractedaddress = msg.payload.address;\nvar extractedutility = msg.payload.utility;\nvar extracttotal = msg.payload.price * msg.payload.power;\nvar extractedtemp = msg.payload.temperature\nvar extractedhumidity = msg.payload.humidity;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n cost: extractedprice,\n value: extracttotal,\n timestamp: extractedtimestamp,\n city: extractedaddress,\n provider: extractedutility,\n temperature: extractedtemp,\n humidity: extractedhumidity\n \n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 4100,
"y": 2680,
"wires": [
[
"806933c7ae04f8f9"
]
]
},
{
"id": "2ef9fd37ab437ced",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.plant;\nvar extractedline = msg.payload.line;\nvar extractedmachine = msg.payload.machine;\nvar extractedpower = msg.payload.power;\nvar extractedprice = msg.payload.price;\nvar extractedtimestamp = msg.payload.timestamp;\nvar extractedaddress = msg.payload.address;\nvar extractedutility = msg.payload.utility;\nvar extracttotal = msg.payload.price * msg.payload.power;\nvar extractedtemp = msg.payload.temperature\nvar extractedhumidity = msg.payload.humidity;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n cost: extractedprice,\n value: extracttotal,\n timestamp: extractedtimestamp,\n city: extractedaddress,\n provider: extractedutility,\n temperature: extractedtemp,\n humidity: extractedhumidity\n \n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 4100,
"y": 2740,
"wires": [
[
"dbfbfc34804e7d1b"
]
]
},
{
"id": "8ee5184efd4097d9",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.plant;\nvar extractedline = msg.payload.line;\nvar extractedmachine = msg.payload.machine;\nvar extractedpower = msg.payload.power;\nvar extractedprice = msg.payload.price;\nvar extractedtimestamp = msg.payload.timestamp;\nvar extractedaddress = msg.payload.address;\nvar extractedutility = msg.payload.utility;\nvar extracttotal = msg.payload.price * msg.payload.power;\nvar extractedtemp = msg.payload.temperature\nvar extractedhumidity = msg.payload.humidity;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n cost: extractedprice,\n value: extracttotal,\n timestamp: extractedtimestamp,\n city: extractedaddress,\n provider: extractedutility,\n temperature: extractedtemp,\n humidity: extractedhumidity\n \n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 4100,
"y": 2800,
"wires": [
[
"136a94cab717d585"
]
]
},
{
"id": "2560af2ef340c45b",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "rate",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 4000,
"y": 2360,
"wires": [
[]
]
},
{
"id": "9914bb47c279bc64",
"type": "template",
"z": "f2a7ed7a11eeae6c",
"name": "",
"field": "payload",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "",
"output": "str",
"x": 4660,
"y": 2380,
"wires": [
[
"4d3a484066b8c752"
]
]
},
{
"id": "92aa85daf143172b",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 4340,
"y": 2360,
"wires": [
[
"8796fb2535f2f482"
]
]
},
{
"id": "8796fb2535f2f482",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "",
"tot": "date"
},
{
"t": "set",
"p": "template",
"pt": "msg",
"to": "time: {{payload}}",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 4550,
"y": 2340,
"wires": [
[
"9914bb47c279bc64"
]
]
},
{
"id": "4d3a484066b8c752",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 4830,
"y": 2380,
"wires": []
},
{
"id": "d150ebca2416beea",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "60",
"crontab": "",
"once": false,
"onceDelay": "1",
"topic": "",
"payload": "Seattle",
"payloadType": "str",
"x": 200,
"y": 140,
"wires": [
[
"95c32a59bd40e3fe"
]
]
},
{
"id": "8a4fb4f67a31555c",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedplant = msg.payload.plant;\nvar extractedline = msg.payload.line;\nvar extractedmachine = msg.payload.machine;\nvar extractedpower = msg.payload.power;\nvar extractedprice = msg.payload.price;\nvar extractedtimestamp = msg.payload.timestamp;\nvar extractedaddress = msg.payload.address;\nvar extractedutility = msg.payload.utility;\nvar extracttotal = msg.payload.price * msg.payload.power;\nvar extractedtemp = msg.payload.temperature\nvar extractedhumidity = msg.payload.humidity;\n\nvar obj = flow.get('rate');\n\n value:obj.price;// extracttotal,\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n power: extractedpower,\n cost: extractedprice,\n value:obj.price,// extracttotal,\n timestamp: extractedtimestamp,\n city: extractedaddress,\n provider: extractedutility,\n temperature: extractedtemp,\n humidity: extractedhumidity\n \n};\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 4100,
"y": 2500,
"wires": [
[
"86b37a4fc3570a4b"
]
]
},
{
"id": "2c7721326d7626d3",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var extractedAddress = msg.payload.inputs.address;\nvar extractedUtilityName = msg.payload.outputs.utility_name;\nvar extractedPriceIndustrial = msg.payload.outputs.industrial;\n\nmsg.payload = {\n address: extractedAddress,\n utility: extractedUtilityName,\n price: extractedPriceIndustrial\n};\n\nflow.set ()\n\nreturn msg;\n\n\n\n// Extract information from the incoming payload\n//var extractedTemperature = msg.payload.data.temperature;\n//var extractedHumidity = msg.payload.data.humidity;\n\n// Create a new msg object with the extracted data\n//msg.payload = {\n //temperature: extractedTemperature,\n //humidity: extractedHumidity\n//};\n//msg.newKey = \"new value\"; // You can also add new properties to the msg object if needed\n//return msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 3780,
"y": 2360,
"wires": [
[]
]
},
{
"id": "a291187439e20806",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "",
"method": "GET",
"ret": "obj",
"paytoqs": "ignore",
"url": "https://api.openweathermap.org/data/2.5/weather?q={{{query}}}&appid=2468739f600808df61e96ee0fd93dd95&units=metric",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 590,
"y": 140,
"wires": [
[
"b275bdc94d425cf6",
"46d58b7b3f90e315"
]
]
},
{
"id": "f7e26b90eb58d447",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "Weather API",
"info": "",
"x": 590,
"y": 100,
"wires": []
},
{
"id": "95c32a59bd40e3fe",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "query",
"pt": "msg",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 400,
"y": 140,
"wires": [
[
"a291187439e20806"
]
]
},
{
"id": "3d54146594812356",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "API Energy Rates US",
"info": "\n\n\n\nhttps://developer.nrel.gov/api/utility_rates/v3.json?api_key=W0MG0g1oAe2nja5Fs1WyMZNStNFP1OUGbCE2RkwU&address=London",
"x": 620,
"y": 220,
"wires": []
},
{
"id": "b275bdc94d425cf6",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "P1Weather",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 140,
"wires": [
[]
]
},
{
"id": "466ba1bd99cacb70",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "60",
"crontab": "",
"once": false,
"onceDelay": "1",
"topic": "",
"payload": "Dallas",
"payloadType": "str",
"x": 160,
"y": 540,
"wires": [
[
"05ec117ded66c0ca"
]
]
},
{
"id": "ede8685b51c528df",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "",
"method": "GET",
"ret": "obj",
"paytoqs": "ignore",
"url": "https://api.openweathermap.org/data/2.5/weather?q={{{query}}}&appid=2468739f600808df61e96ee0fd93dd95&units=metric",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"x": 590,
"y": 540,
"wires": [
[
"55ff1004273a862b"
]
]
},
{
"id": "4e65a89ab73e820b",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "Weather API",
"info": "",
"x": 590,
"y": 500,
"wires": []
},
{
"id": "05ec117ded66c0ca",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "query",
"pt": "msg",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 400,
"y": 540,
"wires": [
[
"ede8685b51c528df"
]
]
},
{
"id": "b058dbfc5f7e6268",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "API Energy Rates US",
"info": "\n\n\n\nhttps://developer.nrel.gov/api/utility_rates/v3.json?api_key=W0MG0g1oAe2nja5Fs1WyMZNStNFP1OUGbCE2RkwU&address=London",
"x": 620,
"y": 620,
"wires": []
},
{
"id": "55ff1004273a862b",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "P2Weather",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 790,
"y": 540,
"wires": [
[
"f625293c74831f95"
]
]
},
{
"id": "4999fe3cfa3efdfc",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "P1",
"info": "",
"x": 120,
"y": 100,
"wires": []
},
{
"id": "6f5e467909c2575b",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "P2",
"info": "",
"x": 120,
"y": 480,
"wires": []
},
{
"id": "d4142e64a6450c99",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "Get Flow",
"info": "",
"x": 780,
"y": 720,
"wires": []
},
{
"id": "c4e021b9602d3c2d",
"type": "Datahub Subscribe",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.*.Power",
"x": 160,
"y": 780,
"wires": [
[
"8edc93339d6d0f53",
"b86b724bd642ba9d"
]
]
},
{
"id": "699a50bff815dd9e",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 750,
"y": 840,
"wires": []
},
{
"id": "8edc93339d6d0f53",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 370,
"y": 780,
"wires": [
[
"57cdb920e77db8d1"
]
]
},
{
"id": "57cdb920e77db8d1",
"type": "switch",
"z": "f2a7ed7a11eeae6c",
"name": "Plant filter",
"property": "payload.metadata.plant",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "Plant 2",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 560,
"y": 780,
"wires": [
[
"699a50bff815dd9e",
"62b292223ae3648e"
]
]
},
{
"id": "62b292223ae3648e",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var myObject = flow.get(\"P2EnergyUS\");\nvar myObject1 = flow.get(\"P2Weather\");\n\nmsg.payload.EnergyUS = myObject;\nmsg.payload.Weather = myObject1;\n\n\nreturn msg;\n",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 760,
"y": 780,
"wires": [
[
"ff62acc635e389f5",
"09216c361bb670cf"
]
]
},
{
"id": "ff62acc635e389f5",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "//Data from Devicehub\nvar extractedplant = msg.payload.metadata.plant;\nvar extractedline = msg.payload.metadata.line;\nvar extractedmachine = msg.payload.metadata.name;\nvar extractedpower = msg.payload.value || 0; // Default to 0 if null/undefined\n//every 30s power \"value\" in kW from PLC therefore divided 120 to get kWh \nvar extractedenergy = msg.payload.value / 120; \nvar extractrunningcost = (msg.payload.value / 120) * msg.payload.EnergyUS.outputs.industrial;\nvar extractedtimestamp = msg.payload.timestamp;\n\n//Data from utility API\nvar extractedenergyaddress = msg.payload.Weather.name;\nvar extractedenergyutility = msg.payload.EnergyUS.outputs.utility_name;\nvar extractedenergyprice = msg.payload.EnergyUS.outputs.industrial;\n\n//Data from weather API\nvar extractweathertemp = msg.payload.Weather.main.temp;\nvar extracthumidity = msg.payload.Weather.main.humidity;\nvar extracticon = msg.payload.Weather.weather[0].icon;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n value: extractedpower,\n energy: extractedenergy,\n runningcost: extractrunningcost,\n timestamp: extractedtimestamp,\n city: extractedenergyaddress,\n energyprovider: extractedenergyutility,\n energyprice: extractedenergyprice,\n ambienttemp: extractweathertemp, \n humidity: extracthumidity,\n icon: extracticon\n \n};\n\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1080,
"y": 780,
"wires": [
[
"a39f8b7f660ededf",
"6662277ef757f734"
]
]
},
{
"id": "a39f8b7f660ededf",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 1250,
"y": 780,
"wires": [
[
"d29cf391cca88df9"
]
]
},
{
"id": "d29cf391cca88df9",
"type": "Datahub Publish",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "P2_EnergyMonitoring",
"x": 1520,
"y": 780,
"wires": []
},
{
"id": "6662277ef757f734",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1370,
"y": 840,
"wires": []
},
{
"id": "8c70505e160cc93e",
"type": "Datahub Subscribe",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.*.Power",
"x": 180,
"y": 380,
"wires": [
[
"514c65c552bac953"
]
]
},
{
"id": "514c65c552bac953",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 390,
"y": 380,
"wires": [
[
"de0c3783ad600b8e"
]
]
},
{
"id": "de0c3783ad600b8e",
"type": "switch",
"z": "f2a7ed7a11eeae6c",
"name": "Plant filter",
"property": "payload.metadata.plant",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "Plant 1",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 580,
"y": 380,
"wires": [
[
"ab62de01062ae077"
]
]
},
{
"id": "ab62de01062ae077",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "var myObject = flow.get(\"P1EnergyUS\");\nvar myObject1 = flow.get(\"P1Weather\");\n\nmsg.payload.EnergyUS = myObject;\nmsg.payload.Weather = myObject1;\n\n\nreturn msg;\n",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 820,
"y": 380,
"wires": [
[
"a9a5e6d769919677",
"7315235c37b40f12"
]
]
},
{
"id": "a9a5e6d769919677",
"type": "function",
"z": "f2a7ed7a11eeae6c",
"name": "",
"func": "//Data from Devicehub\nvar extractedplant = msg.payload.metadata.plant;\nvar extractedline = msg.payload.metadata.line;\nvar extractedmachine = msg.payload.metadata.name;\nvar extractedpower = msg.payload.value || 0; // Default to 0 if null/undefined\n//every 30s power \"value\" in kW from PLC therefore divided 120 to get kWh \nvar extractedenergy = msg.payload.value / 120; \nvar extractrunningcost = (msg.payload.value / 120) * msg.payload.EnergyUS.outputs.industrial;\nvar extractedtimestamp = msg.payload.timestamp;\n\n//Data from utility API\nvar extractedenergyaddress = msg.payload.Weather.name;\nvar extractedenergyutility = msg.payload.EnergyUS.outputs.utility_name;\nvar extractedenergyprice = msg.payload.EnergyUS.outputs.industrial;\n\n//Data from weather API\nvar extractweathertemp = msg.payload.Weather.main.temp;\nvar extracthumidity = msg.payload.Weather.main.humidity;\nvar extracticon = msg.payload.Weather.weather[0].icon;\n\nmsg.payload = {\n plant: extractedplant,\n line: extractedline,\n machine: extractedmachine,\n value: extractedpower,\n energy: extractedenergy,\n runningcost: extractrunningcost,\n timestamp: extractedtimestamp,\n city: extractedenergyaddress,\n energyprovider: extractedenergyutility,\n energyprice: extractedenergyprice,\n ambienttemp: extractweathertemp, \n humidity: extracthumidity,\n icon: extracticon\n \n \n};\n\n\nreturn msg;\n\n\n\n",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1100,
"y": 380,
"wires": [
[
"6f56a9089a8f43cf",
"a1760dde4a183561"
]
]
},
{
"id": "6f56a9089a8f43cf",
"type": "json",
"z": "f2a7ed7a11eeae6c",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 1270,
"y": 380,
"wires": [
[
"c434ce66cb7975ce"
]
]
},
{
"id": "c434ce66cb7975ce",
"type": "Datahub Publish",
"z": "f2a7ed7a11eeae6c",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "P1_EnergyMonitoring",
"x": 1540,
"y": 380,
"wires": []
},
{
"id": "a1760dde4a183561",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1310,
"y": 420,
"wires": []
},
{
"id": "a11fa5d6dffb310c",
"type": "comment",
"z": "f2a7ed7a11eeae6c",
"name": "Get Flow",
"info": "",
"x": 780,
"y": 320,
"wires": []
},
{
"id": "46d58b7b3f90e315",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 950,
"y": 80,
"wires": []
},
{
"id": "b86b724bd642ba9d",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 410,
"y": 860,
"wires": []
},
{
"id": "7315235c37b40f12",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 990,
"y": 320,
"wires": []
},
{
"id": "09216c361bb670cf",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 990,
"y": 840,
"wires": []
},
{
"id": "f625293c74831f95",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1030,
"y": 540,
"wires": []
},
{
"id": "4ef7dd810b59a25c",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "Seattle",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": "5",
"topic": "",
"payload": "Seattle",
"payloadType": "str",
"x": 80,
"y": 260,
"wires": [
[
"a00101942e53eaf7"
]
]
},
{
"id": "a00101942e53eaf7",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "Fetch Geocode",
"method": "GET",
"ret": "obj",
"paytoqs": "ignore",
"url": "http://api.openweathermap.org/geo/1.0/direct?q={{payload}}&limit=1&appid=2468739f600808df61e96ee0fd93dd95",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 270,
"y": 260,
"wires": [
[
"9088e1f6073f1fbe"
]
]
},
{
"id": "24f54c89c52fd27b",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "",
"method": "GET",
"ret": "obj",
"paytoqs": "body",
"url": "https://developer.nrel.gov/api/utility_rates/v3.json?api_key=OuTghutknyKE2fyOeLEvkp5Csm5O8kRvcfoyQVEs&lon={{{lon}}}&lat={{{lat}}}",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 680,
"y": 260,
"wires": [
[
"75324d89d1ba2307"
]
]
},
{
"id": "75324d89d1ba2307",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "P1EnergyUS",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 890,
"y": 260,
"wires": [
[]
]
},
{
"id": "9088e1f6073f1fbe",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "Extract Lat",
"rules": [
{
"t": "set",
"p": "lat",
"pt": "msg",
"to": "msg.payload[0].lat",
"tot": "jsonata"
},
{
"t": "set",
"p": "lon",
"pt": "msg",
"to": "msg.payload[0].lon",
"tot": "jsonata"
}
],
"x": 480,
"y": 260,
"wires": [
[
"24f54c89c52fd27b"
]
]
},
{
"id": "46737db9d7eacbe9",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "Dallas",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": true,
"onceDelay": "5",
"topic": "",
"payload": "Dallas",
"payloadType": "str",
"x": 140,
"y": 660,
"wires": [
[
"bbeef1e6a452bef2"
]
]
},
{
"id": "bbeef1e6a452bef2",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "Fetch Geocode",
"method": "GET",
"ret": "obj",
"paytoqs": "ignore",
"url": "http://api.openweathermap.org/geo/1.0/direct?q={{payload}}&limit=1&appid=2468739f600808df61e96ee0fd93dd95",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 340,
"y": 660,
"wires": [
[
"640078d7ffe56f56"
]
]
},
{
"id": "d1823e6bac5c9744",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "",
"method": "GET",
"ret": "obj",
"paytoqs": "body",
"url": "https://developer.nrel.gov/api/utility_rates/v3.json?api_key=OuTghutknyKE2fyOeLEvkp5Csm5O8kRvcfoyQVEs&lon={{{lon}}}&lat={{{lat}}}",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 750,
"y": 660,
"wires": [
[
"f93024c46bfdbbb2"
]
]
},
{
"id": "f93024c46bfdbbb2",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "",
"rules": [
{
"t": "set",
"p": "P2EnergyUS",
"pt": "flow",
"to": "payload",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 960,
"y": 660,
"wires": [
[]
]
},
{
"id": "640078d7ffe56f56",
"type": "change",
"z": "f2a7ed7a11eeae6c",
"name": "Extract Lat",
"rules": [
{
"t": "set",
"p": "lat",
"pt": "msg",
"to": "msg.payload[0].lat",
"tot": "jsonata"
},
{
"t": "set",
"p": "lon",
"pt": "msg",
"to": "msg.payload[0].lon",
"tot": "jsonata"
}
],
"x": 550,
"y": 660,
"wires": [
[
"d1823e6bac5c9744"
]
]
},
{
"id": "61bb0e5a51004e6e",
"type": "inject",
"z": "f2a7ed7a11eeae6c",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 180,
"y": 980,
"wires": [
[
"9dda9064a3f05831"
]
]
},
{
"id": "9dda9064a3f05831",
"type": "http request",
"z": "f2a7ed7a11eeae6c",
"name": "",
"method": "GET",
"ret": "obj",
"paytoqs": "body",
"url": "https://api.openei.org/utility_rates?version=6&country=USA&api_key=AlEx3fwVfqY03hRVybzYfeNd6Cuu81lyZxyegsO3",
"tls": "",
"persist": false,
"proxy": "",
"insecureHTTPParser": false,
"authType": "",
"senderr": false,
"headers": [],
"x": 450,
"y": 980,
"wires": [
[
"c2d5a2268a0ec6e2"
]
]
},
{
"id": "c2d5a2268a0ec6e2",
"type": "debug",
"z": "f2a7ed7a11eeae6c",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 730,
"y": 980,
"wires": []
},
{
"id": "fa57280a63aa8902",
"type": "Datahub Subscribe",
"z": "206292fe7131ded2",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "digitaltwins_CBM_WO_scrap",
"x": 140,
"y": 200,
"wires": [
[
"7f22923acb525651"
]
]
},
{
"id": "7f22923acb525651",
"type": "json",
"z": "206292fe7131ded2",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 390,
"y": 200,
"wires": [
[
"764c676522a8b63e"
]
]
},
{
"id": "764c676522a8b63e",
"type": "MSSQL",
"z": "206292fe7131ded2",
"mssqlCN": "a51e405c.10f64",
"name": "",
"outField": "payload",
"returnType": "1",
"throwErrors": "0",
"query": "SELECT\r\n line, plant, asset,\r\n COUNT(*) AS occurences\r\n \r\nFROM {{{payload.database}}}.dbo.{{{payload.table}}} \r\n\r\nWHERE \r\nscrapTime >= DATEADD(minute, -{{{payload.window_mins}}}, GETDATE())\r\n\r\nGROUP BY\r\n plant, line, asset\r\n\r\nHAVING \r\n COUNT (*) > {{{payload.occurence_limit}}} ",
"modeOpt": "",
"modeOptType": "query",
"queryOpt": "",
"queryOptType": "editor",
"paramsOpt": "",
"paramsOptType": "editor",
"rows": "",
"rowsType": "msg",
"parseMustache": true,
"params": [],
"x": 560,
"y": 200,
"wires": [
[
"7bc5ec8ad42502b6"
]
]
},
{
"id": "7bc5ec8ad42502b6",
"type": "change",
"z": "206292fe7131ded2",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.recordset",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 780,
"y": 200,
"wires": [
[
"f88454901c829498"
]
]
},
{
"id": "56aaf651cab0c0c3",
"type": "function",
"z": "206292fe7131ded2",
"name": "",
"func": "//extract the data from downtime History\nvar occurences = msg.payload.occurences;\nvar WO_Date = new Date();\nvar WO_Type = \"Inspect\";\nvar Assigned_To = \"Quality\";\nvar plant = msg.payload.plant;\nvar asset = msg.payload.asset;\nvar line = msg.payload.line;\nvar Task_Description = \"This asset had \" + occurences + \" scrap pieces produced over the observed period. Please inspect equipment for root cause.\";\nvar Priority;\nif (occurences >= flow.get(\"scrap_high\")) {\n Priority = \"High\";\n} else if (occurences >= flow.get(\"scrap_medium\")) {\n Priority = \"Medium\";\n} else {\n Priority = \"Low\";\n}\nvar counter = flow.get (\"counter\") || 0 //if there is no stored value, then the value is 0\ncounter ++ //add 1 to the counter value\nflow.set(\"counter\", counter) //save the counter value in the flow variable\nlet WO_Number = \"WO-\" + counter; //set the WO Number\n\n var obj = {};\n obj.WO_Number = WO_Number;\n obj.WO_Date = WO_Date;\n obj.WO_Type = WO_Type;\n obj.Assigned_To = Assigned_To;\n obj.WO_Type = WO_Type;\n obj.plant = plant;\n obj.asset = asset.substring(0, 9);\n obj.line = line;\n obj.Task_Description = Task_Description;\n obj.Priority = Priority;\n \n msg.payload = obj;\n\n\n\nreturn msg;",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1120,
"y": 200,
"wires": [
[
"5ace50ba54213217",
"55dd6efd2f201546"
]
]
},
{
"id": "5ace50ba54213217",
"type": "json",
"z": "206292fe7131ded2",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 1290,
"y": 200,
"wires": [
[
"2e1483d5bf88c17a"
]
]
},
{
"id": "f88454901c829498",
"type": "split",
"z": "206292fe7131ded2",
"name": "",
"splt": "\\n",
"spltType": "str",
"arraySplt": 1,
"arraySpltType": "len",
"stream": false,
"addname": "",
"x": 950,
"y": 200,
"wires": [
[
"56aaf651cab0c0c3",
"cab35a9f1910d98c"
]
]
},
{
"id": "06de5124c4b224a2",
"type": "Datahub Subscribe",
"z": "206292fe7131ded2",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "digitaltwins_CBM_WO_downtime",
"x": 150,
"y": 100,
"wires": [
[
"306603f643e2f5a1"
]
]
},
{
"id": "306603f643e2f5a1",
"type": "json",
"z": "206292fe7131ded2",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 390,
"y": 100,
"wires": [
[
"ccd882dc5f7111c6"
]
]
},
{
"id": "ccd882dc5f7111c6",
"type": "MSSQL",
"z": "206292fe7131ded2",
"mssqlCN": "a51e405c.10f64",
"name": "",
"outField": "payload",
"returnType": "1",
"throwErrors": "0",
"query": "SELECT * \n\nFROM {{{payload.database}}}.dbo.{{{payload.table}}} \n\nWHERE duration >= '{{{payload.duration}}}' \nAND endTime >= DATEADD(minute, -{{{payload.window_mins}}}, GETDATE());",
"modeOpt": "",
"modeOptType": "query",
"queryOpt": "",
"queryOptType": "editor",
"paramsOpt": "",
"paramsOptType": "editor",
"rows": "",
"rowsType": "msg",
"params": [],
"x": 560,
"y": 100,
"wires": [
[
"8d01696a68ebefa6",
"ab12abd7de580b4d"
]
]
},
{
"id": "8d01696a68ebefa6",
"type": "change",
"z": "206292fe7131ded2",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.recordset",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 760,
"y": 100,
"wires": [
[
"65d1c631239e1242"
]
]
},
{
"id": "28b30d673e43d46e",
"type": "function",
"z": "206292fe7131ded2",
"name": "",
"func": "//extract the data from downtime History\nvar WO_Date = msg.payload.endTime;\nvar Assigned_To = \"Maintenance\";\nvar WO_Type = \"Inspect\";\nvar plant = msg.payload.plant;\nvar line = msg.payload.line;\nvar asset = msg.payload.asset;\nvar duration = msg.payload.duration;\nvar Task_Description = \"Asset was down for \" + duration + \" seconds. Please inspect equipment to find root case.\"\nvar Priority;\nif (duration >= flow.get(\"downtime_high\")) {\n Priority = \"High\";\n} else if (duration >= flow.get(\"downtime_medium\")) {\n Priority = \"Medium\";\n} else {\n Priority = \"Low\";\n}\n\nvar counter = flow.get (\"counter\") || 0 //if there is no stored value, then the value is 0\ncounter ++ //add 1 to the counter value\nflow.set(\"counter\", counter) //save the counter value in the flow variable\nlet WO_Number = \"WO-\" + counter; //set the WO Number\n\n var obj = {};\n obj.WO_Number = WO_Number;\n obj.WO_Date = WO_Date;\n obj.Assigned_To = Assigned_To;\n obj.WO_Type = WO_Type;\n obj.plant = plant;\n obj.line = line;\n obj.asset = asset.substring(0, 9);\n obj.Task_Description = Task_Description;\n obj.Priority = Priority;\n \n msg.payload = obj;\n\n\n\nreturn msg;",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1120,
"y": 100,
"wires": [
[
"4d408e04b8263b3d",
"8bc244834a684295"
]
]
},
{
"id": "4d408e04b8263b3d",
"type": "json",
"z": "206292fe7131ded2",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 1290,
"y": 100,
"wires": [
[
"2e1483d5bf88c17a"
]
]
},
{
"id": "65d1c631239e1242",
"type": "split",
"z": "206292fe7131ded2",
"name": "",
"splt": "\\n",
"spltType": "str",
"arraySplt": 1,
"arraySpltType": "len",
"stream": false,
"addname": "",
"x": 930,
"y": 100,
"wires": [
[
"28b30d673e43d46e",
"cab35a9f1910d98c"
]
]
},
{
"id": "2e1483d5bf88c17a",
"type": "Datahub Publish",
"z": "206292fe7131ded2",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "WorkOrderRecord",
"x": 1530,
"y": 160,
"wires": []
},
{
"id": "0838135bc3b46cc8",
"type": "inject",
"z": "206292fe7131ded2",
"name": "",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "00 12 * * 6",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 150,
"y": 520,
"wires": [
[
"f66cb1903b2b4788"
]
]
},
{
"id": "f66cb1903b2b4788",
"type": "function",
"z": "206292fe7131ded2",
"name": "Zero WO_Number",
"func": "flow.set(\"counter\", 0);\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 370,
"y": 520,
"wires": [
[]
]
},
{
"id": "8bc244834a684295",
"type": "debug",
"z": "206292fe7131ded2",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1250,
"y": 20,
"wires": []
},
{
"id": "cab35a9f1910d98c",
"type": "debug",
"z": "206292fe7131ded2",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1030,
"y": 20,
"wires": []
},
{
"id": "ab12abd7de580b4d",
"type": "debug",
"z": "206292fe7131ded2",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 670,
"y": 20,
"wires": []
},
{
"id": "75354ffcccf2082f",
"type": "Datahub Subscribe",
"z": "206292fe7131ded2",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "digitaltwins_CBM_WO_anomaly",
"x": 150,
"y": 280,
"wires": [
[
"f48cc27b0d073287"
]
]
},
{
"id": "f48cc27b0d073287",
"type": "json",
"z": "206292fe7131ded2",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 390,
"y": 280,
"wires": [
[
"b1a97d107783eed6"
]
]
},
{
"id": "b1a97d107783eed6",
"type": "MSSQL",
"z": "206292fe7131ded2",
"mssqlCN": "a51e405c.10f64",
"name": "",
"outField": "payload",
"returnType": "1",
"throwErrors": "0",
"query": "SELECT\r\n line, plant, asset,\r\n COUNT(*) AS occurences\r\n \r\nFROM {{{payload.database}}}.dbo.{{{payload.table}}} \r\n\r\nWHERE \r\ntime >= DATEADD(minute, -{{{payload.window_mins}}}, GETDATE())\r\n\r\nGROUP BY\r\n plant, line, asset\r\n\r\nHAVING \r\n COUNT (*) > {{{payload.occurence_limit}}} ",
"modeOpt": "",
"modeOptType": "query",
"queryOpt": "",
"queryOptType": "editor",
"paramsOpt": "",
"paramsOptType": "editor",
"rows": "",
"rowsType": "msg",
"params": [],
"x": 560,
"y": 280,
"wires": [
[
"77adb7aad5bf9118"
]
]
},
{
"id": "77adb7aad5bf9118",
"type": "change",
"z": "206292fe7131ded2",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload.recordset",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 780,
"y": 280,
"wires": [
[
"702dd935c06f0b09"
]
]
},
{
"id": "734f8281b96e4e9a",
"type": "json",
"z": "206292fe7131ded2",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 1290,
"y": 280,
"wires": [
[
"2e1483d5bf88c17a"
]
]
},
{
"id": "702dd935c06f0b09",
"type": "split",
"z": "206292fe7131ded2",
"name": "",
"splt": "\\n",
"spltType": "str",
"arraySplt": 1,
"arraySpltType": "len",
"stream": false,
"addname": "",
"x": 950,
"y": 280,
"wires": [
[
"6aee46b8335e22f7",
"cab35a9f1910d98c"
]
]
},
{
"id": "6aee46b8335e22f7",
"type": "function",
"z": "206292fe7131ded2",
"name": "",
"func": "//extract the data from downtime History\nvar occurences = msg.payload.occurences;\nvar WO_Date = new Date();\nvar WO_Type = \"Inspect\";\nvar Assigned_To = \"Quality\";\nvar plant = msg.payload.plant;\nvar asset = msg.payload.asset;\nvar line = msg.payload.line;\nvar Task_Description = \"This asset produced \" + occurences + \" pieces out that we out of spec. Please inspect equipment for root cause.\";\nvar Priority;\nif (occurences >= flow.get(\"anomaly_high\")) {\n Priority = \"High\";\n} else if (occurences >= flow.get(\"anomaly_medium\")) {\n Priority = \"Medium\";\n} else {\n Priority = \"Low\";\n}\n\nvar counter = flow.get (\"counter\") || 0 //if there is no stored value, then the value is 0\ncounter ++ //add 1 to the counter value\nflow.set(\"counter\", counter) //save the counter value in the flow variable\nlet WO_Number = \"WO-\" + counter; //set the WO Number\n\n var obj = {};\n obj.WO_Number = WO_Number;\n obj.WO_Date = WO_Date;\n obj.WO_Type = WO_Type;\n obj.Assigned_To = Assigned_To;\n obj.WO_Type = WO_Type;\n obj.plant = plant;\n obj.asset = asset.substring(0, 9);\n obj.line = line;\n obj.Task_Description = Task_Description;\n obj.Priority = Priority;\n msg.payload = obj;\n\n\n\nreturn msg;",
"outputs": 1,
"timeout": "",
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1120,
"y": 280,
"wires": [
[
"734f8281b96e4e9a",
"41281e9c49652484"
]
]
},
{
"id": "55dd6efd2f201546",
"type": "debug",
"z": "206292fe7131ded2",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1330,
"y": 340,
"wires": []
},
{
"id": "09944219bdb0ad06",
"type": "Datahub Subscribe",
"z": "206292fe7131ded2",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "*",
"x": 90,
"y": 420,
"wires": [
[
"3c6ddf66edf40a54"
]
]
},
{
"id": "dbbdf1e7baa9caae",
"type": "switch",
"z": "206292fe7131ded2",
"name": "",
"property": "subjectOutput",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "digitaltwins_CBM_WO_downtime",
"vt": "str"
},
{
"t": "cont",
"v": "digitaltwins_CBM_WO_anomaly",
"vt": "str"
},
{
"t": "cont",
"v": "digitaltwins_CBM_WO_scrap",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 3,
"x": 556.8958129882812,
"y": 415.55560302734375,
"wires": [
[
"3855ac227d8bf0fa"
],
[
"aeeaf6e508640bcf"
],
[
"34e0e9e9ca201710"
]
]
},
{
"id": "3c6ddf66edf40a54",
"type": "json",
"z": "206292fe7131ded2",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 310,
"y": 420,
"wires": [
[
"dbbdf1e7baa9caae"
]
]
},
{
"id": "3855ac227d8bf0fa",
"type": "function",
"z": "206292fe7131ded2",
"name": "",
"func": "var high = Number(msg.payload.high_priority_limit);\nvar medium = Number(msg.payload.medium_priority_limit);\nflow.set(\"downtime_high\", high)\nflow.set(\"downtime_medium\", medium)\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 760,
"y": 380,
"wires": [
[]
]
},
{
"id": "aeeaf6e508640bcf",
"type": "function",
"z": "206292fe7131ded2",
"name": "",
"func": "var high = Number(msg.payload.high_priority_limit);\nvar medium = Number(msg.payload.medium_priority_limit);\nflow.set(\"anomaly_high\", high)\nflow.set(\"anomaly_medium\", medium)\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 760,
"y": 420,
"wires": [
[]
]
},
{
"id": "34e0e9e9ca201710",
"type": "function",
"z": "206292fe7131ded2",
"name": "",
"func": "var high = Number(msg.payload.high_priority_limit);\nvar medium = Number(msg.payload.medium_priority_limit);\nflow.set(\"scrap_high\", high)\nflow.set(\"scrap_medium\", medium)\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 760,
"y": 460,
"wires": [
[]
]
},
{
"id": "41281e9c49652484",
"type": "debug",
"z": "206292fe7131ded2",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1330,
"y": 400,
"wires": []
},
{
"id": "f0084a0d100d744d",
"type": "MSSQL",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"mssqlCN": "a51e405c.10f64",
"name": "MSSQL_CBM",
"outField": "payload",
"returnType": 0,
"throwErrors": 1,
"query": "",
"modeOpt": "",
"modeOptType": "query",
"queryOpt": "payload",
"queryOptType": "msg",
"paramsOpt": "queryParams",
"paramsOptType": "none",
"rows": "rows",
"rowsType": "msg",
"parseMustache": true,
"params": [],
"x": 1360,
"y": 180,
"wires": [
[
"cf8d51bf3cddbac3",
"33ec54f808a744a2"
]
]
},
{
"id": "9483a53f5a24800d",
"type": "template",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "MSSQL template",
"field": "payload",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "",
"output": "str",
"x": 1130,
"y": 180,
"wires": [
[
"f0084a0d100d744d",
"3f84b97fd164acbe"
]
]
},
{
"id": "cf8d51bf3cddbac3",
"type": "function",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "CBM Rule Output",
"func": "dt_obj = msg.dt\n\ntarget = dt_obj.target\noperator = dt_obj.condition\neval_value = msg.payload[0].TotalHours\n\ncbm_rule_obj = {}\n\nif (eval(`eval_value ${operator} target`)) {\n action = \"Make SAP Work Order\"\n } else {\n action = \"Do nothing\"\n }\n\ncbm_rule_obj.action = action\ncbm_rule_obj.rule = msg.dt\ncbm_rule_obj.time = new Date()\n\nmsg.payload = cbm_rule_obj\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1570,
"y": 240,
"wires": [
[
"4e1743be00869bb8"
]
]
},
{
"id": "ebd9a00145751dea",
"type": "influxdb in",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"influxdb": "50dd4eba8ec312ce",
"name": "InfluxDB",
"query": "",
"rawOutput": false,
"precision": "",
"retentionPolicy": "",
"org": "organisation",
"x": 1340,
"y": 240,
"wires": [
[
"cf8d51bf3cddbac3"
]
]
},
{
"id": "0deaadc52a3f2e0a",
"type": "template",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "InfluxDB template",
"field": "query",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "",
"output": "str",
"x": 1130,
"y": 240,
"wires": [
[
"ebd9a00145751dea"
]
]
},
{
"id": "4dbfe0c77670d8bc",
"type": "switch",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "Data Source",
"property": "dt.server",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "MSSQL",
"vt": "str"
},
{
"t": "cont",
"v": "influx",
"vt": "str"
},
{
"t": "cont",
"v": "mysql",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 3,
"x": 910,
"y": 240,
"wires": [
[
"9483a53f5a24800d"
],
[
"0deaadc52a3f2e0a"
],
[
"de8a323d17d70ca1"
]
]
},
{
"id": "bfe69d07953473c2",
"type": "mysql",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"mydb": "bae6871353da5237",
"name": "MySQL_CBM",
"x": 1360,
"y": 300,
"wires": [
[
"cf8d51bf3cddbac3"
]
]
},
{
"id": "de8a323d17d70ca1",
"type": "template",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "MySQL template",
"field": "topic",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "",
"output": "str",
"x": 1130,
"y": 300,
"wires": [
[
"bfe69d07953473c2"
]
]
},
{
"id": "208304af1d5d1fb6",
"type": "function",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "template",
"func": "msg.template = msg.payload.query\nmsg.dt = msg.payload\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 760,
"y": 240,
"wires": [
[
"4dbfe0c77670d8bc"
]
]
},
{
"id": "d8961aed3cde1fbd",
"type": "switch",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "Filter Rule",
"property": "subjectOutput",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "digitaltwins",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 590,
"y": 240,
"wires": [
[
"208304af1d5d1fb6"
]
]
},
{
"id": "a18bad4b61c2079b",
"type": "json",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 430,
"y": 240,
"wires": [
[
"d8961aed3cde1fbd"
]
]
},
{
"id": "541278bcc620a54c",
"type": "Datahub Subscribe",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "Rule",
"natc": "2625f216e9b28a20",
"topicname": ">",
"x": 120,
"y": 240,
"wires": [
[
"fa53c1b01e6c090e"
]
]
},
{
"id": "89b424edc1a46a59",
"type": "Datahub Publish",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "SAP_lastMaintenance",
"x": 980,
"y": 60,
"wires": []
},
{
"id": "ab69e67946c96482",
"type": "json",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 750,
"y": 60,
"wires": [
[
"89b424edc1a46a59"
]
]
},
{
"id": "426416ad846c7574",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"props": [
{
"p": "payload.value",
"v": "1689021243970",
"vt": "num"
}
],
"repeat": "2",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 550,
"y": 60,
"wires": [
[
"ab69e67946c96482"
]
]
},
{
"id": "426040301f9d3df3",
"type": "Datahub Publish",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "CBM_output",
"x": 1890,
"y": 240,
"wires": []
},
{
"id": "4e1743be00869bb8",
"type": "json",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 1730,
"y": 240,
"wires": [
[
"426040301f9d3df3"
]
]
},
{
"id": "1e93ba93c309522a",
"type": "influxdb in",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"influxdb": "50dd4eba8ec312ce",
"name": "",
"query": "",
"rawOutput": false,
"precision": "",
"retentionPolicy": "",
"org": "organisation",
"x": 1250,
"y": 820,
"wires": [
[
"7554ba908ca19887"
]
]
},
{
"id": "74ab7b04a4e7aa38",
"type": "Datahub Subscribe",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.L1_Machine1_1_OPC.Temperature",
"x": 350,
"y": 740,
"wires": [
[
"caeca94050bdf06c"
]
]
},
{
"id": "3b932782560723d9",
"type": "Datahub Subscribe",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.L1_Machine1_1_OPC.isRunning",
"x": 360,
"y": 800,
"wires": [
[
"caeca94050bdf06c"
]
]
},
{
"id": "caeca94050bdf06c",
"type": "json",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 670,
"y": 760,
"wires": [
[
"f9b79c7a00cda2a0"
]
]
},
{
"id": "f9b79c7a00cda2a0",
"type": "join",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"mode": "custom",
"build": "object",
"property": "payload",
"propertyType": "msg",
"key": "payload.tagName",
"joiner": "\\n",
"joinerType": "str",
"accumulate": false,
"timeout": "1",
"count": "2",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 780,
"y": 760,
"wires": [
[
"e96039e8a74f8c38"
]
]
},
{
"id": "e96039e8a74f8c38",
"type": "function",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"func": "obj = msg.payload.Temperature;\n\nif(msg.payload.isRunning.value == 1){\n status = \"ON\"\n} else {\n status = \"OFF\"\n}\n\nobj.state = status;\n\n// // Assuming you have the UNIX timestamp in milliseconds\n// const unixTimestamp = obj.timestamp; // Replace with your UNIX timestamp\n\n// // Convert UNIX timestamp to JavaScript Date object\n// const dateObject = new Date(unixTimestamp);\n\n// // Format the Date object as a string in the expected format for SQL Server\n// const formattedDate = dateObject.toISOString().slice(0, 19).replace(\"T\", \" \");\n\n// obj.timestamp = formattedDate;\n\ndelete obj.metadata\n\nmsg.payload = obj;\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 1060,
"y": 760,
"wires": [
[
"fc0baedc30a8cdaa"
]
]
},
{
"id": "1d08302769e3bfa9",
"type": "influxdb out",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"influxdb": "50dd4eba8ec312ce",
"name": "",
"measurement": "litmusDB_temp_influx",
"precision": "",
"retentionPolicy": "",
"database": "database",
"precisionV18FluxV20": "ms",
"retentionPolicyV18Flux": "",
"org": "organisation",
"bucket": "bucket",
"x": 1500,
"y": 760,
"wires": []
},
{
"id": "5155ac709ea90e98",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 740,
"y": 820,
"wires": [
[
"9ac529b17645ed25"
]
]
},
{
"id": "9ac529b17645ed25",
"type": "function",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "DELETE FROM influx_CBM_DB",
"func": "msg.query = \"DELETE FROM influx_CBM_DB\"\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 970,
"y": 820,
"wires": [
[
"1e93ba93c309522a"
]
]
},
{
"id": "7554ba908ca19887",
"type": "debug",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1430,
"y": 820,
"wires": []
},
{
"id": "5db9682c7bdc4ba4",
"type": "MSSQL",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"mssqlCN": "a51e405c.10f64",
"name": "MSSQL_CBM",
"outField": "payload",
"returnType": 0,
"throwErrors": 1,
"query": "",
"modeOpt": "",
"modeOptType": "query",
"queryOpt": "payload",
"queryOptType": "msg",
"paramsOpt": "queryParams",
"paramsOptType": "none",
"rows": "rows",
"rowsType": "msg",
"params": [],
"x": 1540,
"y": 520,
"wires": [
[
"f70595d196605113"
]
]
},
{
"id": "531a1f859d94917e",
"type": "template",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "MSSQL_CBM_DB",
"field": "payload",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "INSERT INTO\n MSSQL_CBM_DB\n (\n timestamp,\n success,\n datatype,\n registerId,\n value,\n deviceID,\n tagName,\n deviceName,\n state\n ) \nVALUES\n (\n '{{payload.timestamp}}',\n '{{payload.success}}',\n '{{payload.datatype}}',\n '{{payload.registerId}}',\n '{{payload.value}}',\n '{{payload.deviceID}}',\n '{{payload.tagName}}',\n '{{payload.deviceName}}',\n '{{payload.state}}'\n );\n ",
"output": "str",
"x": 1070,
"y": 520,
"wires": [
[
"faaae58d18e2d8fd"
]
]
},
{
"id": "d6719ae8d0b54fef",
"type": "json",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 630,
"y": 520,
"wires": [
[
"a917b0f50ddd67fd"
]
]
},
{
"id": "f70595d196605113",
"type": "debug",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 1050,
"y": 440,
"wires": []
},
{
"id": "839930253bdd071d",
"type": "function",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"func": "obj = msg.payload.Temperature;\n\nif(msg.payload.isRunning.value == 1){\n status = \"ON\"\n} else {\n status = \"OFF\"\n}\n\nobj.state = status;\n\n// // Assuming you have the UNIX timestamp in milliseconds\n// const unixTimestamp = obj.timestamp; // Replace with your UNIX timestamp\n\n// // Convert UNIX timestamp to JavaScript Date object\n// const dateObject = new Date(unixTimestamp);\n\n// // Format the Date object as a string in the expected format for SQL Server\n// const formattedDate = dateObject.toISOString().slice(0, 19).replace(\"T\", \" \");\n\n// obj.timestamp = formattedDate;\n\n\nmsg.payload = obj;\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 880,
"y": 520,
"wires": [
[
"531a1f859d94917e"
]
]
},
{
"id": "a917b0f50ddd67fd",
"type": "join",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"mode": "custom",
"build": "object",
"property": "payload",
"propertyType": "msg",
"key": "payload.tagName",
"joiner": "\\n",
"joinerType": "str",
"accumulate": false,
"timeout": "1",
"count": "2",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 740,
"y": 520,
"wires": [
[
"839930253bdd071d"
]
]
},
{
"id": "8e85b0ea74c35384",
"type": "mysql",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"mydb": "bae6871353da5237",
"name": "",
"x": 1570,
"y": 980,
"wires": [
[]
]
},
{
"id": "811868bb9f06ec3a",
"type": "function",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"func": "obj = msg.payload.Temperature;\n\nif(msg.payload.isRunning.value == 1){\n status = \"ON\"\n} else {\n status = \"OFF\"\n}\n\nobj.state = status;\n\n// // Assuming you have the UNIX timestamp in milliseconds\n// const unixTimestamp = obj.timestamp; // Replace with your UNIX timestamp\n\n// // Convert UNIX timestamp to JavaScript Date object\n// const dateObject = new Date(unixTimestamp);\n\n// // Format the Date object as a string in the expected format for SQL Server\n// const formattedDate = dateObject.toISOString().slice(0, 19).replace(\"T\", \" \");\n\n// obj.timestamp = formattedDate;\n\ndelete obj.metadata\n\nmsg.payload = obj;\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 920,
"y": 980,
"wires": [
[
"06b5471d82318f1e"
]
]
},
{
"id": "7e2642d156a8b5e3",
"type": "join",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"mode": "custom",
"build": "object",
"property": "payload",
"propertyType": "msg",
"key": "payload.tagName",
"joiner": "\\n",
"joinerType": "str",
"accumulate": false,
"timeout": "1",
"count": "2",
"reduceRight": false,
"reduceExp": "",
"reduceInit": "",
"reduceInitType": "",
"reduceFixup": "",
"x": 800,
"y": 980,
"wires": [
[
"811868bb9f06ec3a"
]
]
},
{
"id": "f222bfb36adcd1fb",
"type": "json",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 650,
"y": 980,
"wires": [
[
"7e2642d156a8b5e3"
]
]
},
{
"id": "fc985480570da008",
"type": "Datahub Subscribe",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.L1_Machine1_1_OPC.Temperature",
"x": 290,
"y": 940,
"wires": [
[
"f222bfb36adcd1fb"
]
]
},
{
"id": "abfedb6b68babf9c",
"type": "Datahub Subscribe",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.L1_Machine1_1_OPC.isRunning",
"x": 300,
"y": 1000,
"wires": [
[
"f222bfb36adcd1fb"
]
]
},
{
"id": "06b5471d82318f1e",
"type": "template",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "OPCUA Data to MySQL Table",
"field": "topic",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "INSERT INTO\n MySQL_CBM_DB\n (\n timestamp,\n success,\n datatype,\n registerId,\n value,\n deviceID,\n tagName,\n deviceName,\n state\n ) \nVALUES\n (\n '{{payload.timestamp}}',\n '{{payload.success}}',\n '{{payload.datatype}}',\n '{{payload.registerId}}',\n '{{payload.value}}',\n '{{payload.deviceID}}',\n '{{payload.tagName}}',\n '{{payload.deviceName}}',\n '{{payload.state}}'\n );\n ",
"output": "str",
"x": 1130,
"y": 980,
"wires": [
[
"bba7c28b301a7d50"
]
]
},
{
"id": "f11a8a8c3271b678",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "TIME NOW",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 550,
"y": 440,
"wires": [
[
"08c17e87ba6161f3"
]
]
},
{
"id": "08c17e87ba6161f3",
"type": "debug",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 730,
"y": 440,
"wires": []
},
{
"id": "faaae58d18e2d8fd",
"type": "gate",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "gate",
"controlTopic": "control",
"defaultState": "closed",
"openCmd": "open",
"closeCmd": "close",
"toggleCmd": "toggle",
"defaultCmd": "default",
"statusCmd": "status",
"persist": false,
"x": 1370,
"y": 520,
"wires": [
[
"5db9682c7bdc4ba4",
"f70595d196605113"
]
]
},
{
"id": "fc0baedc30a8cdaa",
"type": "gate",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "gate",
"controlTopic": "control",
"defaultState": "closed",
"openCmd": "open",
"closeCmd": "close",
"toggleCmd": "toggle",
"defaultCmd": "default",
"statusCmd": "status",
"persist": false,
"x": 1250,
"y": 760,
"wires": [
[
"1d08302769e3bfa9"
]
]
},
{
"id": "bba7c28b301a7d50",
"type": "gate",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "gate",
"controlTopic": "control",
"defaultState": "closed",
"openCmd": "open",
"closeCmd": "close",
"toggleCmd": "toggle",
"defaultCmd": "default",
"statusCmd": "status",
"persist": false,
"x": 1390,
"y": 980,
"wires": [
[
"8e85b0ea74c35384"
]
]
},
{
"id": "fa53c1b01e6c090e",
"type": "switch",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "json string",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "istype",
"v": "json",
"vt": "json"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 270,
"y": 240,
"wires": [
[
"a18bad4b61c2079b"
]
]
},
{
"id": "3f84b97fd164acbe",
"type": "debug",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1330,
"y": 120,
"wires": []
},
{
"id": "18e6652fde78e2cc",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 1140,
"y": 620,
"wires": [
[
"d736c843edddc158"
]
]
},
{
"id": "d736c843edddc158",
"type": "template",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "Delete Table",
"field": "payload",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "DROP TABLE MSSQL_CBM_DB; \n",
"output": "str",
"x": 1290,
"y": 620,
"wires": [
[
"5db9682c7bdc4ba4"
]
]
},
{
"id": "e7d8ffbcb8bf8119",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 1140,
"y": 580,
"wires": [
[
"29aaeafe0bc12306"
]
]
},
{
"id": "29aaeafe0bc12306",
"type": "template",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "Create Table",
"field": "payload",
"fieldType": "msg",
"format": "handlebars",
"syntax": "mustache",
"template": "CREATE TABLE MSSQL_CBM_DB(\n timestamp BIGINT,\n success BIT,\n datatype VARCHAR(255),\n registerId VARCHAR(255),\n value DECIMAL,\n deviceID VARCHAR(255),\n tagName VARCHAR(255),\n deviceName VARCHAR(255),\n state VARCHAR(255)\n);\n",
"output": "str",
"x": 1290,
"y": 580,
"wires": [
[
"5db9682c7bdc4ba4"
]
]
},
{
"id": "29e7173285ea6ebd",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "open",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "00 12 * * *",
"once": false,
"onceDelay": "600",
"topic": "control",
"payload": "open",
"payloadType": "str",
"x": 1250,
"y": 420,
"wires": [
[
"faaae58d18e2d8fd"
]
]
},
{
"id": "5b20b1be48fdf8ed",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "close",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "02 12 * * *",
"once": false,
"onceDelay": "720",
"topic": "control",
"payload": "close",
"payloadType": "str",
"x": 1250,
"y": 460,
"wires": [
[
"faaae58d18e2d8fd"
]
]
},
{
"id": "835c23d64f00c534",
"type": "inject",
"z": "2130e0063a8c5147",
"name": "open",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "00 12 * * *",
"once": false,
"onceDelay": "600",
"topic": "control",
"payload": "open",
"payloadType": "str",
"x": 1110,
"y": 680,
"wires": [
[
"fc0baedc30a8cdaa"
]
]
},
{
"id": "34c77222a64896ad",
"type": "inject",
"z": "2130e0063a8c5147",
"name": "close",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "02 12 * * *",
"once": false,
"onceDelay": "720",
"topic": "control",
"payload": "close",
"payloadType": "str",
"x": 1110,
"y": 720,
"wires": [
[
"fc0baedc30a8cdaa"
]
]
},
{
"id": "2e856578c9a660a9",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "CBM Up to Time",
"props": [
{
"p": "payload.value",
"v": "1700493944671",
"vt": "num"
}
],
"repeat": "2",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 510,
"y": 120,
"wires": [
[
"f6d1379a7984f9e9"
]
]
},
{
"id": "f6d1379a7984f9e9",
"type": "json",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 750,
"y": 120,
"wires": [
[
"99b7c1174819f311"
]
]
},
{
"id": "99b7c1174819f311",
"type": "Datahub Publish",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "UpperTimeLimit",
"x": 960,
"y": 120,
"wires": []
},
{
"id": "fedeb3ec247082dc",
"type": "Datahub Subscribe",
"z": "2130e0063a8c5147",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.P1_L1_Machine1_1_OPC.Temperature",
"x": 300,
"y": 500,
"wires": [
[
"d6719ae8d0b54fef"
]
]
},
{
"id": "312c3bab0ac61b13",
"type": "Datahub Subscribe",
"z": "2130e0063a8c5147",
"name": "",
"natc": "2625f216e9b28a20",
"topicname": "devicehub.alias.P1_L1_Machine1_1_OPC.isRunning",
"x": 310,
"y": 560,
"wires": [
[
"d6719ae8d0b54fef"
]
]
},
{
"id": "33ec54f808a744a2",
"type": "debug",
"z": "2130e0063a8c5147",
"g": "344a471357a84606",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1570,
"y": 120,
"wires": []
},
{
"id": "d68f20b29d16b31e",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "open",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "00 12 * * *",
"once": false,
"onceDelay": "600",
"topic": "control",
"payload": "open",
"payloadType": "str",
"x": 1250,
"y": 880,
"wires": [
[
"bba7c28b301a7d50"
]
]
},
{
"id": "97161e37eece7bf9",
"type": "inject",
"z": "2130e0063a8c5147",
"g": "0903542732afd60e",
"name": "close",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "02 12 * * *",
"once": false,
"onceDelay": "720",
"topic": "control",
"payload": "close",
"payloadType": "str",
"x": 1250,
"y": 920,
"wires": [
[
"bba7c28b301a7d50"
]
]
},
{
"id": "b2326de956a2823d",
"type": "Datahub Subscribe",
"z": "3d5ab96d4599cd0f",
"name": "Alerts",
"natc": "e7e26815.57718",
"topicname": "devicehub.alias.alert.>",
"x": 170,
"y": 120,
"wires": [
[
"2bfa179ee8bc4514"
]
]
},
{
"id": "10e80d8c48be77ed",
"type": "debug",
"z": "3d5ab96d4599cd0f",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 810,
"y": 120,
"wires": []
},
{
"id": "2bfa179ee8bc4514",
"type": "json",
"z": "3d5ab96d4599cd0f",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 310,
"y": 120,
"wires": [
[
"99b074417d7eb039"
]
]
},
{
"id": "99b074417d7eb039",
"type": "change",
"z": "3d5ab96d4599cd0f",
"name": "",
"rules": [
{
"t": "set",
"p": "payload.type",
"pt": "msg",
"to": "payload.metadata.Type",
"tot": "msg"
},
{
"t": "set",
"p": "payload.cycleID",
"pt": "msg",
"to": "$formatInteger($random() * 100, '0')\t",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 520,
"y": 120,
"wires": [
[
"10e80d8c48be77ed",
"38959415c4361e8d"
]
]
},
{
"id": "2e8038d3a4acdaa4",
"type": "Datahub Publish",
"z": "3d5ab96d4599cd0f",
"name": "",
"natc": "e7e26815.57718",
"topicname": "alert",
"x": 910,
"y": 200,
"wires": []
},
{
"id": "38959415c4361e8d",
"type": "json",
"z": "3d5ab96d4599cd0f",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 730,
"y": 200,
"wires": [
[
"2e8038d3a4acdaa4"
]
]
},
{
"id": "7504e25dbf304cc2",
"type": "Datahub Subscribe",
"z": "3d5ab96d4599cd0f",
"name": "State",
"natc": "e7e26815.57718",
"topicname": "devicehub.alias.state.>",
"x": 190,
"y": 300,
"wires": [
[
"93cd69715efca87f"
]
]
},
{
"id": "59a38e9fbe069b07",
"type": "debug",
"z": "3d5ab96d4599cd0f",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 830,
"y": 300,
"wires": []
},
{
"id": "93cd69715efca87f",
"type": "json",
"z": "3d5ab96d4599cd0f",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 330,
"y": 300,
"wires": [
[
"e9579390a72ec816"
]
]
},
{
"id": "e9579390a72ec816",
"type": "change",
"z": "3d5ab96d4599cd0f",
"name": "",
"rules": [
{
"t": "set",
"p": "payload.Level11",
"pt": "msg",
"to": "Down",
"tot": "str"
},
{
"t": "set",
"p": "payload.cycleID",
"pt": "msg",
"to": "$formatInteger($random() * 100, '0')\t",
"tot": "jsonata"
},
{
"t": "set",
"p": "payload.Level12",
"pt": "msg",
"to": "Machine",
"tot": "str"
},
{
"t": "set",
"p": "payload.Level13",
"pt": "msg",
"to": "Waiting Attention",
"tot": "str"
},
{
"t": "set",
"p": "payload.AuxMode",
"pt": "msg",
"to": "null",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 540,
"y": 300,
"wires": [
[
"59a38e9fbe069b07",
"0123626940beb300"
]
]
},
{
"id": "db77d399da0a9553",
"type": "Datahub Publish",
"z": "3d5ab96d4599cd0f",
"name": "",
"natc": "e7e26815.57718",
"topicname": "state",
"x": 930,
"y": 380,
"wires": []
},
{
"id": "0123626940beb300",
"type": "json",
"z": "3d5ab96d4599cd0f",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 750,
"y": 380,
"wires": [
[
"db77d399da0a9553"
]
]
},
{
"id": "6f3778945dae3bd8",
"type": "Datahub Subscribe",
"z": "ebdecfa2769805b1",
"name": "",
"natc": "e7e26815.57718",
"topicname": "digitaltwins_M1",
"x": 220,
"y": 120,
"wires": [
[
"2280a2ea6eb8695d"
]
]
},
{
"id": "2280a2ea6eb8695d",
"type": "debug",
"z": "ebdecfa2769805b1",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 610,
"y": 120,
"wires": []
},
{
"id": "b1ec1ab7b4cd930d",
"type": "Datahub Subscribe",
"z": "ebdecfa2769805b1",
"d": true,
"name": "",
"natc": "e7e26815.57718",
"topicname": "digitaltwins_dt1",
"x": 260,
"y": 240,
"wires": [
[
"bebbe7363d7bae7e"
]
]
},
{
"id": "bebbe7363d7bae7e",
"type": "json",
"z": "ebdecfa2769805b1",
"name": "",
"property": "payload",
"action": "",
"pretty": false,
"x": 470,
"y": 240,
"wires": [
[
"d4ebf1b5e4969112"
]
]
},
{
"id": "70579df08618c8ce",
"type": "debug",
"z": "ebdecfa2769805b1",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 890,
"y": 220,
"wires": []
},
{
"id": "d4ebf1b5e4969112",
"type": "function",
"z": "ebdecfa2769805b1",
"name": "",
"func": "var obj = msg.payload;\n\nvar date = obj.MachineData.timestamp.aaa;\n\nobj.MachineData.timestamp.aaa = new Date(date).toISOString().slice(0, 19).replace('T', ' ');\n\nmsg.payload = obj;\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 680,
"y": 220,
"wires": [
[
"70579df08618c8ce"
]
]
},
{
"id": "2a0c6a9af6e055de",
"type": "inject",
"z": "b58a87045c486f7c",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 140,
"y": 60,
"wires": [
[
"f3b4307f3419edb9",
"1e3818116de2bccf"
]
]
},
{
"id": "f3b4307f3419edb9",
"type": "MSSQL",
"z": "b58a87045c486f7c",
"mssqlCN": "a51e405c.10f64",
"name": "",
"outField": "payload",
"returnType": "1",
"throwErrors": "0",
"query": "SELECT WO_Date FROM litmus.dbo.ScheduledWorkOrders ",
"modeOpt": "",
"modeOptType": "query",
"queryOpt": "",
"queryOptType": "editor",
"paramsOpt": "",
"paramsOptType": "editor",
"rows": "",
"rowsType": "msg",
"params": [],
"x": 400,
"y": 120,
"wires": [
[
"e2cfe62e1a1fa00f",
"a9921f26a20bbc12"
]
]
},
{
"id": "e2cfe62e1a1fa00f",
"type": "function",
"z": "b58a87045c486f7c",
"name": "",
"func": "//let currentDate = new Date();\n//let woDate = new Date(msg.payload.WO_Date);\n//var d = new Date(\"2023-01-19T00:00:00.000Z\");\n//let timeDifference = Math.abs(currentDate - woDate);\n//let timeDifference = Math.abs(currentDate - d);\n//msg.payload.Due = timeDifference;\n//return msg;\n\nfor(let i = 0; i < msg.payload.length; i++) {\n // Get the current row\n const woDate = msg.payload.WO_Date;\n\n \n const date = new Date(row.WO_Date);\n\n \n const now = new Date();\n const diffInMilliseconds = now - date;\n\n // Add the difference to the row\n row.date_difference = diffInMilliseconds;\n}\n\n\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 620,
"y": 120,
"wires": [
[
"ff4bdb0d75dcbc0a"
]
]
},
{
"id": "ff4bdb0d75dcbc0a",
"type": "debug",
"z": "b58a87045c486f7c",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 870,
"y": 120,
"wires": []
},
{
"id": "a9921f26a20bbc12",
"type": "debug",
"z": "b58a87045c486f7c",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 630,
"y": 220,
"wires": []
},
{
"id": "1e3818116de2bccf",
"type": "function",
"z": "b58a87045c486f7c",
"name": "",
"func": "var currentDate = new Date();\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 600,
"y": 60,
"wires": [
[
"caa917027be62207"
]
]
},
{
"id": "caa917027be62207",
"type": "debug",
"z": "b58a87045c486f7c",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 850,
"y": 60,
"wires": []
}
]
Download Flow Logs Binary
GET {{edgeUrl}}/flows-manager/flows/{{flow_id}}/logs
Download Flow Logs Binary
Returns the flow's log directory as a ZIP archive suitable for attaching to a support ticket or for offline log analysis. The response is binary -- in Postman, use Send and Download to save the body to disk.
Endpoint
GET {{edgeUrl}}/flows-manager/flows/{{flow_id}}/logs
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID to download logs for. |
No request body.
Response
200 OK -- application/zip with Content-Disposition: attachment. The archive contains the contents of the flow's log directory at the moment of the call. To clear the logs on the device after downloading, follow with Delete Flows Logs.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 200 OK
PK m�([ logUT �3�h��o]���=���(Kw��看��Иz�$��P0�i�*fJ"����7�D]Ŧc�9�G��`f��4��"����ks��7����������zu�����..�~�y{��pww�\]_n��G�Ǐ������\��\l�x������ċ�������p�9�ۼ|���O�_�����˗�.?�\��������כ�=l�_m���{��������W_�믿����կ^L��������p��/����_������ۻ����|��M����;��ns{w}s�l���_^��{}��Ϳ���x����^_���~u��p��ۻÛ��\�v{��\\���o���o^�������o^���~{�����?����?�˗�{yqvw���_o�8���\\ޞ}��p��o�w�7�����������p5����������
��8us��l��Ϗ������ۋ��^_=��WW�7y{���.Ww�g�o7W�w�W�����p�������O��wWW�ﲳ��k��Ҽ�ؾؾ������o��?��[��9���;��\�|=}��w��fsy�������>}?���ݻ����w����˫����b�1�9�<�c����l����v�b�m7�Wg��t'J.�����������ٟ�����pu��������������o������ׇ�W<\�}�����p�ysxs��~}8������p~w�x�1�L�o^�t��������z��_��<\�}��q���m{����s��=ܝ~�/~y��/��og�����7�w?���_���?��/�n��_��~��͋/���_����O�?}{�9l�=l���͟�n�ߓgw��_���������<~�sv{�sv�
͢��<�כ���ߜ__]��6_}�/��Ͽ����7_�jc�_���wj�v�ɘ"��ޠ1��W�Ώߎ�W�v~v~��:�0���7������)_�]���pv�y{s��pswy�=�����ë˫����z�r��������t���=�갻h�q�q�ڲC}�C��j�ujO�o�~�Q�>w�a.���>���I�Ǹԏ'm���~<��ٗ����ϵȏ'���g�x���x��?�ǓO�����_}��~<��a�~<�����<y����~<i���������'b����~ˌqf"�Ȉ62���h�ED�-"Zmь�ь�ќ�т-т-ђ-ъ�ъmLj�cD�1�5F�ƈ�A1DPC�A1DP �v���~��ݏAD��~"@�1 AD��8 ��1�h � Dp?
����� �Dp��D4��c "����q@�c� "8���~"C��1D`C��1D`C��1D`C��1D`C��1D`C�ۧ#c�$G������������O������O��s_^�n���������66��7�/������뛻�e��m��N��Ͼ|�����/�g���I�wן,~��7_l��~��bʭ}��_����pu~���6�͔^|w{���۳���$箮/�q�}�����������������žx{}����o�C��}��q}��~��s�3?Κ�İ������w/������������>$v�����v�����߳����ݧ[6�}x�c��~�qo�;����?w��B�����_���/�|N��[~��oo����/���{y���u���������_^�n��^�|��/��n��?�����p�omo��������������������?���m6�7����:{����� ��LJ�U�"�|M��U��f�~���9���/��/��U3����+}�>C������ݜ���=\���̯���8*}���ф�[��y��~�ϱ���r���N��.��?�N~`���?|ƫß6�zs��������svu}��7��n�����f�����'y��^�|8��^����勛����Ww7��|1M����w�/oo�����s�0������Ơ���������8��>�yw�χ?�Mv�cf����<��ys��<�;��'��|s���g�~��o���q_����_��o{S�������l�f�����o�34�EL�'��B�@��j��~ ����va�ֆ8.������~�<Z-���]���p:������/��?}����㼶��m����y`D�F��mdDѦ�(2�ͷ�hƈf�hƈ�hΈ�h���h����hɈ��hňV�hE�Vm�ÿ�����Y��}�����g��?|����E�?WnV��E��}��,����;������;���Ⴟ�軻���Y�ݥ����l��;��X��7��g���,?�w��g�鿳���=�;��66���~O��;3&�1ňV�hň�cD�1���#ZcDk�h#���60���h##ڈ��[D��"���ь�ќ�ќ-т-�"H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�b�������{�yL�?��lh����v����zss�}{}u{ؼ��~�>V��p������ F1�Qb�� F1�Qb�� F1�Q�����t?&�1m�e� �5F��m`D�FF��mD��w03c�m��f�hƈf�hΈ�hN�V'@:��u��ա�#�H�v"y�<Z-���ݳ���[���ɣ���hy�_��=��-c�_"3�ˌe�s����7��T�G�o�Z�k}2�%#Z2�#Z1�#ڎ���Lcш(�4����T�njAD#�(6��1cј(�1Qc�(�DQ���E1&�bLŘ(�1Qc��"0��!c��"0��!c��"0��!c��"0��!c��"0��!c��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!�`� "��!�`� "��!�P�S��E�W�S��Β��k����<Z����hy���h�\U-�^f{y�<�W�~x�X�\Uf,3^f{��̸W3~�s�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &��L%�(J2Q�d�(�DQ���$EI&��L%"H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "(�j����Ib����D4cDsF4gDsF�`DF�`DKF�dDKF�bD+F�bD�1���v�h��1�5F��m`D�FF��mD�]���h�D4��1�h�ԮʌAD#��UD�d�B�+٩dgW��G̑>W�Gˣ�����=+���U���hy�<z�v�{��[ƚ�2c���Xf<W����)�U}jW%�(�4y�'�(�D4"��S�*3����ԮʌAD#�(>��2cш(�O���D4"��S�*3���E1&�bLŘ(�1Qc�(�DQ���E1��!c��"0��!c��"0��!c��"0��!c��"0��!c��"0��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g� "��!�`� "��!�`� "P����l�d����%;?�vUy�<Z-���ݳ�h�\U-�^f{y�<�W�~x�X�\Uf,3^f{��̸W3~�s�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &��L%�(J2Q�d�(�DQ���$EI&��L%"H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "(��vUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙv�`�U�iW
�]5�v�`�U�iW
�]5�v�`�UCE$Jv.����Jvv��|��sUy�<Z-���ݳ�h�\U-��Gˣ�jG?�e�y�*3�ˌe�s����\5�v�`�U�iW
�]5�v�iL���o�1ΌAD�1���v�h��1�5F��m`D�FF��mDD�-"�m�lˈf�hƈf�hΈ�hΈ�h���hɈ��hC��1D`C��1D`C��1D`C��1D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C�A0DC�A0DC���H��\f{%;���,��Y��ʣ���hy�\힕G���hy�2�ˣ�ѽz��[ƺ�2c��2�ˌeƽ��Ӟ�E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�d�(�DQ���$EI&��L%�(J2Q�d�(�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DP��n��N��̘E;���*��AD[�>�Y�N� ��J�c��T�s���T���d��#v�*��Gˣ��~=��GS��hy�<Z��ףg�~x�X�\Uf,3�ˌ�z�l�Or��q�U�(�c���U�(ǬE9���j��U�(�c�V��|�j�t"ڪQ��cV����AD[5��q̪Q��1�h�FQ>�Y5�r:����ۮz:�m�vՏc�(ʺ���cј(ʺ���c�"X�]�t"C붫��ADc�`�v��1�h�ۮz:�!�u�UO� �1D�n���D4��mW=C��n���B�u�U?�a�`�v��1�h�ۮz:�!�u�UO� �1D�n���D4��mW=��������c�"X�]�t"C붫��ADc�`�v��19�?&��-3ƙ1�hƈf�hƈ�hΈ�hJv*ٹ��Jv*��Y��i�U���hy�<z��dz�h�\U-�^f{y�<�W�~x�X�\Uf,3^f{��̸W3~�s��>���`^�-ђ�ъ��v�h;F�#ZcDk�h�m`D�F��mdDc�(�DQ���$EI&��L%�(J2Q�d�(�DQ�!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"��]���h�D4��1�h�ԮʌAD#��TD�d�B�+٩dgW��G̑>W�Gˣ�����=+���U���hy�<z�v�{��[ƚ�2c���Xf<W����)�UmjW%�(�4y�'�(�D4"�bS�*3����ԮʌAD#�(6��2cш(�M���D4"�bS�*3���E1&�bLŘ(�1Qc�(�DQ���E1��!c��"0��!c��"0��!c��"0��!c��"0��!c��"0��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!�]vUc�U�iW5�]vUc�U�iW5�]vUS���m�d����%;?�vUy�<Z-���ݳ�h�\U-�^f{y�<�W�~x�X�\Uf,3^f{��̸W3~�sU�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]զv���o���nn��u{��_y���x~���\]on�o��n�W7�o�?x}� �����H]�1u��ԵS�jL]�1u��ԵS�jL]�1u��ԵNcj��ƌ f!Zm�j��V[F4cD3F4cDsF4gDsF�`DF�`DKF�dDKF�bD+F�bD�1���v�h��1�5F��m`Dc��"(�� �o "�Ƭ/�4� �i"A��D0�AD#���l���B�+*��hWQ�G̑��Gˣ�����=+���_���hy�<z�v�{��[ƚ��2c���Xf<W����)�_}�%�(�䵞���~KDQ�1�hD��["�2�AD#�(��Q�i"E�����Lcш(��De��FDQ|�%�(�D4&�bLŘ(�1Qc�(�DQ���E1&�bL�"0��!c��"0��!c��"0��!c��"0��!c��"0��!c��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!�`� "��!�`� "��!�`�@�&Jv.����Jvv���,�Z���hy�<z�v�ʣ�sUy�<z������^=��-c�sU���x��e�2�^��i�U���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J2Q�d�(�DQ���$EI&��L%�(J2Q�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�P���m�d���]%;1G�\U-��Gˣ�j��<>W�Gˣ��������ok��ʌe�2c��\�z7�<W
�]u��)bL�����hňV�hň�cD�1���#ZcDk�h#���60���h##ڈ�f[D4�"�ٖ�ь�ќ�ќ-�"0��!c��"0��!c��"0��!c��"0��!c��"0��!c��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!�`� "��!�`� "��!�(ٹ��Jv*��Y��hW�Gˣ�����=+���U����e��Gˣ{�臷�u�Ue�2�e��ˌ{5�=W
&�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���$EI&��L%�(J2Q�d�(�DQ�!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"ȩ]���h�D4��1�h�ԮʌAD#� UD�d�B�+٩dgW��G̑>W�Gˣ�����=+���U���hy�<z�v�{��[ƚ�2c���Xf<W����)�UsjW%�(J2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�j2��ɴ�&Ӯ�L�jN���� fLcb��[D��2�#�1�#�3�9#�w"��Q�S��Y�+٩dgg��Ϣ]U-��Gˣ�j��<?W�Gˣ��^-��գ�2�=W�ˌ��^f,3�Ռ��\�(��k}0��Ɉ��hɈV�hňV�h;F�#ڎ�1�5F�ƈ60�
�h#E &�L%�(J2Q�d�(�DQ���$EI&��L%�(J2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A2DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPA5��2c�m��F�4� ���U�1�h�\*r����\*r�U��s��H���hy�<z�v�ʣ�;���f?�������߉��@诂����W���y�*3�ˌe�s����\��vU��r"�2�A(���Lcш(JM���D4"�RS�*3����ԮʌAD#�(5��2cш(JM���D4&�bLŘ(�1Qc�(�DQ���E1&�b��1D`C��1D`C��1D`C��1D`C��1D`C��1D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C�ҮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1����E.�^�KE.;�\~���hy�<Z=W�g�����<Z����hyt������Xf���2c�q�f��w���;a��m&����ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL�j1��Ŵ�ӮZL��4�b�1��]��D4cD3F4cDsF4gDS�S��E�W�S�ή����#}�*��Gˣ��s�{V
��ʣ���hy�\�z�臷�5�Ue�2c���x�v���S��ޯA�o�Z�k}0�%#Z2�%#Z1�#Z1���v�h;F�ƈ��#���60�
�h##�Ȉ�DQ���E1&�bLŘ(�1Qc�(�DQ�!c��"0��!c��"0��!c��"0��!c��"0��!c��"0��!c��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!�`� "��!�`� "�TD�d�2�+٩dgg��Ϣ]U-��Gˣ�j��<?W�Gˣ��^-��գ�2�=W�ˌ��^f,3�Ռ��\5�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���EI&��L%�(J2Q�d�(�DQ���$EI��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b� iWmL�jc�UӮژv�ƴ�6�]�1���iWm*"Q�s���T���d�#�H��ʣ���hy�\힕G���hy�<Z=W��=��-c�sU���Xf,3��]�f��窍iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1��ӘHdLcb�7f!Zlь�ь�ќM�N%;�^�N%;;Kv~���hy�<Z=W�g�����<Z����hyt����Xf���2c�q�f����5���`^�y�F�dDKF�dD+F�bD+F�#ڎmLj��#ZcD�F��mdDc�(�DQ���$EI&��L%�(J2Q�d�(�DQ�!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(���]���h�D4��1�hS�*3M�N%;�^�N%;�Jv>b����<Z-��G���Yy4|�*��Gˣ��s��ݣ�2�<W�ˌe�2���n�Oy�z��MDQ�1�k=E�vUf"E�vUf"E�vUf"E�vUf"E�vUf"E�vUf"E1&�bLŘ(�1Qc�(�DQ���E1��!c��"0��!c��"0��!c��"0��!c��"0��!c��"0��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�(ٹ��Jv*��Y��hW�Gˣ�����=+���U����e��Gˣ{�臷�u�Ue�2�e��ˌ{5�=WE�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u��)bL�����hňV�hň�cD�1���#ZcDk�h#���60���h##��6N��̘�E�� �#�1�#�3�9#���Jv.����Jvv��|��sUy�<Z-���ݳ�h�\U-��Gˣ�jG?�e�y�*3�ˌe�s����\�~
�};��z"�2�AD#�(�D4"�2N���D4"�2N���D4"�2N���D4"�2N���D4"�2N���D4&�bLŘ(�1Qc�(�DQ���E1&�bC��1D`C��1D`C��1D`C��1D`C��1D`C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3DC�A0DC�A0D�"%;��^�N%;;Kv~���hy�<Z=W�g�����<Z����hyt����Xf���2c�q�f����DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J2Q�d�(�DQ���$EI&��L%�(J2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�C�A1DPC�A1DPC�Ү:2��#Ӯ:2��#Ӯ:2��#Ӯ:2��#Ӯ:2��#Ӯ:2��#Ӯ:2��#Ӯ:2��#Ӯ:2��#Ӯ:"���E�U�Ǭ.��D4��� �Dp��D4%;��\d{%;���)���9���hy�<Z=[�g��칪<Z-��G�֮w�~x�X�\Uf,3�ˌgk?���5��m �r?y��(�1@�~"E9��(�cр(�qE���DQ�c�(��D4 �rDQ�� �Q�� �r?������cшv��&�B��ޏADc�(D���D4��v��1�h���c�" �U�� �1D@��ޏADc��hW���6�m�� fLcFF��mDD�-"�o�|ˈf�hƈf�hΈ�hΈ�h���hɈ��hɈV�hňV�h;F�#ڎ�1�5F�ƈ��3D�8C��3DC�A0DC�A0D�"%;��^�N%;;Kv~���hy�<Z=[�g�����<Z����hyt����Xf���2c�q�f����DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J2Q�d�(�DQ���$EI&��L%�(J2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�C�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPCE�M��̘�E�� �D0�AD#���vUf"���Jv.����Jvv��|��sUy�<Z-���ݳ�h�\U-��Gˣ�jG?�e�y�*3�ˌe�s����\�~
�}���Lc��z"�bS�*3����ԮʌAD#�(6��2cш(�M���D4"�bS�*3����ԮʌADc�(�DQ���E1&�bLŘ(�1Qc�(��1D`C��1D`C��1D`C��1D`CH��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�Ӯj*"Q�s���T���d�gѮ*��Gˣ��s�{V���ʣ���l/��G���o랫ʌe��l/3��j�O{����ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��M��
̘"��h#���62���h#"Zm�j��V[F4cD3F4cDsF4gDsF�`DF�`DKF�dDKF�bD+F�bD�1���v�hC�A1DPC�A1DP�~��o�%ԔP���jJ�u�P;1�^3.|?�d�2���ˌe����f��
����e�2�͘;���2c����e�2��8`3N���x��2c�q�f����Xf<{{��̸C3.،w2c����e�2��x�q�ˌgo/3�wh�
6�Af,3����Xfܡ��2c����e�2��xd��t�'3����Xfܟ|�g�����^f,3�Ќ�<���x��2c�q�f_��.�d��ˌ;4c��t�'3����Xfܡ�x�<����e�2����3]�Ɍ�o/3�wh�������d�<_�?k{y�<�Cχ�L�~2���ˌe��1|�g:����^f,3�Ќ�C?ס��x��2c�qf����Of<{��̸C3��\�~2���ˌe��1|��:����^f,3�Ќ�C?ס��x��2c�q�f���d��ˌ;4c���u�'3����XfܡÇ~�<����e�2����s]�Ɍ�o/3�wh����Of<{��̸C3�/�Bx2���ˌe���q�x�<����e�2����]�Ɍ�o/3�wh��^�Of<{��̸C3�/�Bx2���ˌe��1|������^f,3�Ќ�����x��2c�q�f_�S�:�����^�/�����C�С��x��2c�q�f���d��ˌ;4c��/u�'3����Xfܟ'|�:����^f,3�Ќ�C�ԡ��x��2c�q�f���d��ˌ;4c��/u�'3����XfܡÇ~�C?����e�2��>�K�Ɍ�o/3�wh��_�Of<{��̸C3�/�Rx2���ˌe��1|�������^f,3�Ќ�����x��2c�qf\�^�Of<{��̸C3�/�Jx2���ˌe��1|�W�����^f,3�Ќ�����x��2c�q�f_��.�d��ˌ;4c��t�'3����Xfܡ�x�T��������;�|�Яt�'3����XfܡÇ~�C?����e�2��=���V�~2���ˌeƽ��s�X�~2���ˌe��1z�g���d��ˌ;4c����[�Ɍ�o/3�wh�衟��:����^f,3�Ќ�C?�ou�'3����Xfܡ��~����Of<{��̸C3F�l����x��2c�q�f�^��~�<����e�2������Vx2���ˌe��1|�g�����^f,3�ό
��3]�Ɍ�o/3�wh����Of<{��̸C3�/�Lx2���ˌe��1|�g�����^f,3�Ќ�<���x��2c�q�f_��.�d��ˌ;4c�ψ��c����Y�����z>|�g:����^f,3�Ќ�C?ӡ��x��2c�q�f���d��ˌ�3c��\�~2���ˌe��1|��:����^f,3�Ќ�C?ס��x��2c�q�f���d��ˌ;4c���u�'3����XfܡÇ~�C?����e�2��>�s]�Ɍ�o/3�wh����Of<{��̸C3�/�\x2���ˌe��1|������^f,3�ό��]�Ɍ�o/3�wh��^�Of<{��̸C3�/�Bx2���ˌe��1|������^f,3�Ќ�����x��2c�q�f_��.�d��ˌ;4c�/���С�<���|y~�����d��ˌ;4c��/t�'3����XfܡÇ~�C?����e�2���8�C�ԡ��x��2c�q�f���d��ˌ;4c��/u�'3����XfܡÇ~�C?����e�2��>�K�Ɍ�o/3�wh��_��Of<{��̸C3��Rx2���ˌe��1|�������^f,3�Ќ�����x��2c�q�f_��.�d��ˌ�3�/�Jx2���ˌe��1|�W�����^f,3�Ќ�����x��2c�q�f_��.�d��ˌ;4c��t�'3����Xfܡ�x�<����e�2����+�j�t�'ϟ��<_�ߡ�Ç~�C?����e�2��>�+�Ɍ�o/3�wh�衟�x
���^k�����e���W��j�����3�����0��y�jfv��z�/�<Z-��G/��x6�vy�k�r?���A���\?�[D-��G�ծw��hd�2���ˌ{5�O~`����va�ֆ8.�G
�};���`^�-ђ-ъ�ъmLj�cD�1�5F�ƈ��F��m`D�FF�Ͷ�h�ED�-#�1�#s1cLŘ(�1D`C��1D`C��1D`C��1D`C��1D`C��1D`8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C�A0DC�A0DC�A(٩d�"�+٩dgg���5G�\U-�^f{y�<�Yx4~�*��G/��<ZݫG?�e�{�*3�/���Xfܫ?��j0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &��L%�(J2Q�d�(�DQ���$EI&��$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�AD�-AӘ�E�� �D0�AD#� �v�`�UCE$Jv.����Jvv��|��sUy�<Z-���ݳ�h�\U-��Gˣ�jG?�e�y�*3�ˌe�s����\5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]5�v�`�U�iW
�]uS0f�3&�1�h�ED�-"�oь�ь�ќ�т-т-ђ-ъ�ъmLj�cD�1�5F�ƈ��F���!g��"p��!�`� "��!�`� "�TD�d�2�+٩dgg��Ϣ]U-��Gˣ�j��<?W�Gˣ��^-��գ�2�=W�ˌ��^f,3�Ռ��\5�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���EI&��L%�(J2Q�d�(�DQ���$EI��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"ȩ]���h�D4��1�h�ԮʌADS�S��E�W�S�ή����#}�*��Gˣ��s�{V
��ʣ���hy�\�z�臷�5�Ue�2c���x�v���S��ޯA�oQ�i�ZODQrjWe� �Q���U�1�hD%�vUf"Eɩ]���FDQrjWe� �Q���U�1�hLŘ(�1Qc�(�DQ���E1&�bL�"0��!c��"0��!c��"0��!c��"0��!c��"0��v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�USE$Jv.����Jvv���,�U���hy�<z�v�ʣ�sUy�<z������^=��-c�sU���x��e�2�^��i�U�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iWM�]5�v�d�U�iW�����1c����h���hɈ��hɈV�hňV�h;F�#ڎ�1�5F�ƈ60�
�h#�Ȉ62���h�ED�-"Zmь��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(�j�o�t̷wwo77�?�;����|4Z�x����}�����n�^_�6�n��\}� ���E FMu�̘�E�� ��1�AD#���Vf"�����.������v}���Wy�<Z-���ݳ�h��U-��Gˣ�jG?�e�y�*3�ˌe�s������~
�}�ȶLc��z"�RS]+3�ȶ�T�ʌAD#�-5յ2cшlKMu��D4"�RS]+3�ȶ�T�ʌADc�(�DQ���E1&�bLŘ(�1Qc�(��1D`C��1D`C��1D`C��1D`C��1D`C��1D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C�A0DC�A0DCj6Q�s���T���d�gQ�*��Gˣ��s�{V���ʣ���l/��G���o랫ʌe��l/3��j�O{�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���$EI&��L%�(J2Q������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-������b�Z��k-�]��v�b�UwL��iW�1��;�]uǴ��v�Ӯ�c�Uw*"Q�s���T���d�#�H��ʣ���hy�\힕G���hy�<Z=W��=��-c�sU���Xf,3��]�f��窻�6��-�{g�$1&ђ-ъ�ъmLj�cD�1�5F�ƈ��F��m`D�FF�Ͷ�h�ED�-#�1�#�1�9#�3�9#C��1D`C��1D`C��1D`C��1D`C��1D`C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3DC�A0DC�A0D��D��e�W�S��Β��E��<Z-��G���Yy4~�*��G/��<ZݫG?�e�{�*3�/���Xfܫ?��j0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���EI&��L%�(J2Q�d�(�DQ���$EI&��$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�C�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPC�A1DPCE��M@�i���Mc�"�� �D��[��1�h4�(ٹ��Jv*��U��s��U���hy�<z�v�ʣ�sUy�<Z-���]���湪�Xf,3��ծw3~�s�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮژv�ƴ�6�]�1���iWmL�jc�UӮڦvUC�83&�1ňV�hň�cD�1���#ZcDk�h#���60���h##ڈ�[D��"�Ŗ�ь�ќ�ќM�N%;�^�N%;;Kv~���hy�<Z=W�g�����<Z����hyt����Xf���2c�q�f����k}0�����3Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���$EI&��L%�(J2Q�d�(�DQ�!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"�vUf���Mc�"�� �D0L���D4��(ٹ��Jv*��U��s��U���hy�<z�v�ʣ�sUy�<Z-���]���湪�Xf,3��ծw3~�s�ajW%�(�4y�'�(�D4"�2L���D4"�2L���D4"�2L���D4"�2L���D4"�2L���D4&�bLŘ(�1Qc�(�DQ���E1&�bL�"0��!c��"0��!c��"0��!c��"0��!c��"0��!c��"p��!g��"p��!g��"p��!g��"@�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�(ٹ��Jv*��Y��hW�Gˣ�����=+���U����e��Gˣ{�臷�u�Ue�2�e��ˌ{5�=WE�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U�]u`�U��]Ց1ΌIbL1�#Z1���v�h;F�ƈ��#���60�
�h##�Ȉ6"�����h�eD3F4cD3F4gDsF4gDF�`DF4��!�b��"(��!�b��"(��!�b��"(��!�b��"(�� �qjWeƬ/�4� �i"A�ԮʌAD#�`T���m�d���]%;1G�\U-��Gˣ�j��<>W�Gˣ��������ok��ʌe�2c��\�z7�<W�vU�}���Lc��z"�2�AD#�(�ԮʌAD#�(�ԮʌAD#�(�ԮʌAD#�(�ԮʌAD#�(�ԮʌADc�(�DQ���E1&�bLŘ(�1Qc�(�DQ�!c��"0��!c��"0��!c��"0��!c��"0��!c��"0��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"��!�`� "��!�`� "�TD�d�2�+٩dgg��Ϣ]U-��Gˣ�j��<?W�Gˣ��^-��գ�2�=W�ˌ��^f,3�Ռ��\5�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���$EI&��L%�(J2Q�d�(�DQ���$EI��!�d� iW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vՑiW�vU�"���cV�~"@�c� "�~O#@�c є�T�s���T���d�c���ʣ���hy�l힕G���hy�<Z=[��=��-c�sU���Xf,3��]�f����5�(������ Q��1�h@�8��AD�(�1@�~"E9��(�cр(�qE���6�3�1�~ˌqf!�m�l��f[F4cD3F4cDsF4gDsF�`DF�`DKF�dDKF�bD+F�bD�1���v�h��1�5F��m`Dc��"0��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"��!�`� "��!�`� "�TD�d�2�+٩dgg��ϡ]U-��Gˣgk��<?W�Gˣ��^-��գ�2�=W�ˌ��^f,3�Ռ��\5�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���$EI&��L%�(J2Q�d�(�DQ���$EI��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�"���vUf���Mc�"�� �D`S�*3� S���m�d���]%;1G�\U-��Gˣ�j��<>W�Gˣ��������ok��ʌe�2c��\�z7�<W��]�x�&�(�䵞��Lcш(�M���D4"�bS�*3����ԮʌAD#�(6��2cш(�1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��1��ƴ�ӮjL��M����qfLcb��[D��2�#�1�#�3�9#�S�)٩d��+٩dgg��Ϣ]U-��Gˣ�j��<?W�Gˣ��^-��գ�2�=W�ˌ��^f,3�Ռ��\5�y��>���dDKF�dD+F�bD+F�#ڎmLj��#ZcD�F�����E &��L%�(J2Q�d�(�DQ���$EI&��L%"H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(�� ��U�1�6�AD#�`��F�O���D4�\E$Jv.����Jvv��|��sUy�<Z-���ݳ�h�\U-��Gˣ�jG?�e�y�*3�ˌe�s����\էvU�}���Lc��z"�2�AD#�(>��2cш(�O���D4"��S�*3����ԮʌAD#�(>��2cј(�1Qc�(�DQ���E1&�bLŘ(�1Qc��"0��!c��"0��!c��"0��!c��"0��!c��"0��!c��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�(ٹ��Jv*��Y��hW�Gˣ�����=+���U����e��Gˣ{�臷�u�Ue�2�e��ˌ{5�=WE�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙvUg�U�iWu�]ՙv�i�2&�1��2cъmLj�cD�1�5F�ƈ��F��m`D�FF�-�vUf���Mcь�ь�ќ�)є�T�s���T���d�#�H��ʣ���hy�\힕G���hy�<Z=W��=��-c�sU���Xf,3��]�f���1��������Z��hDe��FDQ�1�hD%�vUf"E��]���FDQbjWe� �Q���U�1�hLŘ(�1Qc�(�DQ���E1&�bLŘ(�1D`C��1D`C��1D`C��1D`C��1D`C��1D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C�A0DC�A0DC���H��\f{%;���,��Y��ʣ���hy�\힕G���hy�2�ˣ�ѽz��[ƺ�2c��2�ˌeƽ��Ӟ�E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�d�(�DQ���$EI&��L%�(J2Q�d�(�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A1DPC�A1DPC�A1DPC�A1D���ӮL�j0�����ӮL�j0�����ӮL�j0�����ӮL�j0���r�j��l�+����YQ��1�h���D�U���U��t"ڪDp:F�N%;�^�N%;�Hv��9b��hy�<Z�����x4u�*��Gˣ��~=z�臷�U�Ue�2c���x��G�f�$��X5�r:y�_5��q̪Q��1�h�FQ>�Y5�r:m�(��1�FQN� ��E�8f�(��D�U�(ǬE9���j��U�(�cј(ʺ���c��mW�8����ۮz:����ۮz:�!�u�UO� �1D�n���D4��mW=��������c�"X�]�t"C붫��ADc�`�v��1�h붫��!D[�]����c��o���nnxw���_�����|<���_o��77�۷�W��ͫ��7����>���W�A�u�ZO���Ę�o�1�h����hɈ��hňV�hň�cD�1���#ZcDk�h#���60���h##ڈ�[D��"�Ŗ�ь�ќ�!�`�@�&��.������v}ںVy�<Z-�^���l<��Gˣ��^-��գ�2ֽ�ˌ��^f,3�Ռ���5�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���$EI&��L%�(J2Q�d�(�DQ���$EI��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�"����Vf���Mc�"�� �D`S]+3� S����m�d���]%;1G�\U-��Gˣ�j��<>W�Gˣ��������ok��ʌe�2c��\�z7�<W����x�&�(�䵞��Lcш(�Mu��D4"�bS]+3����T�ʌAD#�(6յ2cш(�Mu��D4&�bLŘ(�1Qc�(�DQ���E1&�bL�"0��!c��"0��!c��"0��!c��"0��!c��"0��!c��"p��!g��"p��!g� iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]vUc�UME$Jv.����Jvv���,�U���hy�<z�v�ʣ�sUy�<z������^=��-c�sU���x��e�2�^��i�U�vUc�U�iW5�]vUc�U�iW5�]vUc�U�iW5�]v�i�7dLc�����60���h##ڈ��[D�㏍�D4cD3F4cDsF4gDsF�`DF�`DKF�dDKF�bD+F�bD�1���v�h��!�d� "H��!�d� "H��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�b��"(��!�"���vUf���Mc�"�� �D�S�*3� W���m�d���]%;1G�\U-��Gˣ�j��<>W�Gˣ��������ok��ʌe�2c��\�z7�<W��]�x�&�(�䵞��Lcш(�O���D4"��S�*3����ԮʌAD#�(>��2cш(�O���D4&�bLŘ(�1Qc�(�DQ���E1&�bL�"0��!c��"0��!c��"0��!c��"0��!c��"0��!c��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!�`� "��!�`� "��!�`�@E$Jv.����Jvv���,�U���hy�<z�v�ʣ�sUy�<z������^=��-c�sU���x��e�2�^��i�U���E &�L%�(J0Q�`�(�DQ���E &�L%�(
Ү�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��3��δ�:Ӯ�L��4�dLc|�e� �9#Z0�#Z0�%#Z2�%#Z1�#Z1���v�h;F�ƈ��#���60�
�h##�Ȉ6��ԮʌY_�i"�1�D0�AD#�`��FA��D�΅�W�S�ή����#}�*��Gˣ��s�{V
��ʣ���hy�\�z�臷�5�Ue�2c���x�v���S���ԮJ�oQ�i�ZODQ�1�hD%�vUf"E��]���FDQbjWe� �Q���U�1�hD%�vUf"E1&�bLŘ(�1Qc�(�DQ���E1&�bC��1D`C��1D`C��1D`C��1D`C��1D`8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C��3D�8C�A0DC�A0DC�A0D�"%;��^�N%;;Kv~���hy�<Z=W�g�����<Z����hyt����Xf���2c�q�f����DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J2Q�d�(�DQ���$EI&��L%�(J2D�$C�A2D�$C�A2D�$C�A2D�$C�A2D�$C�A2DPC�A1D���ӮL�j0�����ӮL�j0�����ӮL�j0�����ӮL�j0�����ӮL�j0�����ӮL�j0�����Ӯ�L�j2��ɴ��Ԯ:"c���gDsF4�DS�S���W�S�ή����#}�*��Gˣ��s�{V
��ʣ���hy�\�z�臷�5�Ue�2c���x�v���S���ԮJ�o�Z�k}2�%#Z2�#Z1�#ڎmLj�cDk�h��1�
�h#���62���h#"�m�l��f[F4&�bLŘ(�1Qc�(�DQ�!c��"0��!c��"0��!c��"0��!c��"0��!c��"0��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"p��!g��"��!�`� "��!�`� "�TD�d�2�+٩dgg��Ϣ]U-��Gˣ�j��<?W�Gˣ��^-��գ�2�=W�ˌ��^f,3�Ռ��\5�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���E &�L%�(J0Q�`�(�DQ���$EI&��L%�(J2Q�d�(�DQ���$EI��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�d� "H��!�b��"(��!�����ʖ]�}�Wɷ�~(U̵q�h4 ���!�s� 3/U���Tf���q�!Y$������}ƣ0������19�A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F��ZA���燶?CBF�f]�ͺj�u�6�m�U;C$iv>����L��T��/�Q����atF��C1����atF���~�-�突q`�G�;;���\�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWݟ�xf��yf�gHhmBkZ�Ю&�� �jB�Lh� m3��Lh7�̈́v7��Mhwڼ��慄6/&�2�� �LhÄ6LhC��fg����4;��<Y��XW
���0:�>�݇b4?W
����|}F���o�e<�\50����q`|V���������Zo�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���,SEY���Le�*�2U�e�(�TQ���,SEY��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����0���E����C۟!� #؟!� #��\��ϐЄ\3D�f烾>��4;O�����jF��a���>��jF��a�������2�y�Ɓq`|4����=�U�/QEٟ!�*���"�(�3$4QE��\De��&�(ח����ϐ�D��rU�����\_.���?CBU���ETQ�gHh��R��R��R��R��R��R��R��R��R��R��A#(ce����1�2FP��A#(ce����1�2FP��A#(ce�`#��1�a�`#��1�a�`#��1��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W���?����2�L� m�І m����L��_�fg��'kv~�atF��G��P���at������2����瞫Ɓ�c�>0��
��=W���}{�_���~�Ж m��ڄ�&�6�]MhW�Մ���6�fB���n&�� �nB����$���6ψЖ��,SEY���Le�*�2U�e�(��2F��,c��2F��,c��2F��,c��2F��,c��2F��,c�A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�F����燶?CBF�?CBF�����0�-C$iv>����L��T��/�Q����atF��C1����atF���~�-�突q`�G�;;���\u��U��ۢ��?C~�U�����l���y��&�(۾�j�!��*ʶ���gHh���������l���y��f�(e�(e�(e�(e�(e�(e�(e�(e�(e�(e����1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��Ⱥ�f�U7����u�ͬ�nf]u3�[�H��|�קٙf�ɚ�_źjF��a���>���jF?����0���~�-�突q`�������}�Uɺ�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7���?�g���<3_�<3�3$�eB[&�eBkZ��ڄv5�]MhW�fB�Lh� �fB���n&�� �nB���n���y����ϐ�ʄV&�2�
�0� #�e�$��}}��iv����8�s�0:�����}(F�s�0:����ٝ��o�e<�\50����hvg��{����uU������ϐ_�Ee��&�(�}]�<CBU�۾�j�!��*�m_W5ϐ�D嶯��gHh��r��U�3$4SE)SE)SE)SE)SE)SE)SE)SE)SE)SE)ce����1�2FP��A#(ce����1�2FP��A#(ce����1�2F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��4F0�Lc��4F0�LcYI��1_��e*�'�\~��atF��G��P��w�at������2�����ޑƁ�c�>0��
���#��?������LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�2U�e�(�TQ���,SEY���Le�*�2F��,c��2F��,c��2F��,c��2F��,c��2F��,c��2F���1�6F���A#hcm����u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��uջYW��uջYW��uջYW��uջYW�g!$��}}��iv����8�s�0:�����}(F�s�0:����ٝ��o�e<�\50����hvg��{����?�������ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�}_W��i�i�̸��ƅ�6.&�2�� �LhÄ6LhÄ6Mhӄ6Mh˄�Lh˄�&�6�� �jB��Ю&�̈́���6�̈́v3��Lh��1�a�`#���1�i�`#���1�i� C$iv>����L��d�ίb]5����0�hv���\5����at}VF�����s��80~��Ɓ�Ya����TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�2U�e�(�TQ���,SEY���Le�*�2F��,c��2F��,c��2F��,c��2F��,c��2F��,c��2F���1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#h`u��U�3O��0��gHh�>?���Z��iv>����L��L��/�����atF��C1ڞ���atF���~�-�突q`Ƈ�;;���\���!~�U��gȯ�����PEy}���(��U��gHh����PEy}���(��U��gHh����PEy}���(��U��gHh��R��R��R��R��R��R��R��R��R��A#(ce����1�2FP��A#(ce����1�2FP��A#몯ϐЌ�u��gDhb]��3�ĺ��3$4cb]���1���� ��XW}}��f�@���>CB3F �U_�!�#몯ϐЌ�u��gHh�ĺ��3"4�����M��~~��XW}}��f�@���>�fg����4;��<Y��kXW
���0:�>�݇b4?W
����|}F���o�e<�\50����q`|V�﹪XW�/:̯���"�U??c�(b]������u��gHh��"�U_�!��*�XW}}��f�(b]������u��gDhb]���XW������u��gHh��"�U_�!�#몯ϐЌ�u��gHh�ĺ��3$4cb]���1����L/�����3�<CB����&�; �/$�����bB+Z��ʄ6LhÄ6Lhӄ6Mhӄ�Lh˄�LhmBkZ�Ю&�� �jB�Lh� �A#hcm����1�FP���y����ϐЄ�ϐЄԾ�j�!��ٙf�C�>��4;O�����jF��a���>��jF��a�������2�y�Ɓq`|4����=�U_?C��-�(�3��zQE�}]�<CBU���U�3$4QE�}]�<CBU���U�3$4QE�}]�<CBU���U�3$4SE)SE)SE)SE)SE)SE)SE)SE)SE)ce����1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#���1�i�`#���1�i� C$iv>����L��d�ίb]5����0�hv���\5����at}VF�����s��80~��Ɓ�Ya����TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�2U�e�(�TQ���,SEY���Le�*�2F��,c��2F��,c��2F��,c��2F��,cd]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�U����r�|��ZjG�>
�4�N�P�8�1��u���*0�}`�ƅa�ۍ����Ɓ� a��^ߛ�q`|������0��+0�}`��ø�����Ɓ� a����80>���q`|B_1���80>���q`|BoƷ�80>���q`|B�0��q`|������0�[W.���_��q���^`|������0�x������Ɓ� a�/�*x������_�U.���_�'�1��{����39��}�某��Яr����80>!��_��/0>���q`|B�C�ʡ_`|������0Ƈ~�C�����Ɓ� a��F���_�����~#�~����������ǿ>0�Oc|�7r����80>!���ȡ_`|������0Ƈ~#x������_��\��ǿ>0�Oc|�7r����80>!����^`|������0�x#x������_��\��ǿ>0���/�f.���_�'�1�������}`���o�/0>���q`|B��������Ɓ� a�/�ڛ9��}�某���o��/0>���q`|B�C��C�����Ɓ� a��f���_�'�1>��9���}`����o��/0>���q`|>/|�r����80>!���ʡ_`|������0Ƈ~+�~����������ǿ>0�Oc|�r����80>!����^`|������0�x+x������_�\��ǿ>0�Oc|��r����80>!��^�/0>���q`|>7���\��ǿ>0�Oc|����}`����s����80>!��^�/0>���q`|B��6S{�C�0��ׇ�a� ���:�~�������u���_�'�1>����ǿ>0�Oc|��9���}`���Я^.9���}`�
��#�q���_�'�1=���K���_�'�1=���K���_�'�1=���K���_�'�1=���K.���_�'�1����K.���_�'�1����K.���_�'�1����K.���_�'�1����K.���_�'�1���\��ǿ>0����x������Ɓ� a�/�*x������_�U.���_�'�1���\��ǿ>0�Oc|�Wbj�^*�~a�����2�U���_�'�1>����ǿ>0�Oc|�W9���}`���Яr����80>!���ȡ_`|�����|0��o��/0>���q`|B�C��C�����Ɓ� a��F���_�'�1>�9���}`����o�/0>���q`|B��������Ɓ� a�/�F.���_�'�1������}`���o�/0>���q`|B��������Ɓ��`<���^`|������0�x3x������_��\��ǿ>0�Oc|�7s����80>!���4S{3�~a�����2����ǿ>0�Oc|�7s����80>!���̡_`|������0Ƈ~3�~����������ǿ>0����V���_�'�1>�[9���}`����o��/0>���q`|B�C��C�����Ɓ� a��V.���_�'�1��[����}`���o�/0>���q`|B��������Ɓ� a�/�V.���_�'�1���\��ǿ>0����x������Ɓ� a�/�:x������_�u.���_�'�1���\��ǿ>0�Oc|��fj�s����0?�?!��_��/0>���q`|B�C�Ρ_`|������0Ƈ~�C�����Ɓ� a��:�~���������w��2�3)g珖|}�h�-g�������o����w��������OO�GF��at�����u}{ݮ=�/n���Oa��������HF��G�;;��O4�q`�������_��������]]��6?}����!~ߞ���i~��&�eB[&�eBkZ��&ϴx��R��Մ���6�fB���n&�� �nB����$�����BB�� �LheB��;��<3LhÄ6Lhӄ6Mhӄ�Lh˄�LhmB3FP��A#(ce����1�2FP��A#(ce�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�i�`#���1�i�`#��f��iv>����L��d�ο
G�F�я��0:�����at������2����瞫Ɓ�c�>0��
��=W���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���,SEY���Le�*�2U�e�(�TQ�1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#�/a�3�m��&�`��&�`���Z��iv>����L��T��/�Q����atF��C1����atF���~�-�突q`�G�;;���\��3��ۢ��?C~�U�����gHh��2�uU� MTQ�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�����gn/e����݄v7��Ih�BBڸ��ʄV&�2�
�0�
�4�M�4�-�2�-Z��ڄ�&�� �jB���6�fB3F0�c��0F0�c��4F0�Lc��4F0�Lc"I��1_�fg��'kv~�atF��G��P���at������2����瞫Ɓ�c�>0��
��=W���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���,SEY���Le�*�2U�e�(�TQ�1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#X���y����ϐЄ�ϐЄ�}]�<CBK�3�·|}��iv����8�s�0:�����}(F�s�0:����ٝ��o�e<�\50����hvg��{���~��}[TQ�gȯ�����uU� MTQ־�j�!��*���U�3$4QEY���y��&�(k_W5ϐ�De�������������������������������1�2FP��A#(ce����1�2FP��A#(ce����.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ��������O�3�Γ5;��u�0:�����}(F�s�0:�~�ׇ�a�Y��[�s�U���1_�g������u�e�U�YW]f]u�u�e�U�YW]f]u�u�e�U�YW]f]u�u�e�U�YW]f]u�u�e�U�YW]f]ufn��|�k�yF��.&�2�� �LhÄ6LhÄ6Mhӄ6Mh˄�Lh˄�&�6�� �jB��Ю&�̈́���6�̈́v3��Lhw�1�e����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#�}]�<����gHh��gHh�z_W5ϐ���L��!_�fg���jv~��\5����0�hv���\5����0�hvgg��o�<W
���80>���a��窯�!~�U���k������j�!��*J���������j�!��*J���������j�!��*J�������������������������������1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��A#(c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�Lc��4F0�Lc��4F�!�4;��iv��y�f�W��F��at}4��h~�F�я��0:�>+��~�x�j`?������0~�s�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE!�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�j�U�g�<��z)� �LhÄ6Lhiv�����O�3��S5;� G}�F��at}4��h|�F��at}4��3����g��Ɓq`���0~�s����oO�k�4��O�2�-�2�� �MhmB��Ю&�� m3�m&�̈́v3��Lh7�݄v7��Ihu!�����������������������1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��A#(c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�Lc��4F0�Lc��4F�!�4;��iv��y�f�W��F��at}4��h~�F�я��0:�>+��~�x�j`?������0~�s�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�2U�e�(�TQ���,SEY���Le#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����0�m_W5�<?�ͬ�nf]u3몛YW�̺�f�U�������O�3��S5;� G}�F��at}4��h|�F��at}4��3����g��Ɓq`���0~�s�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺��L��3ח2�L� m3�m&�̈́v3��Lh7�݄v7��Ih�BB�ڼ��ʄV&�2�
�0��ٙf�C�>��4;O���*�U��0:���f����U��0�1_F��ge��o�=W
���|}`���{���3�����Z?ͯ�ӄ�Lh˄�LhmBk���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�2U�e�(�TQ���,SEY���Le�*�2F��,c��2F��,c��2F��,c��2F��,c��2F��,c��2F���1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#ha�}]�<����gHh��gHh�n���y���fg����4;��<U��p��atF��G��P���atF��G�;;��~�x�j`Ɓ������<W}�������ϐ_�E嶯��gHh��r��U�3$4QE���������uU� MTQn���y��&�(�}]�<CB3U�2U�2U�2U�2U�2U�2U�2U�2U�2FP��A#(ce����1�2FP��A#(ce����1�2FP��A#(ce�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`# �7��z3�7��z3�7��z3�7��z3�7��z3�7��z3�7��z3�7��z3�7��z3�7��z3몷������O�3�Γ5;��u�0:�����}(F�s�0:�~�ׇ�a�Y��[�s�U���1_�g������u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW��u՛YW����e\�3K<S/� �LhÄ6LhÄ6Mhӄ6Mh˄�Lh˄�&�6�� �jB��Ю&�̈́���6�̈́v3��Lhw�݄v�}N��?����gHh��gHh��/a�3$4a�������O�3��S5;� G}�F��at}4��h|�F��at}4��3����g��Ɓq`���0~�s���ETQ�gȯ���r��*�� MTQ�/QEٟ!��*���"�(�3$4QE��\De��&�(������ϐ�D��rU���������������������������������1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��A#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�i�`#���1�i�`#���1�i� C$iv>����L��d�ίb]5����0�hv���\5����at}VF�����s��80~��Ɓ�Ya����TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�2U�e�(�TQ���,SEY���Le�*�2F��,c��2F��,c��2F��,c��2F��,c��2F��,c��2F��Ⱥ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ɺ���^���^�yzh�ϐЀ�>CBF��`�ϐЀ�>�fg����4;��<S��Kp��atF�ч��P���atF�ч�;;��~�x�j`Ɓ�����w<W��������TQ>?�(�ϐ�@��3����
TQ>?�(�ϐ�@��3����
TQ>?�(�ϐ�@��3���� �TQĺ��3"4����SE몯Ϭό��yf�gHhӄ6Mhӄ�Lh˄�LhmBkZ�Ю&�� �jB�Lh� m3��Lh7�̈́v7��Mhw�g�0ψ��ńV&�2�#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#���1�i�`#���1�i�`#��2D�f�c�>��4;O����U��0:��g����U��0�1_F��ge��o�=W
���|}`���{�:Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���,SEY���Le�*�2U�e�(�TQ���,c��2F��,c��2F��,c��2F��,c��2F��,c��2F��,cm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F��ZA���燶?CBF�?CBFP���y��&��2D�f烾>��4;O�����jF��a���>��jF��a�������2�y�Ɓq`|4����=�Uk_W�o�*����^TQ�gHh��R���y��&�(����gHh��R���y��&�(����gHh��R���y��f�(e�(e�(e�(e�(e�(d]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2��3c�g�xf{��gHh� �fB���n&�� �nB���慄6/$�y1�� �LheB&�aB*�4;��|�קٙf�ɚ�_źjF��a���>���jF?����0���~�-�突q`�������}�U�4��O�k�4��/�2�-Z��ڄ�&�� �TQ���LSE���2Me�*�4U�i�(�TQ���LSEY���Le�*�2U�e�(�TQ���,SEY����,c��2F��,c��2F��,c��2F��,c��2F��,c��2F���1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hac_W5�<?���0���0�����gHh�F�H��|�קٙf穚�_��>W
���0:�>�݇b4>W
���0:�>�����[�3�U��80��fwv�����U��ۢ��?C~�U������}]�<CBU�����gHh��2�uU� MTQƾ�j�!��*���U�3$4SE)SE)SE)SE)SE)SE)SE)SE)SE)SE)ce����1�2FP��A#(ce����1�2FP��A#(ce����1�2F0�c��0F0�c��0F0�c��0F0�c��0F0�c�YWf]u�u�a�U�YWf]u�u�a�U�YWf]u�u�a�U�YWf]u�u�a�U�YWf]u�u�a�UG�H��|�קٙf�ɚ�_źjF��a���>���jF?����0���~�-�突q`�������}�Uɺ�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�c_W��a�Y�eB[&�eBkZ��ڄv5�]MhW�fB�Lh� �fB���n&�� �nB����BB� �/&�2�� �LhÄ6LhÄf����1�6F���A#hcm����1�6F���A#hcm����1�6F��澮j�y~h�3$4a�3$4as_W5ϐЄ�������O�3��S5;� G}�F��at}4��h|�F��at}4��3����g��Ɓq`���0~�sչ���߷Ee��Z/�(�3$4QE����y��&�(s_W5ϐ�De�������}]�<CBU�����gHh��R��R��R��R��R��R��R��R��R��R��A#(ce����1�2FP��A#(ce����1�2FP��A#(ce�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�i�`#���1�i�`#���1�������O�3�Γ5;��u�0:�����}(F�s�0:�~�ׇ�a�Y��[�s�U���1_�g�����NSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�e�(�TQ���,SEY���Le�*�2U�e�(d]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u�i�U�YW�f]u�u���u�������u�?}扡��3$����>CB{�����>CB/k�g��L��_�fg���hv�����U��0:������0Z����atF?�Ǚ��[�S�U��80�����0~�s�?~�|��߷��0ϐ_� m�Ж �MhmBk�Մv5�]Mh� m3�m&�� �fB����&�� �NB� �.$����ʄV&�2�
�0��*J#(ce����1�2FP��A#(ce����1�2FP��A#(ce����1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#���1�i�`#���1�i�`#��2D�f�c�>��4;O��|�u�0:�������0���at������2����瞫Ɓ�c�>0��
��=W���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���,SEY���Le�*�2U�e�(�TQ�1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hc-���uU���C۟!� #؟!� #�}]�<CBFP"I��A_�fg���jv~��\5����0�hv���\5����0�hvgg��o�<W
���80>���a���e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]�̺j�u�2�e�Uˬ��YW-��Zf]uf4yf�g�/� �jB�Lh� m3��Lh7�̈́v7��Mhwڸ��ƅ�6.&�2�� �LhÄ6LhÄ6Mhӄ6Mh˄�Lh˄�&4c��0F0�c��0F0�c��0F0�c��4F0�Lc��4F0�Lc��4F�!�4;��iv��y�f�W��F��at}4��h~�F�я��0:�>+��~�x�j`?������0~�s�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE����Le�*�2U�e�(�TQ���,SEY���Le#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F��ƾ�j�y~h�3$4a�3$4ac_W5ϐЄ�������O�3��S5;� G}�F��at}4��h|�F��at}4��3����g��Ɓq`���0~�sձ���߷Ee��Z/�(�3$4QE���y��&�(c_W5ϐ�De�������}]�<CBU�����gHh��R��R��R��R��R��R��R��R��R��R��A#(ce����1��:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:̺�0�ì���:2D�f烾>��4;O���*�U��0:���f����U��0�1_F��ge��o�=W
���|}`���{�J�U�YWf]u��W��0�,�L��ڄ�&�� �jB���6�fB�Lh7�̈́v3��Mhwڝ��.$��m4ϐ�ʄV&�2�
�0�
�4�M�4�#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����0�����g��� M�� M���U�3$4a3C$iv>����L��T��/�Q����atF��C1����atF���~�-�突q`�G�;;���\u����mQEٟ!�*�� MTQ澮j�!��*���U�3$4QE����y��&�(s_W5ϐ�De����������������������������������1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��A#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�i�`#���1�i�`#���1�i� C$iv>����L��d�ίb]5����0�hv���\5����at}VF�����s��80~��Ɓ�Ya����TQ���LSE!�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�Ӭ�N��:ͺ�4�s_W��3�<��37�̈́v3��Mhw����uU���C۟!�� �LheB&�aB*�4;��|�קٙf穚�_��>W
���0:�>�݇b4>W
���0:�>�����[�3�U��80��fwv�����U�����Z?ͯ�˄�Lh˄�&�6�� �jB��Ю&4QEٟ!��*���U�3$4QEY���y��f�(e�(e�(e�(e�(e�(e�(e�(e�(e�(e����1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#���1�i�`#���1�i�`#�I�����4;��<Y��XW
���0:�>�݇b4?W
����|}F���o�e<�\50����q`|V���4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSEY���Le�*�2U�e�(�TQ���,SEY����,c��2F��,c��2F��,c��2F��,c��2F��,c��2F���1�6F���A#hcm����1�6F���A#hcm����1�6F���A# �ˬ�.���̺�2�ˬ�.���̺�2�m�U۬��YWm���f]�ͺj�u�6�m�U;C$iv>����L��T��/�Q����atF��C1����atF���~�-�突q`�G�;;���\�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u�6�m�U۬��YWm���f]�ͺj�u���u{�3��r1�� �LheB+�0�
�0�M�4�M�2�-�2�� �MhmB��Ю&�� m3�m&�̈́v3��Lh7�݄v7�#���1�i�`#���1�i�`#��2D�f�c�>��4;O���*�U��0:���f����U��0�1_F��ge��o�=W
���|}`���{�:Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���,SEY���Le�*�2U�e�(�TQ���,c��2F��,c��2F��,c��2F��,c��2F��,c��2F��,cm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F��Z�u_W5�<?���0���0�뾮j�!� #�f�$��}}��iv����8�s�0:�����}(F�s�0:����ٝ��o�e<�\50����hvg��{��^�uU������ϐ_�Ee��&�(�}]�<CBU�뾮j�!��*�u_W5ϐ�D庯��gHh��r��U�3$4SE)SE)SE)SE)SE)SE)SE)SE)SE)SE)ce����1�2FP��A#(ce����1�2FP��A#(ce����1��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5�W��z5��������O�3�Γ5;��u�0:�����}(F�s�0:�~�ׇ�a�Y��[�s�U���1_�g������uիYW��uիYW��uիYW��uիYW��uիYW��uիYW��u���q'�,����b�!��Lhw�݄v'�� ��_�3$�2�� �LhÄ6LhÄ6Mhӄ6Mh˄�Lh˄�&�6�� �jB��Ю&�̈́f�`#X��1�e�`#X��1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hc-�`��U�3�m��&�`��&�`��U�3$4a[�H��|�קٙf穚�_��>W
���0:�>�݇b4>W
���0:�>�����[�3�U��80��fwv��궯��߷Ee��Z/�(�3$4QE��uU� MTQ�}]�<CBU�m_W5ϐ�De��U�3$4QE��uU� �TQ�TQ�TQ�TQ�TQ�TQ�TQ�TQ�TQ�TQ�A#(ce����1�2FP��A#(ce����1�2FP��A#(ce���c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��4F0�Lc��4F0�Lc��4F�!�4;��iv��y�f�W��F��at}4��h~�F�я��0:�>+��~�x�j`?������0~�s�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���B�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u3몛YW�̺�f�U7����u�ͬ�nf]u�/��//e���Z��ʄV&�aB&�aB�&�iB�&�eB[&�eBkZ��ڄv5�]MhW�fB�Lh� �fB���n&�� �nBFp{�#؟y~h�3$4a�3$4a���0���0�[�H��|�קٙf穚�_��>W
���0:�>�݇b4>W
���0:�>�����[�3�U��80��fwv�����"�(�3��zQE��\De��&�(������ϐ�D��rU������^.���?CBU���ETQ�gHh��r{��*�� �TQ�TQ�TQ�TQ�TQ�TQ�TQ�TQ�TQ�TQ�A#(ce����1�2FP��A#(ce����1�2FP��A#(ce���c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��4F0�Lc��4F0�Lc��4F�!�4;��iv��y�f�W��F��at}4��h~�F�я��0:�>+��~�x�j`?������0~�s�i�(s��"ϴxf��y���LhmBkZ�Ю&�� �jB�Lh� m3��Lh7�̈́v7��Mhw��_�gDh�bB+Z��ʄ6LhÄ6Lhӄf�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hc-�ྯ��g��� M�� M�}_W5ϐЄ�3D�f烾>��4;O�����jF��a���>��jF��a�������2�y�Ɓq`|4����=�U�����}[TQ�gȯ����?CBU����j�!��*�}_W5ϐ�D徯��gHh��r��U�3$4QE�����������������������������������1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��A#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�i�`#���1�i�`#���1�i� C$iv>����L��d�ίb]5����0�hv���\5����at}VF�����s��80~��Ɓ�Ya����TQȺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ��ͺ�ݬ����A�i�����3$�� �nB����$�����ں��ʄV&�2�
�0����7�yf�Ц m�Ж m�Ж �MhmBk�Մv5�]Mh� ��2F��,c��2F��,cm����1�6F���A#hcm����1�6F���A#hcm����1�6F���A#hc}{���������~�����O?�����W��k�����m��O�|��7?~��?|�ӧo~����}��_��
F1�(F�h�
�.�\�y�顽>CB���
(��g�b�>CBK�3·|}:��p����%8���0:������}(F���?���u�����71䏂�Qp4���Q���'Ɓq`���0~���ϟ�-�ϐ_�A���3����
t[>?�-�ϐ�@���3����
t[>?�-�ϐ�@���3����
TQ>?�(�ϐ�L�L�L�L�L�L�L�L�L��O�e����1�2FP��A#(ce����1�2FP��A#(ce����1�2FP��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#��1�a�`#���1�i�`#���1�i� �#�\>��S�L��d�˯aG5����0�pv���\5����at}VF�����;��80~��Ɓ�Ya��w��g�s~�6U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSEs��ϐ�LE̵�>CB3U1����M̵�>#Bs���1U1��� �TQ�\��3$4cb����11��� ���k}}��f�@̵�>CB3F �Z_�!�#s��ϐЌ����gDhb�����k���11��� ���k}}��f�@̵�>CB3F �Z_�!�#s��ϐЮ/5�3�<��̈́���6�̈́v3��Lhw�݄v�վ�j�y~h�3$�2�� �LhÄ6Lhiv�����O�3��S5;� G}�F��at}4��h|�F��at}4��3����g��Ɓq`���0~�s����oO�k�4��O�2�-�2�� �MhmBU�����Ծ�j�!��*J������Ծ�j�!��*J�*J�*J�*J�*J�*J�*J�*J�*J#(ce����1�2FP��A#(ce����1�2FP��A#(ce����1�2F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��4F0�Lc��4F0�Lc"I��1_�fg��'kv~�atF��G��P���at������2����瞫Ɓ�c�>0��
��=W���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���LSE���2Me�*�4U�i�(�TQ���,SEY���Le� �TQ���,SEY��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`#X��1�e�`�_.۟>��?���o~��_�駟_~1�U�m���q�]�����?|�㧟~���?}��W?����X����O�}�]o�ˮo{ܾ����H��gY�Y�8Kgi�,m�����q�6���Y�8Kgi�,m�����q�6���Y�8Kg!��e�_�쿖�-��Zf����k���2��e�_�쿖�/�����M:t����t�ҡ;U��O����g�_߫�80>���q`|B�q�K��_�'��;�{}oƁ�����xb��80>���q`|B/����_�'�qc_�����Ɓ� a|�0������Ɓ� a�a������Ɓ� a|�0�Ɓ������na\����}`�ƅ/�*x������_�U.���_�'�1���\��ǿ>0�Oc|�������gr����0?�?!��_��/0>���q`|B�C�ʡ_`|������0Ƈ~�C�����Ɓ� a��*�~�������U���_�'�1>�9���}`������ǿ>0�Oc|�7r����80>!��ߘ�q`|������0�ƹ���}`���o�/0>���q`|B��������Ɓ� a�/�F.���_�'�1������}`���o�/0>���q`|B��������Ɓ��`<���^`|������0�x3x������_��\��ǿ>0�Oc|��g�=kjo��/�?��a~�B��C��C�����Ɓ� a��f���_�'�1>��9���}`����o��/0>���q`|B�C��C�����Ɓ� a��V���_���~+�~����������ǿ>0�Oc|�f`���80>!�'�q.���_�'�1��[����}`���o�/0>���q`|B��������Ɓ� a�/�V.���_�'�1��[����}`����s����80>�_�u.���_�'�1���\��ǿ>0�Oc|����}`������{��^��/�?��a~�B��C�Ρ_`|������0Ƈ~�C�����Ɓ� a��:�~�������u���_�'�1>����ǿ>0�Ocz�W/���ǿ>0���?��8�~��������%�~��������eƁ�����xb�/0>���q`|B��z��/0>���q`|B��z��/0>���q`|B��z��/0>���q`|B��z��/0>���q`|B��z��/0>���q`|B���^`|�����|0.|�W����}`����r����80>!��^�/0>���q`|B��?{�9S{�?+��}�某��Яr����80>!��_��/0>���q`|B�C�ʡ_`|������0Ƈ~�C�����Ɓ� a��*�~����������ǿ>0����F���_�'�1>�9���}`����o��80>���q`|BO�\��ǿ>0�Oc|�7r����80>!����^`|������0�x#x������_��\��ǿ>0�Oc|�7r����80>!����^`|�����|0��o�/0>���q`|B��������Ɓ� a�/�f.���_�'�1������5�7s����0?�?!���̡_`|������0Ƈ~3�~����������ǿ>0�Oc|�7s����80>!���̡_`|������0Ƈ~+�~�������x�C��C�����Ɓ� a��V���_�'�1>�[30�}`���8x������_�\��ǿ>0�Oc|��r����80>!����^`|������0�x+x������_�\��ǿ>0�Oc|����}`�ƍ/�:x������_�u.���_�'�1���\��ǿ>0�Oc|��g�=kj�s����0?�?!��_��/0>���q`|B�C�Ρ_`|������0Ƈ~�C�����Ɓ� a��:�~�������u���_�'�1=�/%J�e�gR��-���ђ?Z��G�_��˷�~w����_mU������.����0���<>������]{�_�~y��������_�0:���fwvF��h���_�g����/�����l�m~����QC��=ͯ���Z?Mh˄�Lh��/���L��yf�gHhW�Մv5�m&�̈́���n&�� �fB����&�; �.$�����bB+Z�����9��0�
�4�M�4�-�2�#(ce����1�2FP��A#(ce����1�2FP���0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0���K5yf�gZ<S&�2�����s�&�aBK�3�·|}��iv����W���U��0�1_F�����\5����at}VF�����s��80~��Ɓ�Ya��窟?C��=ͯ���Z?Mh˄�Lh˄�&�6�� �jB��Ю&�̈́���6�̈́v3��Lhw�݄v'�-SEY���Le�*�2U�e�(�TQ���,c��2F��,c��2F��,c��2F��,c��2F��,c��2F��,c�A#hcm���t��+y��3��3$�aB�&�iB�&�eB[&�eBkZ��ڄv5�]MhW�fB�Lh� �fB���n&�� �nB������B۟y~h�3$�2� #؟!� #؟!��ٙf�C�>��4;O���������?����O�|�/?������'�|��~�w�����=�f��������eݷ���������W�u~��������ï�R�����������7����7����/�������~����/�;��_~��b�����ݧ������_���y����?���������������������o_?`o��uy{�>�����n�����O�o~a��_F�������~�q��zy�����������w���ϟ��?��_��ӏ?��^/��'������������������7�i���7���!���%�_�����hvg�ᛔ?��20����hvg��{�]�~���Vt*�g��S1��P� Mt*�>j�!��N��gB�3$4ѩ��L�y��&:s� 5ϐ�D�b�3����T��T��en���K�gHheB&�aB&�iB�&�iB[&�eB[&�6�� �MhW�Մv5�m&�̈́���n&�� �fB����&�; m\Hh��0F0�c��0F0�c��0F0�c��0F0�c��0F0�c��0F0����gn/e����݄v7��Ih�BB�ڼ��ʄV&�2�
�0��ٙf�C�>��4;O���*fB��0:���f���7ܟ>�]F��a��y���o�e<�\50����q`|V������oO�k�4��O�2�-�2�� �MhmB��Ю&�� m3�m&4SE���2Me�*�4U�i�(�TQ���,SEY���Le�*�2U�e�(�TQ�1�e�`#X��1�e�`#X��1�e�`]_�N����l&�̈́���n&�� �fB����&�; �/$�����bB+Z��ʄ6LhÄ6Lhӄ6Mhӄ�Lh˄�LhmBkZ�Ќ�1�6F���A#hcm���/�yf�g�ӟY/�m����ϐ�ʄV&�2�
�0�
Z��iv>����L��T��/�Q����atF��C1����atF��C1_H}M���� s��Ƈgn�������_�������/���_|�_�����_��K~��o��/�����ߞ������w�����|���}������?����˨�2��������O��-Z�[����_�����?��_~�{�������߰4�������i~��g�i~�^&�eB[&�6�� �MhW�Մv5�m&�̈́���n&����_�����?��������^u�ּ����O�|��7?~��?|�ӧo~�����ߝ�o��XG�$��𫴷�W�Q7��C��Zc9�c��^H
Ѡ��ꯉ�`���/�����û����|������^��Ǿ�ߟ�㿿��߿�?}����/�~�N0_^�~��˟O������^~���ߞ������������/������e�ꅉr�!�eeeeeeeeee��k��a�f��k��a�f��k��a�f��k��a�f"��~�rf�3 �� m^Hh�bB&�aB&�iB�&�iBZ���&�4�� �LheB+�Մv5�]Mh� �0�&�eB[&�eB3D0
LCa� �!�0D��A"Ca��wHڲ�ϯo˾-����q���������[��P�_�vGwG���wGwG?jG�~�x�q�.�.�.�.�[�{�2~��t@%��FE ���QQ¨(aT�0*J%��FE ���QQ¨(aT�0*J%��FE ���QQҨ(iT�4*J%���FEI���QQҨ(i�
�!�4D���A"�z���Iq��|1gHhW�aB;Lh� m�Ж m�ж m��6 �.$�����bB&�aB&�iB�&�iBZ���&�4�� �Lh��A"(Ce���!�2DP��A"(Ce���9�jμ}h�� �� MA��� MA�B�#w���e����6;��5��4;R���jwtwtwtw���}����U��������o���;��[�[>W�2�2�2�2�5�G/��|�Z�F���-T���Z/T�� M�(unĚ3$4��ԹkΐЄ�R�F�9CB*J�[�� M�(u���3$4��������������������C��0D0C��0D0C��0D0C�x�AΤ8��/� m�ж m��6 m^Hh�BB��0�
�0�M�4�MZ��&�4�� -MheB+Z�Ю&�� �jB;Lh��!�i�`"���!�i�`"Ca� �!�0D��A"C=D�f�}~}��mv>���K��vGwGwGwGߚ݇�h�\�;�;�>��;�;�Q;��[��>W�2�2�ϯ�2�2~�2~��aT�0*J%��FE ���QQ¨(aT�0*J%��FE ���QQ¨(aT�0*J%��FEI���QQҨ(iT�4*J%���FEI���!�4D���A"HCi�
�!�4D���A"HCi�
�!�4D���A"(Ce���!�2DP��A"(Ce���!�2DP��A"(Ce����y&9����|1gHh� m�Ж m�ж m��6�z���3o�y��6LhÄ6Lhӄ6MhS��fg��w��mv���Pf�O�Q?W���5�����jwtwtwtw���=zG�~�x��]�]�]�]Ʒf��e���U�纪���k}���iBKZ��ʄV&�2�]MhBE9ϐЄ�r�!� �z���3$4��\�uUs��fT�aT�aT�aT�aT�aT�aT�aT�aT�aT�a�`"��!�a�`"��!�a�`"��!�a�`"��!�a�`"��!�a�`"���!�i�`"���!�i�`"���!�i�`"���!�i�`"���!�i�`"���!�i�`"���!�i�`"���A"Ca� �!�0D��A���y�_�fg��fv���������ѷf��:�?W�ϯ��~Ԏ~����U������뻌�������j%��FE ���QQ¨(aT�0*J%��FE ���QQ¨(aT�0*J%��FE ���QQҨ(iT�4*J%���FEI���QQҨ(i�
�!�4D���A"HCi�
�!�4D���A"HCi�
�!�4D���A"(Ce���!�2DP��A"(Ce���!�2DP��A"(Cd]�j�U�f]�j�U�f]�j�U�f]�j�U�f]�j�U�f]�0몇YW=̺�a�U��z�u�ì�f]�0�G���y�_�fg��ev���s���������[��P���vGwGwGwGߚݣw�뷌�|��e�e�e�e|kv�^���\�0몇YW=̺�a�U��z�u�ì�f]�0몇YW=̺�a�U��z�u�ì�f]�0몇YW=̺�a�U��z�u���,r&ř�|1gHhÄ6Mhӄ6MhaBZ��҄�&�4�� �LheB��Ю&�� �0�&�Ä�Lh˄�Lhۄ�Mh��6/$�i�`"���!�i�`"���!�i�`"���!�i�`"���!�i�`"���!�i�`"���!�i�`"���!�i� �!�0D��A"Ca� �I�����mv���`f�/������}kv���s������������G���oo�\�˸��>��˸��Q��}���QQ¨(aT�0*J%��FE ���QQ¨(aT�0*J%��FE ���QQ¨(aT�0*J%���FEI���QQҨ(iT�4*J%�����A"HCi�
�!�4D���A"HCi�
�!�4D���A"HCi���!�2DP��A"(Ce���!�2DP��A"(Ce���!�2DP��A"(Ce���!�2DP��A "X纪9����gHh��3$4A�\W5gHh�V���y�_�fg��ev���s���������[��P���vGwGwGwGߚݣw�뷌�|��e�e�e�e|kv�^���\u�����PQ�3�k�PQ�3$4���s]՜!� e��� M�(�\W5gHhBEY纪9CB*�:�U��QQ�QQȺ�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.���̺�2�ˬ�.��z��Wr&ř�|1gHhÄ6Mhӄ6Uhmv��y�_�fg��fv���������ѷf��:�?W�ϯ��~Ԏ~����U������뻌�������j��Z�k}���iBKZ��ʄV&�2�]MhW�Մv���aB[&�eB[&�mB�&�MB� -���FEI���QQҨ(iT�4*J%
�!�4D���A"HCi�
�!�4D���A"HCi�
�!�4D���A"(Ce���!�2DP��A"(Ce���!�2DP��A"(Ce���!�2DP��A"(Ce���!�D��uUs��C;ϐ��gHh����jΐ��"i��N����6;���I9���������ѷf��:?W���5�G���oo�\�˸˸˸���������>�U��m���g��z���gHhBE�纪9CB*�>�U��PQ���jΐЄ���uUs��&T�}���3$4��������������������C��0D0C��0D0C��0D0C��0D0C��0D0C��4D0
LC��4D0
LC��4D0
LC��4D0
LC��4D0
|?����������ח�����oϟ�c�e^������<}}�����|y�����_��?��-Ę1�A�icĘ1�A�icĘ1� �k�f�u���m�Z��k�f�u���m�Zw/��*z�_ߪh�����s��������ѷf��:���ϯ��~Ԏ~����_������뻌�������+�k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u���m�Z��k�f�u�����s�� ��PK8>a�'� ��( PK m�([8>a�'� ��( �� logUT �3�hPK : a�
Delete flows.json
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/flows.json
Delete flows.json
Removes the flow's flows.json (the Node-RED definition file) without removing the flow itself. The flow runtime continues to exist but starts with an empty editor on the next Start Flow.
Use this to reset a flow's design while keeping its ID, memory limit, and credentials.
Endpoint
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/flows.json
The option/flows.json suffix selects only the flows.json file as the delete target. Other targeted values: instance (whole flow), flows_cred.json (credentials), logs, node_modules.
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID. |
No request body.
Response
200 OK on success.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
Recoverability
There is no undo. Export flows.json via Download Flow File first if you may want to restore.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 204 No Content
Delete Flows Credential JSON
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/flows_cred.json
Delete Flows Credential JSON
Removes the flow's encrypted credential blob flows_cred.json. Every node that uses credentials (HTTP basic auth, MQTT password, API keys, etc.) loses them and must be re-entered in the Node-RED editor.
Use this when rotating secrets, when migrating a flow between encryption keys, or to clear forgotten credentials.
Endpoint
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/flows_cred.json
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID. |
No request body.
Response
200 OK on success.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
Operational note
If you delete credentials on a running flow, the runtime continues to hold the in-memory credentials until Stop Flow / Start Flow. The deletion only affects what is reloaded on next start.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 204 No Content
Delete Flows Logs
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/logs
Delete Flows Logs
Removes the flow's log directory contents. Use this to free disk space or to start a clean log window before reproducing an issue. Equivalent to truncate -s 0 per log file plus deletion of rotated archives.
Endpoint
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/logs
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID. |
No request body.
Response
200 OK on success. New log lines from a running flow will start accumulating in fresh files immediately.
For an archive snapshot before deleting, call Download Flow Logs Binary first.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 204 No Content
Delete Flow Node Modules
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/node_modules
Delete Flow Node Modules
Wipes the flow's node_modules directory. The next Start Flow will re-install every contrib module referenced by flows.json. Use this to:
- Recover from a corrupted
node_modulesdirectory. - Force-upgrade contrib modules whose versions are pinned loosely.
- Reclaim disk space on a flow that no longer uses many modules.
Endpoint
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/option/node_modules
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID. |
No request body.
Response
200 OK on success. The next start downloads and installs modules from scratch, which can take from a few seconds to a few minutes depending on the flow's module manifest and the device's internet connectivity.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
Operational note
For online-restricted devices, ensure your local npm registry mirror is reachable before triggering this. A wipe with no reachable registry leaves the flow unable to start until modules are restored manually.
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 204 No Content
Flows Manager Prometheus Metrics
GET {{edgeUrl}}/flows-manager/metrics
Flows Manager Prometheus Metrics
Returns Flows Manager metrics in the Prometheus exposition format, for direct Prometheus scraping. The DeviceHub, DataHub, Analytics and Integration services expose the same kind of endpoint.
Endpoint
GET {{edgeUrl}}/flows-manager/metrics
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Parameters
None.
Response
200 OK -- text/plain. Standard Prometheus exposition.
| Metric | Type | Description |
|---|---|---|
flows_count |
gauge | Number of flows defined on the device. |
# HELP flows_count
# TYPE flows_count gauge
flows_count 1
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
Response
Status: 200 OK
# HELP flows_count
# TYPE flows_count gauge
flows_count 1
Create Module Upload Session
POST {{edgeUrl}}/flows-manager/flows/{{flow_id}}/upload_modules/v2
Create Module Upload Session
Opens a resumable upload session for a flow's Node-RED modules, the first step of the Upload Modules action on a flow card in the LE UI. The file is a .zip of the modules (the UI's file picker accepts application/zip only).
The full sequence:
- This call, which returns the session
id. Upload Module Chunkonce per chunk, in order. The UI sends chunks of 1,024,000 bytes. When the last byte arrives the response says"done": true, the server extracts the archive and the session ends by itself.Get Module Upload Sessionat any point before that to read how many bytes the server holds, for example to resume after a dropped connection.Close Module Upload Sessionto abandon an unfinished upload.
A flow has at most one session. Calling this again replaces the open session: the old id then answers session is not match.
The archive must contain explicit directory entries (the default for zip -r and most archivers). An archive that lists only files fails on the last chunk with 500 and creating output file: ... no such file or directory.
Endpoint
POST {{edgeUrl}}/flows-manager/flows/{{flow_id}}/upload_modules/v2
Content-Type: application/json
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID from List Flows. |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
size |
integer | Yes | Total file size in bytes. The upload is complete when this many bytes have arrived. |
name |
string | No | File name. |
{
"size": 445,
"name": "node_modules.zip"
}
Response
200 OK -- application/json. The session id, used as {{flow_upload_session_id}} by Upload Module Chunk and Get Module Upload Session.
{ "id": "c23c8775-9949-480c-8afe-103ebcddb859" }
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Request Body
{
"size": 445,
"name": "node_modules.zip"
}
Response
Status: 200 OK
{
"id": "c23c8775-9949-480c-8afe-103ebcddb859"
}
Upload Module Chunk
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}/upload_modules/v2/resume/{{flow_upload_session_id}}
Upload Module Chunk
Sends one chunk of the module .zip into the session opened by Create Module Upload Session. Repeat for each chunk in order. The last chunk completes the upload; there is nothing to close afterwards.
Endpoint
PUT {{edgeUrl}}/flows-manager/flows/{{flow_id}}/upload_modules/v2/resume/{{flow_upload_session_id}}
Content-Type: multipart/form-data
Upload-Offset: <bytes already sent>
Upload-Length: <upper bound for this chunk>
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID from List Flows. |
| Path | {{flow_upload_session_id}} |
Yes | Session id from Create Module Upload Session. |
Headers
| Name | Description |
|---|---|
Upload-Offset |
Where this chunk starts in the file: 0 for the first chunk, then the offset returned by the previous call. The server writes at this position as given and does not check it against what it already holds, so a wrong value corrupts the file. |
Upload-Length |
The most bytes the server reads from this request. Bytes past it are dropped (a 100-byte chunk sent with Upload-Length: 1 stores 1 byte). The LE UI sends the chunk size plus 199; any value at least the chunk size works. |
Request body
multipart/form-data with one file part:
| Part | Description |
|---|---|
uploadFile |
The chunk's bytes. |
curl -k -u "$TOKEN:" -X PUT \
-H "Upload-Offset: 0" -H "Upload-Length: 1024199" \
-F "uploadFile=@chunk-000" \
"$EDGE/flows-manager/flows/2/upload_modules/v2/resume/$SESSION"
Response
200 OK -- application/json.
| Field | Type | Description |
|---|---|---|
id |
string | Session ID. |
offset |
integer | Bytes the server now holds. Send it as Upload-Offset on the next chunk. |
done |
boolean | true once offset reaches the session size. The server then extracts the archive and ends the session. |
{ "id": "c23c8775-9949-480c-8afe-103ebcddb859", "offset": 445, "done": true }
A session that was replaced by a newer Create Module Upload Session answers 400 with session is not match.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Headers
| Key | Value |
|---|---|
| Upload-Offset | 0 |
| Upload-Length | 1024199 |
Request Body
Response
Status: 200 OK
{
"id": "c23c8775-9949-480c-8afe-103ebcddb859",
"offset": 445,
"done": true
}
Get Module Upload Session
GET {{edgeUrl}}/flows-manager/flows/{{flow_id}}/upload_modules/v2/{{flow_upload_session_id}}
Get Module Upload Session
Returns how many bytes of an open module upload the server holds. Use it to resume an interrupted upload: send the next chunk with Upload-Offset set to this offset.
Endpoint
GET {{edgeUrl}}/flows-manager/flows/{{flow_id}}/upload_modules/v2/{{flow_upload_session_id}}
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID from List Flows. |
| Path | {{flow_upload_session_id}} |
Yes | Session id from Create Module Upload Session. |
Response
200 OK -- application/json.
{ "offset": 0 }
| Status | Body message | When |
|---|---|---|
404 |
session is not found |
No open session: the upload finished, was closed, or never started. |
500 |
session is not match |
The flow has a newer session than this id. |
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 200 OK
{
"offset": 0
}
Close Module Upload Session
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/upload_modules/v2
Close Module Upload Session
Discards the flow's open module upload session and whatever it received. Use it to abandon an upload; a completed upload ends its session by itself and needs no close.
The call takes no session ID: it closes whichever session the flow has, and still answers 204 when there is none. Note the LE UI's own close request (DELETE .../upload_modules/v2/<session id> with a sessionId header) is not a valid route on 4.0.x and answers 405.
Endpoint
DELETE {{edgeUrl}}/flows-manager/flows/{{flow_id}}/upload_modules/v2
Authentication
HTTP Basic Auth. Username is your API token, password is empty. Tokens are managed under System > Access Control > Tokens.
Path parameters
| Location | Name | Required | Description |
|---|---|---|---|
| Path | {{flow_id}} |
Yes | Flow ID from List Flows. |
No request body.
Response
204 No Content, empty body.
Errors
| HTTP status | When it happens |
|---|---|
400 Bad Request |
Missing or malformed query/body parameter. |
401 Unauthorized |
Missing or invalid credentials. |
403 Forbidden |
Token lacks permission for this operation. |
404 Not Found |
Target entity does not exist. |
5xx |
Service is unreachable, restarting, or internally errored. Inspect device logs under System > Support. |
TLS note: edge devices use a self-signed certificate by default. Either install the device CA in your client trust store or disable certificate verification when calling this endpoint directly.
Response
Status: 200 OK