Teqlogy API / EnergyMate

EnergyMate

Smart auto changeover for 3 to 5 meters (3 · 3A · 4 · 3X · 4X · 5X). Read live voltage, current, power, power factor and energy for every meter, set meter quotas, keep a history and schedule resets — and, on the X models and on the EnergyMate-3 / 4 boards with the LCD-edition firmware, pause meters on a timetable and get overcurrent protection.

Any key a read-only key and a full key may call it Full key only a full key only

Models and variants

The type field of a device tells which one it is. Everything on this page applies to all of them unless an endpoint says otherwise.

typeMetersWhat it is
EnergyMate-33Three-meter auto changeover with a 16×2 LCD and three manual buttons (no touch screen). A board on the LCD-edition firmware (it reports ampMax) has every X feature below too; an older board does not.
EnergyMate-3A3Three-meter controller on the alternative hardware. Identical API to EnergyMate-3.
EnergyMate-44Four-meter auto changeover with a 16×2 LCD and three manual buttons (no touch screen). Same as EnergyMate-3: the LCD-edition firmware adds the X features.
EnergyMate-3X3Three-meter X model with a touch screen and no buttons: everything above plus meter readings, OFF / ON schedules and amp protection.
EnergyMate-4X4Four-meter X model with a touch screen and no buttons.
EnergyMate-5X5Five-meter X model with a touch screen and no buttons.

What each variant can do

Feature33A43X4X5X
Live readings and meter quotas
device object, telemetryUpdate events
Energy history
GET …/energy-history
Set quotas, switch meters, reset a meter
WebSocket commands
Scheduled meter resets and reset reports
/api/resets, /api/reset-reports
Voltage protection range
updateConfig voltMin / voltMax
Lifetime register and meter readings
GET / POST …/calibrations, meters[].lifetimeWh
Meter OFF / ON schedules (one-off and weekly)
/api/meter-off
Amp (overcurrent) protection
ampMax / ampTrip, updateConfig ampMax, ampRestart
Quota-end notice
notification type meter_limit
The X models (3X, 4X, 5X) have the newer firmware, and so do EnergyMate-3 / 4 boards that were updated to the LCD-edition firmware (their telemetry carries ampMax). On an older board the X-only endpoints answer 409 with the code that says why (for example METER_OFF_UNSUPPORTED).

The device object

Every endpoint that returns a device returns this object (also inside GET /api/devices/me and in the WebSocket deviceUpdated event). A key never sees the public IP address of a device or its internal settings.

Every device
_id
stringDatabase id of the device record.
deviceId
stringThe hardware id. Use it in every path (:deviceId).
userId
stringId of the account that owns the device.
name
stringThe name shown in the apps. Change it with PATCH …/preferences.
type
stringThe exact model, see the variants table.
model
stringModel text reported by the device.
firmware
stringFirmware version, e.g. 1.0.14.
status
booleantrue while the device is connected right now (online).
lastSeen
ISO dateWhen the device last reported.
rssi
number | nullWi-Fi signal in dBm (a negative number, closer to 0 is better). null / absent when the firmware does not report it.
reconnectCount
numberHow many times the device has reconnected.
uptimeSince
ISO date | nullWhen the current connection started.
createdAt / updatedAt
ISO dateWhen the record was created / last changed.
relays
number[]Output states, 1 = ON, 0 = OFF.
config
objectSettings stored for the device — see the table of this device family.
Readings and protection (EnergyMate)
voltage, current, power, frequency, pf
numberThe latest reading of the meter that is measured right now: volts, amps, watts, hertz and power factor.
energy
numberEnergy counter of the device in kWh, as the device reports it.
voltMin, voltMax
numberThe voltage protection range of the device, in volts.
meters
object[]One entry per meter, see the table below.
counterEpoch
numberX models and LCD-edition 3 / 4: changes when the device counters are reset (factory reset). A reading is only valid inside one epoch.
ampMax
numberX models and LCD-edition 3 / 4: amp protection threshold in amps, 0 = off. Absent on firmware without amp protection.
ampTrip
numberX models and LCD-edition 3 / 4: 0 = fine, otherwise the number (1…N) of the meter that was stopped by overcurrent.
ampTripInfo
objectX models and LCD-edition 3 / 4, only while tripped: { meter, current, voltage, power, pf, used, limit, seq }.
meters[] — one entry per meter
index
number1-based meter number as the device reports it (Meter 1 = 1).
voltage, current, power, frequency, pf
numberReadings of this meter. One sensor rotates over the meters, so a meter that is not running shows 0.
energy
number“Used”: the quota counter in kWh. It restarts when a new limit is set, on a scheduled reset and on resetMeter.
sessionEnergy
numberkWh used in the current run of this meter.
limit
numberThe quota of this meter in kWh. 0 = no quota set (or the quota has ended).
lifetimeWh
numberX models and LCD-edition 3 / 4: lifetime energy of this meter in Wh. It never restarts on a reset or a new limit. Absent on older firmware.
off
booleanX models and LCD-edition 3 / 4: true while the meter is paused by a schedule (its limit and Used are kept). Absent on older firmware.
config (EnergyMate)
billRate
numberPrice per kWh in your currency, used by the apps for cost figures.
alertThresholds
object{ maxPower, maxCurrent, maxVoltage, minVoltage } — when a reading crosses one, you get a notification.
Numbering. meters[].index counts from 1, but meterIndex in REST requests (schedules, resets, readings) counts from 0 — meters[0] is Meter 1. WebSocket commands use 1-based meter.
json · EnergyMate-3X
{
  "_id": "65f1a2b3c4d5e6f708192a11",
  "userId": "65f1a2b3c4d5e6f708192a01",
  "deviceId": "ddeeff445566",
  "name": "Main Panel",
  "type": "EnergyMate-3X",
  "model": "Teqlogy SmartDevice",
  "firmware": "1.0.0",
  "status": true,
  "rssi": -58,
  "relays": [1, 0, 0, 1, 0, 0],
  "voltage": 231.4,
  "current": 4.2,
  "power": 950.1,
  "energy": 12.345,
  "frequency": 50,
  "pf": 0.98,
  "voltMin": 190,
  "voltMax": 240,
  "meters": [
    {
      "index": 1,
      "voltage": 231.4,
      "current": 4.2,
      "power": 950.1,
      "energy": 4.25,
      "sessionEnergy": 1.25,
      "frequency": 50,
      "pf": 0.98,
      "limit": 10,
      "lifetimeWh": 152250,
      "off": false
    },
    {
      "index": 2,
      "voltage": 0,
      "current": 0,
      "power": 0,
      "energy": 6.5,
      "sessionEnergy": 0,
      "frequency": 0,
      "pf": 0,
      "limit": 10,
      "lifetimeWh": 210002,
      "off": true
    },
    {
      "index": 3,
      "voltage": 0,
      "current": 0,
      "power": 0,
      "energy": 0,
      "sessionEnergy": 0,
      "frequency": 0,
      "pf": 0,
      "limit": 10,
      "lifetimeWh": 0,
      "off": false
    }
  ],
  "counterEpoch": 2864434397,
  "ampMax": 16,
  "ampTrip": 0,
  "config": {
    "billRate": 12.5,
    "alertThresholds": {
      "maxPower": 5000,
      "maxCurrent": 25,
      "maxVoltage": 240,
      "minVoltage": 190
    }
  },
  "lastSeen": "2026-10-03T14:20:05.000Z",
  "reconnectCount": 5,
  "uptimeSince": "2026-10-02T06:00:00.000Z",
  "createdAt": "2026-08-05T10:00:00.000Z",
  "updatedAt": "2026-10-03T14:20:05.000Z"
}

Endpoints

25 endpoints work with EnergyMate. All of them take the base URL https://teqhome.teqlogy.com and your key in the Authorization header.

Devices
GET/devices/me Any key
GET/devices/d/:deviceId Any key
GET/devices/shared-with-me Any key
Settings
PATCH/devices/:deviceId/preferences Full key only
History
GET/devices/:deviceId/energy-history Any key
Meter readings
GET/devices/:deviceId/calibrations Any key
POST/devices/:deviceId/calibrations Full key only
Schedules and reports
GET/meter-off/:deviceId Any key
POST/meter-off/schedule Full key only
POST/meter-off/rule Full key only
DELETE/meter-off/rule/:id Full key only
DELETE/meter-off/:id Full key only
POST/resets/schedule Full key only
GET/resets/:deviceId Any key
DELETE/resets/:id Full key only
GET/reset-reports/device/:deviceId Any key
GET/reset-reports/:id Any key
Notifications
GET/notifications Any key
PATCH/notifications/:id/read Full key only
PATCH/notifications/read-all Full key only
DELETE/notifications/:id Full key only
Away Mode
GET/user/away-mode Any key
POST/user/away-mode/enable Full key only
POST/user/away-mode/disable Full key only
Real time
POST/ws-ticket Any key

Devices

List your devices and read their state.

GET/api/devices/me Any key

List your devices

Every device you own, most recently active first. Devices that other people shared with you are not in this list — see “Devices shared with you”.

  • The objects differ by device family: PowerMatrix-8 devices carry relays and config, EnergyMate devices carry meters and readings. Use type to tell them apart.
Request
bash
curl "https://teqhome.teqlogy.com/api/devices/me" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "devices": [
    {
      "_id": "65f1a2b3c4d5e6f708192a11",
      "userId": "65f1a2b3c4d5e6f708192a01",
      "deviceId": "ddeeff445566",
      "name": "Main Panel",
      "type": "EnergyMate-3X",
      "model": "Teqlogy SmartDevice",
      "firmware": "1.0.0",
      "status": true,
      "rssi": -58,
      "relays": [1, 0, 0, 1, 0, 0],
      "voltage": 231.4,
      "current": 4.2,
      "power": 950.1,
      "energy": 12.345,
      "frequency": 50,
      "pf": 0.98,
      "voltMin": 190,
      "voltMax": 240,
      "meters": [
        {
          "index": 1,
          "voltage": 231.4,
          "current": 4.2,
          "power": 950.1,
          "energy": 4.25,
          "sessionEnergy": 1.25,
          "frequency": 50,
          "pf": 0.98,
          "limit": 10,
          "lifetimeWh": 152250,
          "off": false
        },
        {
          "index": 2,
          "voltage": 0,
          "current": 0,
          "power": 0,
          "energy": 6.5,
          "sessionEnergy": 0,
          "frequency": 0,
          "pf": 0,
          "limit": 10,
          "lifetimeWh": 210002,
          "off": true
        },
        {
          "index": 3,
          "voltage": 0,
          "current": 0,
          "power": 0,
          "energy": 0,
          "sessionEnergy": 0,
          "frequency": 0,
          "pf": 0,
          "limit": 10,
          "lifetimeWh": 0,
          "off": false
        }
      ],
      "counterEpoch": 2864434397,
      "ampMax": 16,
      "ampTrip": 0,
      "config": {
        "billRate": 12.5,
        "alertThresholds": {
          "maxPower": 5000,
          "maxCurrent": 25,
          "maxVoltage": 240,
          "minVoltage": 190
        }
      },
      "lastSeen": "2026-10-03T14:20:05.000Z",
      "reconnectCount": 5,
      "uptimeSince": "2026-10-02T06:00:00.000Z",
      "createdAt": "2026-08-05T10:00:00.000Z",
      "updatedAt": "2026-10-03T14:20:05.000Z"
    },
    {
      "_id": "65f1a2b3c4d5e6f708192a10",
      "userId": "65f1a2b3c4d5e6f708192a01",
      "deviceId": "aabbcc112233",
      "name": "Living Room",
      "type": "PowerMatrix-8",
      "model": "PowerMatrix",
      "firmware": "1.0.14",
      "status": true,
      "rssi": -62,
      "relays": [1, 0, 1, 0, 0, 0, 0, 0],
      "config": {
        "relayMeta": [
          { "index": 0, "name": "Main Light", "icon": "light_ceiling" },
          { "index": 1, "name": "Fan", "icon": "fan" }
        ],
        "automations": [
          {
            "id": "auto_001",
            "name": "Morning Lights",
            "enabled": true,
            "relayIndex": 0,
            "targetState": "ON",
            "kind": "weekly",
            "time": "07:00",
            "days": [1, 2, 3, 4, 5],
            "timezoneOffsetMinutes": 300,
            "lastRunKey": null,
            "lastRunAt": null,
            "lastError": null
          }
        ],
        "irCodes": [
          {
            "id": "ir_abc123",
            "relayIndex": 0,
            "code": "F30CFF00",
            "name": "TV Power"
          }
        ],
        "relayTimers": [],
        "billRate": 0,
        "scenes": []
      },
      "lastSeen": "2026-10-03T14:20:00.000Z",
      "reconnectCount": 3,
      "uptimeSince": "2026-10-01T08:00:00.000Z",
      "createdAt": "2026-08-01T10:00:00.000Z",
      "updatedAt": "2026-10-03T14:20:00.000Z"
    }
  ]
}
GET/api/devices/d/:deviceId Any key

Get one device

The full current state of one device: online or not, relays or meters, readings, settings.

Path parameters
deviceIdrequired
stringThe hardware id of the device (the deviceId of the device object).
  • Owner, or a device shared with you (view or control), or a dealer assignment.
  • The answer is the same object as in the list. A key never sees the device’s public IP address or internal settings.
Request
bash
curl "https://teqhome.teqlogy.com/api/devices/d/aabbcc112233" \
  -H "Authorization: Bearer $KEY"
Response 200PowerMatrix-8
json
{
  "ok": true,
  "device": {
    "_id": "65f1a2b3c4d5e6f708192a10",
    "userId": "65f1a2b3c4d5e6f708192a01",
    "deviceId": "aabbcc112233",
    "name": "Living Room",
    "type": "PowerMatrix-8",
    "model": "PowerMatrix",
    "firmware": "1.0.14",
    "status": true,
    "rssi": -62,
    "relays": [1, 0, 1, 0, 0, 0, 0, 0],
    "config": {
      "relayMeta": [
        { "index": 0, "name": "Main Light", "icon": "light_ceiling" },
        { "index": 1, "name": "Fan", "icon": "fan" }
      ],
      "automations": [
        {
          "id": "auto_001",
          "name": "Morning Lights",
          "enabled": true,
          "relayIndex": 0,
          "targetState": "ON",
          "kind": "weekly",
          "time": "07:00",
          "days": [1, 2, 3, 4, 5],
          "timezoneOffsetMinutes": 300,
          "lastRunKey": null,
          "lastRunAt": null,
          "lastError": null
        }
      ],
      "irCodes": [
        {
          "id": "ir_abc123",
          "relayIndex": 0,
          "code": "F30CFF00",
          "name": "TV Power"
        }
      ],
      "relayTimers": [],
      "billRate": 0,
      "scenes": []
    },
    "lastSeen": "2026-10-03T14:20:00.000Z",
    "reconnectCount": 3,
    "uptimeSince": "2026-10-01T08:00:00.000Z",
    "createdAt": "2026-08-01T10:00:00.000Z",
    "updatedAt": "2026-10-03T14:20:00.000Z"
  }
}
200 · EnergyMate-3X
json
{
  "ok": true,
  "device": {
    "_id": "65f1a2b3c4d5e6f708192a11",
    "userId": "65f1a2b3c4d5e6f708192a01",
    "deviceId": "ddeeff445566",
    "name": "Main Panel",
    "type": "EnergyMate-3X",
    "model": "Teqlogy SmartDevice",
    "firmware": "1.0.0",
    "status": true,
    "rssi": -58,
    "relays": [1, 0, 0, 1, 0, 0],
    "voltage": 231.4,
    "current": 4.2,
    "power": 950.1,
    "energy": 12.345,
    "frequency": 50,
    "pf": 0.98,
    "voltMin": 190,
    "voltMax": 240,
    "meters": [
      {
        "index": 1,
        "voltage": 231.4,
        "current": 4.2,
        "power": 950.1,
        "energy": 4.25,
        "sessionEnergy": 1.25,
        "frequency": 50,
        "pf": 0.98,
        "limit": 10,
        "lifetimeWh": 152250,
        "off": false
      },
      {
        "index": 2,
        "voltage": 0,
        "current": 0,
        "power": 0,
        "energy": 6.5,
        "sessionEnergy": 0,
        "frequency": 0,
        "pf": 0,
        "limit": 10,
        "lifetimeWh": 210002,
        "off": true
      },
      {
        "index": 3,
        "voltage": 0,
        "current": 0,
        "power": 0,
        "energy": 0,
        "sessionEnergy": 0,
        "frequency": 0,
        "pf": 0,
        "limit": 10,
        "lifetimeWh": 0,
        "off": false
      }
    ],
    "counterEpoch": 2864434397,
    "ampMax": 16,
    "ampTrip": 0,
    "config": {
      "billRate": 12.5,
      "alertThresholds": {
        "maxPower": 5000,
        "maxCurrent": 25,
        "maxVoltage": 240,
        "minVoltage": 190
      }
    },
    "lastSeen": "2026-10-03T14:20:05.000Z",
    "reconnectCount": 5,
    "uptimeSince": "2026-10-02T06:00:00.000Z",
    "createdAt": "2026-08-05T10:00:00.000Z",
    "updatedAt": "2026-10-03T14:20:05.000Z"
  }
}
Errors of this endpoint
StatuscodeWhen
404message onlyThe device does not exist or is not yours — { ok: false, message: "Device not found" }
GET/api/devices/shared-with-me Any key

Devices shared with you

Devices other people shared with you. Each one is a device object plus what your share allows.

  • _access is "control" (you may change things) or "view" (read only). Shares that have expired are not listed.
  • _sharedByUserId is the account that shared the device with you.
Request
bash
curl "https://teqhome.teqlogy.com/api/devices/shared-with-me" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "devices": [
    {
      "_id": "65f1a2b3c4d5e6f708192a12",
      "deviceId": "eeff00112233",
      "userId": "65f1a2b3c4d5e6f708192a02",
      "name": "Garage",
      "type": "PowerMatrix-8",
      "firmware": "1.0.14",
      "status": true,
      "relays": [0, 0, 0, 0, 0, 0, 0, 0],
      "config": {
        "relayMeta": []
      },
      "createdAt": "2026-09-01T10:00:00.000Z",
      "updatedAt": "2026-10-02T10:00:00.000Z",
      "_shareId": "65f1a2b3c4d5e6f708192a13",
      "_access": "control",
      "_sharedByUserId": "65f1a2b3c4d5e6f708192a02"
    }
  ]
}

Settings

Rename a device and change its settings.

PATCH/api/devices/:deviceId/preferences Full key only

Change device settings

Rename the device and change its settings. Send only the fields you want to change; everything else stays as it is.

Path parameters
deviceIdrequired
stringThe hardware id of the device (the deviceId of the device object).
Request body (JSON)
name
stringDevice name, up to 60 characters.
relayMeta
object[]PowerMatrix-8. Names and icons of the relays: [{ index, name, icon }]. name up to 40 characters; icon must be one of the icons listed on the PowerMatrix-8 page (anything else becomes "power"). Replaces the whole list.
automations
object[]PowerMatrix-8. Weekly and one-shot automations, see the schema on the PowerMatrix-8 page. Replaces the whole list: send every automation you want to keep. Entries that are not valid are dropped.
scenes
object[]PowerMatrix-8. Free-form scene objects, up to 50 (the Teqlogy apps store theirs here). Replaces the whole list.
billRate
numberEnergyMate. Price per kWh, 0 or more, two decimals.
alertThresholds
objectEnergyMate. { maxPower ≤ 99999, maxCurrent ≤ 9999, maxVoltage ≤ 999, minVoltage ≤ 999 }. Values outside the range are ignored. Replaces the previous thresholds.
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share is refused.
  • Everybody who watches the device on a WebSocket gets a deviceUpdated event with the new device object.
Request
bash
curl -X PATCH "https://teqhome.teqlogy.com/api/devices/aabbcc112233/preferences" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Living Room Lights",
    "relayMeta": [
      { "index": 0, "name": "Ceiling Light", "icon": "light_ceiling" },
      { "index": 1, "name": "Fan", "icon": "fan" }
    ]
  }'
Response 200PowerMatrix-8
json
{
  "ok": true,
  "device": {
    "_id": "65f1a2b3c4d5e6f708192a10",
    "userId": "65f1a2b3c4d5e6f708192a01",
    "deviceId": "aabbcc112233",
    "name": "Living Room Lights",
    "type": "PowerMatrix-8",
    "model": "PowerMatrix",
    "firmware": "1.0.14",
    "status": true,
    "rssi": -62,
    "relays": [1, 0, 1, 0, 0, 0, 0, 0],
    "config": {
      "relayMeta": [
        { "index": 0, "name": "Ceiling Light", "icon": "light_ceiling" },
        { "index": 1, "name": "Fan", "icon": "fan" }
      ],
      "automations": [
        {
          "id": "auto_001",
          "name": "Morning Lights",
          "enabled": true,
          "relayIndex": 0,
          "targetState": "ON",
          "kind": "weekly",
          "time": "07:00",
          "days": [1, 2, 3, 4, 5],
          "timezoneOffsetMinutes": 300,
          "lastRunKey": null,
          "lastRunAt": null,
          "lastError": null
        }
      ],
      "irCodes": [
        {
          "id": "ir_abc123",
          "relayIndex": 0,
          "code": "F30CFF00",
          "name": "TV Power"
        }
      ],
      "relayTimers": [],
      "billRate": 0,
      "scenes": []
    },
    "lastSeen": "2026-10-03T14:20:00.000Z",
    "reconnectCount": 3,
    "uptimeSince": "2026-10-01T08:00:00.000Z",
    "createdAt": "2026-08-01T10:00:00.000Z",
    "updatedAt": "2026-10-03T14:20:00.000Z"
  }
}
200 · EnergyMate: { "billRate": 14.5, "alertThresholds": { "maxPower": 5000, "maxCurrent": 25, "maxVoltage": 245, "minVoltage": 195 } }
json
{
  "ok": true,
  "device": {
    "_id": "65f1a2b3c4d5e6f708192a11",
    "userId": "65f1a2b3c4d5e6f708192a01",
    "deviceId": "ddeeff445566",
    "name": "Main Panel",
    "type": "EnergyMate-3X",
    "model": "Teqlogy SmartDevice",
    "firmware": "1.0.0",
    "status": true,
    "rssi": -58,
    "relays": [1, 0, 0, 1, 0, 0],
    "voltage": 231.4,
    "current": 4.2,
    "power": 950.1,
    "energy": 12.345,
    "frequency": 50,
    "pf": 0.98,
    "voltMin": 190,
    "voltMax": 240,
    "meters": [
      {
        "index": 1,
        "voltage": 231.4,
        "current": 4.2,
        "power": 950.1,
        "energy": 4.25,
        "sessionEnergy": 1.25,
        "frequency": 50,
        "pf": 0.98,
        "limit": 10,
        "lifetimeWh": 152250,
        "off": false
      },
      {
        "index": 2,
        "voltage": 0,
        "current": 0,
        "power": 0,
        "energy": 6.5,
        "sessionEnergy": 0,
        "frequency": 0,
        "pf": 0,
        "limit": 10,
        "lifetimeWh": 210002,
        "off": true
      },
      {
        "index": 3,
        "voltage": 0,
        "current": 0,
        "power": 0,
        "energy": 0,
        "sessionEnergy": 0,
        "frequency": 0,
        "pf": 0,
        "limit": 10,
        "lifetimeWh": 0,
        "off": false
      }
    ],
    "counterEpoch": 2864434397,
    "ampMax": 16,
    "ampTrip": 0,
    "config": {
      "billRate": 14.5,
      "alertThresholds": {
        "maxPower": 5000,
        "maxCurrent": 25,
        "maxVoltage": 245,
        "minVoltage": 195
      }
    },
    "lastSeen": "2026-10-03T14:20:05.000Z",
    "reconnectCount": 5,
    "uptimeSince": "2026-10-02T06:00:00.000Z",
    "createdAt": "2026-08-05T10:00:00.000Z",
    "updatedAt": "2026-10-03T14:20:05.000Z"
  }
}
Errors of this endpoint
StatuscodeWhen
403API_KEY_READONLYA read-only key was used
403message onlyThe device is shared with you as view-only — { ok: false, message: "View-only access …" }
404message onlyThe device does not exist or is not yours — { ok: false, message: "Device not found" }

History

What happened before.

GET/api/devices/:deviceId/energy-historyAll variants Any key

Energy history

Voltage, current, power and energy of the device over time, averaged per hour or per day. The default window is the last 24 hours.

Path parameters
deviceIdrequired
stringThe hardware id of the device (the deviceId of the device object).
Query parameters
resolution
string"hourly" (default) or "daily".
from
ISO dateStart of the window. Default: 24 hours ago.
to
ISO dateEnd of the window. Default: now.
  • Owner, or a device shared with you (view or control), or a dealer assignment.
  • The device reports about every 5 minutes and samples are kept for 30 days, so older windows are empty.
  • timestamp is the start of the bucket in UTC: 2026-10-03T10:00:00.000Z for hourly, 2026-10-03 for daily. voltage, current, power, frequency and pf are averages of the bucket, energy is the highest reading in it (kWh), count is how many samples went in.
Request
bash
curl "https://teqhome.teqlogy.com/api/devices/ddeeff445566/energy-history?resolution=daily&from=2026-09-27T00:00:00Z&to=2026-10-03T23:59:59Z" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "data": [
    {
      "timestamp": "2026-10-03T10:00:00.000Z",
      "voltage": 231.4,
      "current": 4.82,
      "power": 1112.5,
      "energy": 48.32,
      "frequency": 50.01,
      "pf": 0.994,
      "count": 12
    },
    {
      "timestamp": "2026-10-03T11:00:00.000Z",
      "voltage": 230.9,
      "current": 3.1,
      "power": 715.3,
      "energy": 49.04,
      "frequency": 49.98,
      "pf": 0.991,
      "count": 12
    }
  ],
  "resolution": "hourly",
  "from": "2026-10-03T05:30:00.000Z",
  "to": "2026-10-04T05:30:00.000Z"
}
Errors of this endpoint
StatuscodeWhen
400message onlyfrom or to is not a date — { ok: false, message: "Invalid from/to date" }
404message onlyThe device does not exist or is not yours — { ok: false, message: "Device not found" }

Meter readings

Tie the numbers on the physical meters to the device.

GET/api/devices/:deviceId/calibrations3X · 4X · 5X · LCD 3 / 4 Any key

List meter readings

The readings you (or anyone with access) typed in from the physical meter, newest first. They let a client show the true meter reading even though the quota counter restarts.

Path parameters
deviceIdrequired
stringThe hardware id of the device (the deviceId of the device object).
Query parameters
meter
integerOnly this meter, 0-based.
limit
integer1–100, default 20.
  • Owner, or a device shared with you (view or control), or a dealer assignment.
  • How a reading is used: when the device’s lifetime register read lifetimeWh, the physical meter showed readingWh. The reading now is readingWh + (lifetimeWh now − lifetimeWh at that time), with lifetimeWh now taken from meters[i].lifetimeWh.
  • Only readings of the current owner and of the current counterEpoch are returned. supported is false (and items empty) when the device has no lifetime register.
Request
bash
curl "https://teqhome.teqlogy.com/api/devices/ddeeff445566/calibrations?meter=0" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "supported": true,
  "counterEpoch": 2864434397,
  "items": [
    {
      "id": "65f1a2b3c4d5e6f708192a30",
      "meterIndex": 0,
      "readingWh": 500250,
      "lifetimeWh": 152250,
      "counterEpoch": 2864434397,
      "source": "app",
      "note": "",
      "at": "2026-09-10T09:00:00.000Z",
      "byMe": false
    }
  ]
}
Errors of this endpoint
StatuscodeWhen
404DEVICE_NOT_FOUNDThe device does not exist or is not yours (the answer is the same)
POST/api/devices/:deviceId/calibrations3X · 4X · 5X · LCD 3 / 4 Full key only

Record a meter reading

Save what the physical meter shows right now, tied to the device’s lifetime register.

Path parameters
deviceIdrequired
stringThe hardware id of the device (the deviceId of the device object).
Request body (JSON)
meterIndexrequired
integerThe meter, 0-based (Meter 1 = 0).
readingWhrequired
integerWhat the physical meter shows, in Wh.
lifetimeWhrequired
integermeters[meterIndex].lifetimeWh of the device at the moment you read the meter.
counterEpochrequired
integercounterEpoch of the device at that moment.
source
string"app", "web" or "migration". Default "app".
note
stringUp to 200 characters.
clientKey
string8–64 characters of A–Z a–z 0–9 _ - . Send the same key again to retry safely: you get the first result back with duplicate: true.
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share is refused.
  • Read the device first and use its numbers: if lifetimeWh is more than 50 Wh ahead of the device, or more than 1 kWh behind it, the reading is refused.
Request
bash
curl -X POST "https://teqhome.teqlogy.com/api/devices/ddeeff445566/calibrations" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "meterIndex": 1,
    "readingWh": 500126,
    "lifetimeWh": 210002,
    "counterEpoch": 2864434397,
    "source": "web",
    "note": "read from the meter display",
    "clientKey": "abc123XYZ789"
  }'
Response 201
json
{
  "ok": true,
  "item": {
    "id": "65f1a2b3c4d5e6f708192a30",
    "meterIndex": 1,
    "readingWh": 500126,
    "lifetimeWh": 210002,
    "counterEpoch": 2864434397,
    "source": "web",
    "note": "read from the meter display",
    "at": "2026-10-04T05:30:00.000Z",
    "byMe": true
  }
}
200 · The same request again (same clientKey)
json
{
  "ok": true,
  "duplicate": true,
  "item": {
    "id": "65f1a2b3c4d5e6f708192a30",
    "meterIndex": 1,
    "readingWh": 500126,
    "lifetimeWh": 210002,
    "counterEpoch": 2864434397,
    "source": "web",
    "note": "read from the meter display",
    "at": "2026-10-04T05:30:00.000Z",
    "byMe": true
  }
}
Errors of this endpoint
StatuscodeWhen
400VALIDATION_ERRORA field is invalid, the meter does not exist, or lifetimeWh is ahead of the device
403API_KEY_READONLYA read-only key was used
403DEVICE_ACCESS_DENIEDThe device is shared with you as view-only
404DEVICE_NOT_FOUNDThe device does not exist or is not yours (the answer is the same)
409CALIBRATION_UNSUPPORTEDThe firmware has no lifetime register
409CALIBRATION_EPOCH_MISMATCHThe device counters were reset since you read them
409CALIBRATION_STALEYour snapshot is more than 1 kWh older than the device
429RATE_LIMITEDMore than 30 readings in 10 minutes

Schedules and reports

Pause meters on a timetable, reset them on a date, and read the reports.

GET/api/meter-off/:deviceId3X · 4X · 5X · LCD 3 / 4 Any key

List meter OFF / ON schedules

The one-off schedules and the weekly rules of a device. OFF means paused: the meter keeps its limit and its Used counter, and is skipped until it is switched ON again. ON brings it back in its last state: a meter that was running runs again at once, a meter that was waiting waits for its turn.

Path parameters
deviceIdrequired
stringThe hardware id of the device (the deviceId of the device object).
  • Owner, or a device shared with you (view or control), or a dealer assignment.
  • supported is true once the device has reported the per-meter off flag; on older firmware creating a schedule answers 409 METER_OFF_UNSUPPORTED.
  • schedules: the active ones first (pending, off), then finished ones (done, cancelled, skipped), 30 at most. status: pending → off → done, or cancelled / skipped.
  • rules: the weekly rules, each of which creates one schedule at a time (schedule.ruleId points back at it).
Request
bash
curl "https://teqhome.teqlogy.com/api/meter-off/ddeeff445566" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "supported": true,
  "schedules": [
    {
      "id": "65f1a2b3c4d5e6f708192a40",
      "meterIndex": 1,
      "offAt": "2026-10-05T05:30:00.000Z",
      "onAt": "2026-10-06T05:30:00.000Z",
      "status": "pending",
      "cancelRequested": false,
      "offConfirmedAt": null,
      "onConfirmedAt": null,
      "failReason": "",
      "createdAt": "2026-10-04T05:00:00.000Z",
      "ruleId": null,
      "byMe": true
    },
    {
      "id": "65f1a2b3c4d5e6f708192a42",
      "meterIndex": 2,
      "offAt": "2026-10-05T17:00:00.000Z",
      "onAt": "2026-10-06T01:00:00.000Z",
      "status": "pending",
      "cancelRequested": false,
      "offConfirmedAt": null,
      "onConfirmedAt": null,
      "failReason": "",
      "createdAt": "2026-10-04T05:00:00.000Z",
      "ruleId": "65f1a2b3c4d5e6f708192a41",
      "byMe": true
    }
  ],
  "rules": [
    {
      "id": "65f1a2b3c4d5e6f708192a41",
      "meterIndex": 2,
      "days": [1, 2, 3, 4, 5],
      "offTime": "22:00",
      "onTime": "06:00",
      "timezoneOffsetMinutes": 300,
      "createdAt": "2026-10-04T05:00:00.000Z",
      "byMe": true
    }
  ]
}
Errors of this endpoint
StatuscodeWhen
404DEVICE_NOT_FOUNDThe device does not exist or is not yours (the answer is the same)
POST/api/meter-off/schedule3X · 4X · 5X · LCD 3 / 4 Full key only

Schedule a meter OFF (and ON)

Pause one meter at a date and time, and optionally switch it ON again later.

Request body (JSON)
deviceIdrequired
stringThe device.
meterIndexrequired
integerThe meter, 0-based (Meter 1 = 0).
offAtrequired
ISO dateWhen to pause it. In the future, at most a year ahead.
onAt
ISO dateWhen to switch it ON again: at least a minute after offAt, at most a year ahead. Leave it out to keep the meter paused until you cancel.
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share is refused.
  • The server repeats the command until the device confirms it, so a device that is offline at offAt is paused as soon as it is back (as long as the window is still open). A meter that could not be paused in time ends as skipped, and the owner is told.
  • While the owner’s Away Mode covers the device, a due ON waits until Away Mode ends.
  • Last state: when the meter is switched ON again and it was running when it was paused, it runs again at once; the meter that took over meanwhile is stopped (its Used is kept) and carries on after it. A meter that was waiting just waits for its turn. Newer X firmware only: a device flashed earlier puts the meter back into the rotation and it waits for its turn.
Request
bash
curl -X POST "https://teqhome.teqlogy.com/api/meter-off/schedule" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "deviceId": "ddeeff445566",
    "meterIndex": 1,
    "offAt": "2026-10-05T05:30:00Z",
    "onAt": "2026-10-06T05:30:00Z"
  }'
Response 201
json
{
  "ok": true,
  "schedule": {
    "id": "65f1a2b3c4d5e6f708192a40",
    "meterIndex": 1,
    "offAt": "2026-10-05T05:30:00.000Z",
    "onAt": "2026-10-06T05:30:00.000Z",
    "status": "pending",
    "cancelRequested": false,
    "offConfirmedAt": null,
    "onConfirmedAt": null,
    "failReason": "",
    "createdAt": "2026-10-04T05:00:00.000Z",
    "ruleId": null,
    "byMe": true
  }
}
Errors of this endpoint
StatuscodeWhen
400VALIDATION_ERRORA field is invalid, the date is in the past or too far ahead, or the device has no such meter
403API_KEY_READONLYA read-only key was used
403DEVICE_ACCESS_DENIEDThe device is shared with you as view-only
404DEVICE_NOT_FOUNDThe device does not exist or is not yours (the answer is the same)
409METER_OFF_UNSUPPORTEDThe firmware has no scheduled OFF
409METER_OFF_OVERLAPAnother schedule of this meter covers that time (no onAt counts as “forever”)
429RATE_LIMITEDMore than 30 schedule changes in 10 minutes
POST/api/meter-off/rule3X · 4X · 5X · LCD 3 / 4 Full key only

Create a weekly OFF / ON rule

Like an alarm clock: on the chosen weekdays the meter goes OFF at offTime and, if you give onTime, comes back ON then.

Request body (JSON)
deviceIdrequired
stringThe device.
meterIndexrequired
integerThe meter, 0-based.
daysrequired
integer[]1 to 7 weekdays, 1 = Monday … 7 = Sunday.
offTimerequired
stringHH:mm, 24-hour, in your local time.
onTime
stringHH:mm. If it is earlier than offTime the window runs overnight. Must differ from offTime.
timezoneOffsetMinutes
integerYour UTC offset in minutes, −840 … 840 (Pakistan = 300). Default 0 (UTC).
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share is refused.
  • A device can have up to 20 weekly rules. The first occurrence is created right away (schedule), the following ones are created by the server.
Request
bash
curl -X POST "https://teqhome.teqlogy.com/api/meter-off/rule" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "deviceId": "ddeeff445566",
    "meterIndex": 2,
    "days": [1, 2, 3, 4, 5],
    "offTime": "22:00",
    "onTime": "06:00",
    "timezoneOffsetMinutes": 300
  }'
Response 201
json
{
  "ok": true,
  "rule": {
    "id": "65f1a2b3c4d5e6f708192a41",
    "meterIndex": 2,
    "days": [1, 2, 3, 4, 5],
    "offTime": "22:00",
    "onTime": "06:00",
    "timezoneOffsetMinutes": 300,
    "createdAt": "2026-10-04T05:00:00.000Z",
    "byMe": true
  },
  "schedule": {
    "id": "65f1a2b3c4d5e6f708192a42",
    "meterIndex": 2,
    "offAt": "2026-10-05T17:00:00.000Z",
    "onAt": "2026-10-06T01:00:00.000Z",
    "status": "pending",
    "cancelRequested": false,
    "offConfirmedAt": null,
    "onConfirmedAt": null,
    "failReason": "",
    "createdAt": "2026-10-04T05:00:00.000Z",
    "ruleId": "65f1a2b3c4d5e6f708192a41",
    "byMe": true
  }
}
Errors of this endpoint
StatuscodeWhen
400VALIDATION_ERRORA field is invalid, the device already has 20 rules, or the rule has no upcoming time
403API_KEY_READONLYA read-only key was used
403DEVICE_ACCESS_DENIEDThe device is shared with you as view-only
404DEVICE_NOT_FOUNDThe device does not exist or is not yours (the answer is the same)
409METER_OFF_UNSUPPORTEDThe firmware has no scheduled OFF
409METER_OFF_OVERLAPAnother rule or schedule of this meter covers that time
429RATE_LIMITEDMore than 30 schedule changes in 10 minutes
DELETE/api/meter-off/rule/:id3X · 4X · 5X · LCD 3 / 4 Full key only

Delete a weekly rule

Stop a weekly rule. Its current occurrence is cancelled like any schedule: a pending one just ends, a meter that is paused right now is switched ON.

Path parameters
idrequired
stringThe rule id: rules[].id.
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share is refused.
  • cancelled is how many occurrences were cancelled.
Request
bash
curl -X DELETE "https://teqhome.teqlogy.com/api/meter-off/rule/65f1a2b3c4d5e6f708192a41" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{ "ok": true, "cancelled": 1 }
Errors of this endpoint
StatuscodeWhen
400VALIDATION_ERRORid is not a valid id
403API_KEY_READONLYA read-only key was used
403DEVICE_ACCESS_DENIEDThe device is shared with you as view-only
404NOT_FOUNDNo such weekly rule
DELETE/api/meter-off/:id3X · 4X · 5X · LCD 3 / 4 Full key only

Cancel a schedule

Cancel a one-off schedule. A pending one just ends; if the meter is paused right now it is switched ON at the next check (within about 30 seconds).

Path parameters
idrequired
stringThe schedule id: schedules[].id.
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share is refused.
  • Asking twice is harmless. A schedule that is already finished answers 409.
Request
bash
curl -X DELETE "https://teqhome.teqlogy.com/api/meter-off/65f1a2b3c4d5e6f708192a40" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "schedule": {
    "id": "65f1a2b3c4d5e6f708192a40",
    "meterIndex": 1,
    "offAt": "2026-10-05T05:30:00.000Z",
    "onAt": "2026-10-06T05:30:00.000Z",
    "status": "cancelled",
    "cancelRequested": false,
    "offConfirmedAt": null,
    "onConfirmedAt": null,
    "failReason": "",
    "createdAt": "2026-10-04T05:00:00.000Z",
    "ruleId": null,
    "byMe": true
  }
}
Errors of this endpoint
StatuscodeWhen
400VALIDATION_ERRORid is not a valid id
403API_KEY_READONLYA read-only key was used
403DEVICE_ACCESS_DENIEDThe device is shared with you as view-only
404NOT_FOUNDNo such schedule
409message onlyThe schedule is already finished
POST/api/resets/scheduleAll variants Full key only

Schedule a meter reset

Reset one meter at a date and time: its quota (limit) and its Used counter go back to 0, ready for a new quota. A report is saved when it has run.

Request body (JSON)
deviceIdrequired
stringThe device.
meterIndexrequired
integerThe meter, 0-based (Meter 1 = 0), 0–15.
scheduledAtrequired
ISO dateWhen to reset. Must be in the future.
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share is refused.
  • A reset for a device that is offline waits and is applied when the device is back, for up to 24 hours after the scheduled time; after that it is skipped and the owner is told.
  • The owner (and whoever scheduled it) gets a meter_reset notification with the readings at that moment, and a report (see Reset reports).
Request
bash
curl -X POST "https://teqhome.teqlogy.com/api/resets/schedule" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "deviceId": "ddeeff445566",
    "meterIndex": 0,
    "scheduledAt": "2026-10-07T05:30:00Z"
  }'
Response 200
json
{
  "ok": true,
  "schedule": {
    "_id": "65f1a2b3c4d5e6f708192a50",
    "deviceId": "ddeeff445566",
    "userId": "65f1a2b3c4d5e6f708192a01",
    "createdBy": "65f1a2b3c4d5e6f708192a01",
    "meterIndex": 0,
    "scheduledAt": "2026-10-07T05:30:00.000Z",
    "executed": false,
    "executedAt": null,
    "skipped": false,
    "failReason": "",
    "logs": [],
    "createdAt": "2026-10-04T05:00:00.000Z"
  }
}
Errors of this endpoint
StatuscodeWhen
400message onlyA field is missing, meterIndex is outside 0–15, or scheduledAt is not in the future — { ok: false, message }
403API_KEY_READONLYA read-only key was used
404message onlyNo access to the device — { ok: false, message: "Device not found or no access" }
GET/api/resets/:deviceIdAll variants Any key

List scheduled resets

The scheduled resets of a device, the latest 30, newest first.

Path parameters
deviceIdrequired
stringThe hardware id of the device (the deviceId of the device object).
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share does not see them (404).
  • executed is true once it has run; skipped is true (with failReason) when it could not be applied.
Request
bash
curl "https://teqhome.teqlogy.com/api/resets/ddeeff445566" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "schedules": [
    {
      "_id": "65f1a2b3c4d5e6f708192a50",
      "deviceId": "ddeeff445566",
      "userId": "65f1a2b3c4d5e6f708192a01",
      "createdBy": "65f1a2b3c4d5e6f708192a01",
      "meterIndex": 0,
      "scheduledAt": "2026-10-07T05:30:00.000Z",
      "executed": false,
      "executedAt": null,
      "skipped": false,
      "failReason": "",
      "logs": [],
      "createdAt": "2026-10-04T05:00:00.000Z"
    }
  ]
}
Errors of this endpoint
StatuscodeWhen
404message onlyThe device does not exist or is not yours — { ok: false, message: "Device not found" }
DELETE/api/resets/:idAll variants Full key only

Delete a scheduled reset

Remove a reset that has not run yet.

Path parameters
idrequired
stringThe schedule id: schedules[]._id.
  • Owner, or a device shared with you with control access, or a dealer assignment. A view-only share is refused.
Request
bash
curl -X DELETE "https://teqhome.teqlogy.com/api/resets/65f1a2b3c4d5e6f708192a50" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{ "ok": true }
Errors of this endpoint
StatuscodeWhen
400message onlyid is not a valid id — { ok: false, message: "Invalid id" }
403API_KEY_READONLYA read-only key was used
403message onlyNo permission on that device — { ok: false, message: "No permission" }
404message onlyThe schedule does not exist or has already run — { ok: false, message }
GET/api/reset-reports/device/:deviceIdAll variants Any key

List reset reports

One report for every scheduled reset that has run, newest first. A report says how much the meter used since its previous reset.

Path parameters
deviceIdrequired
stringThe hardware id of the device (the deviceId of the device object).
Query parameters
meter
integerOnly this meter, 0-based (0–15).
limit
integer1–60, default 24.
  • Owner, or a device shared with you (view or control), or a dealer assignment.
  • unitsSource is "lifetime" when the units come from the device’s lifetime register (exact) or "used" when they come from the Used counter.
Request
bash
curl "https://teqhome.teqlogy.com/api/reset-reports/device/ddeeff445566?meter=0&limit=12" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "reports": [
    {
      "id": "65f1a2b3c4d5e6f708192a60",
      "meterIndex": 0,
      "deviceName": "Main Panel",
      "scheduledAt": "2026-10-01T00:00:00.000Z",
      "executedAt": "2026-10-01T00:00:12.000Z",
      "limit": 10,
      "used": 9.8,
      "unitsKwh": 9.8,
      "unitsSource": "lifetime"
    }
  ]
}
Errors of this endpoint
StatuscodeWhen
404DEVICE_NOT_FOUNDThe device does not exist or is not yours (the answer is the same)
400VALIDATION_ERRORmeter is not an integer 0–15
GET/api/reset-reports/:idAll variants Any key

Get a reset report

The whole report: the quota at the reset, the readings at that moment, and the minimum, average and maximum of the period since the previous reset.

Path parameters
idrequired
stringThe report id: reports[].id.
  • Owner, or a device shared with you (view or control), or a dealer assignment.
  • snapshot is what the device showed at the moment of the reset. meterReading is the last measurement of this meter, liveReading the load that was running; either is null when nothing was measured (one sensor rotates over the meters).
  • period.voltage / current / power / pf / frequency are { min, avg, max } of the readings measured while the meter ran. The device history keeps 30 days, so a longer period is only partly covered: historyTruncated says so.
Request
bash
curl "https://teqhome.teqlogy.com/api/reset-reports/65f1a2b3c4d5e6f708192a60" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "report": {
    "id": "65f1a2b3c4d5e6f708192a60",
    "deviceId": "ddeeff445566",
    "meterIndex": 0,
    "deviceName": "Main Panel",
    "deviceType": "EnergyMate-3X",
    "scheduledAt": "2026-10-01T00:00:00.000Z",
    "executedAt": "2026-10-01T00:00:12.000Z",
    "lateBySeconds": 12,
    "periodFrom": "2026-09-01T00:00:10.000Z",
    "snapshot": {
      "limit": 10,
      "used": 9.8,
      "remaining": 0.2,
      "sessionEnergy": 1.25,
      "lifetimeKwh": 152.25,
      "allMetersUsed": 16.3,
      "meterReading": {
        "voltage": 228.4,
        "current": 3.123,
        "power": 612.5,
        "pf": 0.97,
        "frequency": 50
      },
      "liveReading": null,
      "runningMeter": 1,
      "meterWasRunning": true,
      "voltMin": 190,
      "voltMax": 240
    },
    "period": {
      "from": "2026-09-01T00:00:10.000Z",
      "to": "2026-10-01T00:00:12.000Z",
      "days": 30,
      "unitsKwh": 9.8,
      "unitsSource": "lifetime",
      "historyTruncated": false,
      "samples": 240,
      "firstAt": "2026-09-02T08:00:00.000Z",
      "lastAt": "2026-09-30T20:00:00.000Z",
      "voltage": { "min": 221.1, "avg": 229.6, "max": 238.2 },
      "current": { "min": 0.4, "avg": 3.2, "max": 9.1 },
      "power": { "min": 90, "avg": 700.2, "max": 2100 },
      "pf": { "min": 0.8, "avg": 0.95, "max": 1 },
      "frequency": { "min": 49.8, "avg": 50, "max": 50.2 }
    }
  }
}
Errors of this endpoint
StatuscodeWhen
400VALIDATION_ERRORid is not a valid id
404NOT_FOUNDNo such report, or no access to its device

Notifications

The notification list of your account.

GET/api/notifications Any key

List notifications

Your latest 50 notifications, newest first: devices going online or offline, alerts, quotas, resets, schedules, Away Mode.

  • type tells what happened. Known types: device_online, device_offline, alert_threshold, voltage_event, meter_limit, meter_reset, meter_reset_skipped, amp_protection, meter_off, meter_on, meter_on_failed, meter_off_skipped, away_mode, away_alert.
  • readAt is null while unread. meta carries the details of the event (it depends on the type). Notifications are kept for 90 days.
Request
bash
curl "https://teqhome.teqlogy.com/api/notifications" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "notifications": [
    {
      "_id": "65f1a2b3c4d5e6f708192a70",
      "userId": "65f1a2b3c4d5e6f708192a01",
      "deviceId": "ddeeff445566",
      "type": "meter_limit",
      "title": "⚡ Main Panel — Meter 1 Limit Reached",
      "body": "Meter 1 hit its 10.0 kWh limit.",
      "meta": { "meterIndex": 0, "limit": 10 },
      "readAt": null,
      "createdAt": "2026-10-03T12:00:00.000Z",
      "updatedAt": "2026-10-03T12:00:00.000Z"
    }
  ]
}
PATCH/api/notifications/:id/read Full key only

Mark one notification as read

Mark one of your notifications as read.

Path parameters
idrequired
stringThe notification id: notifications[]._id.
  • An id that is not yours (or does not exist) changes nothing and still answers { ok: true }.
Request
bash
curl -X PATCH "https://teqhome.teqlogy.com/api/notifications/65f1a2b3c4d5e6f708192a70/read" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
Response 200
json
{ "ok": true }
PATCH/api/notifications/read-all Full key only

Mark all notifications as read

Mark every unread notification of yours as read.

Request
bash
curl -X PATCH "https://teqhome.teqlogy.com/api/notifications/read-all" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
Response 200
json
{ "ok": true }
DELETE/api/notifications/:id Full key only

Delete a notification

Delete one of your notifications.

Path parameters
idrequired
stringThe notification id.
Request
bash
curl -X DELETE "https://teqhome.teqlogy.com/api/notifications/65f1a2b3c4d5e6f708192a70" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{ "ok": true }

Away Mode

Lock everything OFF while you are away.

GET/api/user/away-mode Any key

Away Mode status

Whether your Away Mode is on, since when, and for which devices.

  • While Away Mode covers a device, turning anything ON is blocked: relays (REST and WebSocket), switching a meter, restarting amp protection, and physical buttons are switched back off. Turning OFF always works.
Request
bash
curl "https://teqhome.teqlogy.com/api/user/away-mode" \
  -H "Authorization: Bearer $KEY"
Response 200
json
{
  "ok": true,
  "awayMode": {
    "enabled": true,
    "deviceIds": ["aabbcc112233", "ddeeff445566"],
    "enabledAt": "2026-10-04T05:30:00.000Z"
  }
}
POST/api/user/away-mode/enable Full key only

Turn Away Mode on

Secure the listed devices: every relay is switched OFF (PowerMatrix-8) or the meters are stopped (EnergyMate) and nothing can be switched ON until Away Mode is turned off.

Request body (JSON)
deviceIdsrequired
string[]The devices, 1 to 100. Only devices you may control are used.
  • Devices that are not yours to control are ignored: they are listed in skipped and look exactly like ids that do not exist. If none of the ids is yours, the answer is 404 DEVICE_NOT_FOUND.
  • sent is true when the device was online and the command was delivered. A device that is offline is secured too: the lock applies as soon as it is back.
Request
bash
curl -X POST "https://teqhome.teqlogy.com/api/user/away-mode/enable" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"deviceIds":["aabbcc112233","ddeeff445566"]}'
Response 200
json
{
  "ok": true,
  "results": [
    { "deviceId": "aabbcc112233", "sent": true },
    { "deviceId": "ddeeff445566", "sent": true }
  ],
  "skipped": []
}
Errors of this endpoint
StatuscodeWhen
400message onlydeviceIds is missing, empty, longer than 100, or not a list of text ids — { ok: false, message }
403API_KEY_READONLYA read-only key was used
404DEVICE_NOT_FOUNDThe device does not exist or is not yours (the answer is the same)
POST/api/user/away-mode/disable Full key only

Turn Away Mode off

Unlock the devices. EnergyMate meters resume their sequence; PowerMatrix-8 relays stay as they are, you switch them ON yourself.

Request
bash
curl -X POST "https://teqhome.teqlogy.com/api/user/away-mode/disable" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
Response 200
json
{ "ok": true }
Errors of this endpoint
StatuscodeWhen
403API_KEY_READONLYA read-only key was used

Real time

Open the WebSocket.

POST/api/ws-ticket Any key

Get a WebSocket ticket

Exchange your key for a one-time ticket that opens the live WebSocket. A read-only key gets a socket that only listens.

  • The ticket is valid for 30 seconds and works once. Ask for a new one every time you open a connection.
  • The socket keeps the level of the key that made the ticket: a read-only key receives every event but may send nothing; a full key may send the commands listed under WebSocket.
Request
bash
curl -X POST "https://teqhome.teqlogy.com/api/ws-ticket" \
  -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
Response 200
json
{
  "ok": true,
  "ticket": "b95488af-59ef-4b30-8697-8da431c9e178",
  "ttlMs": 30000
}

WebSocket

Open the socket as described in Real time: get a ticket with POST /api/ws-ticket, then connect to wss://teqhome.teqlogy.com/ws/app?ticket=…. A read-only key receives all events below and sends nothing; a full key may also send the commands.

Commands you can send (full key)

WSswitchMeter{ type, deviceId, meter } Full key only

Start the given meter now: the device stops the running one and switches to this one.

  • meter is 1-based (Meter 1 = 1).
  • Blocked while Away Mode covers the device, while amp protection is tripped, and for a meter that is paused by a schedule.
  • X models and LCD-edition EnergyMate-3 / 4 (the newer firmware): the meter that was running is stopped (its Used is kept) and remembered. When the meter you started has used its quota, that meter runs again instead of the rotation moving on to the next one. Older firmware just continues with the next meter.
json
{"type":"switchMeter","deviceId":"ddeeff445566","meter":2}
WSsetMeterLimits{ type, deviceId, limits } Full key only

Set the quota of every meter, in kWh.

  • limits is an array with exactly one number per meter: 3 for EnergyMate-3 / 3A / 3X, 4 for EnergyMate-4 / 4X, 5 for EnergyMate-5X. Anything else is ignored by the device.
  • A meter whose limit changes starts over: its Used counter goes back to 0. A limit of 0 means “no quota”.
  • If the device was idle or done, it starts the next meter that has a quota.
json
{"type":"setMeterLimits","deviceId":"ddeeff445566","limits":[10,10,5]}
WSresetMeter{ type, deviceId, meter } Full key only

Reset the current run of one meter (its session counter).

  • meter is 1-based. To clear a quota completely on a date, use a scheduled reset instead.
json
{"type":"resetMeter","deviceId":"ddeeff445566","meter":1}
WSupdateConfig{ type, deviceId, voltMin?, voltMax?, ampMax? } Full key only

Change the protection settings of the device. Send only what you want to change.

  • voltMin / voltMax: the allowed voltage range in volts.
  • ampMax (X models and LCD-edition 3 / 4): the amp protection threshold, a number 0–200, 0 = off. Anything else is ignored.
json
{"type":"updateConfig","deviceId":"ddeeff445566","voltMin":190,"voltMax":245,"ampMax":16}
WSampRestart{ type, deviceId, meter? }3X · 4X · 5X · LCD 3 / 4 Full key only

Clear an amp protection trip and start the meter again — the same as Restart on the touch screen of an EnergyMate-3X / 4X / 5X (or ENTER on the LCD of an EnergyMate-3 / 4).

  • Restart switches amp protection OFF (ampMax becomes 0), exactly like on the device. Set ampMax again afterwards if you want it on.
  • meter is optional (1-based); a repeated command, or one for another meter, does nothing. Blocked while Away Mode covers the device.
json
{"type":"ampRestart","deviceId":"ddeeff445566","meter":2}

Events you receive

WStelemetryUpdate Any key

A device reported. PowerMatrix-8: data.relays is the list of relay states. EnergyMate: data is the whole frame the device sent (readings, meters[], relays, counterEpoch, ampMax …) without the device’s credentials.

json
{
  "type": "telemetryUpdate",
  "deviceId": "aabbcc112233",
  "userId": "65f1a2b3c4d5e6f708192a01",
  "deviceType": "PowerMatrix-8",
  "data": {
    "relays": [1, 0, 1, 0, 0, 0, 0, 0]
  },
  "timestamp": "2026-10-03T14:20:00.000Z"
}
WSdeviceOnline Any key

A device connected, or reported after being offline. device is a snapshot: deviceId, type, status, name, firmware, config, relays.

json
{
  "type": "deviceOnline",
  "userId": "65f1a2b3c4d5e6f708192a01",
  "deviceId": "aabbcc112233",
  "deviceType": "PowerMatrix-8",
  "device": {
    "deviceId": "aabbcc112233",
    "type": "PowerMatrix-8",
    "status": true,
    "name": "Living Room",
    "firmware": "1.0.14",
    "config": {
      "relayMeta": []
    },
    "relays": [0, 0, 0, 0, 0, 0, 0, 0]
  }
}
WSdeviceOffline Any key

A device lost its connection (after a short grace period). transferred: true means it now belongs to somebody else.

json
{ "type": "deviceOffline", "deviceId": "aabbcc112233" }
WSdeviceUpdated Any key

The settings of a device changed (name, relay names, automations …). device is the same object as GET /api/devices/d/:deviceId.

json
{
  "type": "deviceUpdated",
  "userId": "65f1a2b3c4d5e6f708192a01",
  "device": {
    "deviceId": "aabbcc112233",
    "name": "Living Room Lights",
    "type": "PowerMatrix-8",
    "config": {
      "relayMeta": []
    }
  }
}
WSappNotification Any key

A new notification of your account, the same object as in GET /api/notifications.

json
{
  "type": "appNotification",
  "notification": {
    "_id": "65f1a2b3c4d5e6f708192a70",
    "type": "meter_limit",
    "title": "⚡ Main Panel — Meter 1 Limit Reached",
    "body": "Meter 1 hit its 10.0 kWh limit.",
    "meta": { "meterIndex": 0, "limit": 10 },
    "createdAt": "2026-10-03T12:00:00.000Z"
  }
}
WSmeterReset Any key

A scheduled reset ran for one meter. meterIndex is 0-based; notification is the saved notification. A reset that had to be skipped arrives as an appNotification of type meter_reset_skipped instead.

json
{
  "type": "meterReset",
  "deviceId": "ddeeff445566",
  "meterIndex": 0,
  "notification": {
    "_id": "65f1a2b3c4d5e6f708192a70",
    "type": "meter_reset",
    "title": "🔄 Main Panel — Meter 1 reset",
    "body": "Meter 1 hit its 10.0 kWh limit.",
    "meta": { "meterIndex": 0, "limit": 10 },
    "createdAt": "2026-10-03T12:00:00.000Z"
  }
}
WSotaResult Any key

A firmware update that was started from the apps finished or failed.

json
{
  "type": "otaResult",
  "deviceId": "aabbcc112233",
  "success": true,
  "version": "1.0.15",
  "expected": "1.0.15",
  "reason": "Firmware updated to v1.0.15"
}