Forwarding to an HTTPS endpoint

We forward messages to an HTTPS endpoint by issueing POST request to a destination of choice. The body of these requests are JSON encoded and contain a Content-Type: application/json header. Depending on the authentication there might be other headers present. The body is an array of 1 or more messages. We support authentication by means of inserting a token in the Authorization header, but the Client Credentials grant typeopen in new window is also supported.

TIP

Messages are delivered at least once. You need to deduplicate yourself.

Below, examples of the payloads of the following messages can be found:

Solar power

An example of a request containing one message forwarded from a Teleport device that is connected to a solar inverter:

[
  {
    "type": "solarPower:1", // identifies this schema
    "teleportHashId": "8de4y2", // uniquely identifies the teleport device
    "assetIdentifier": "huawei-4100", // brand and serial number of the asset or if that's not available, its (IP) address
    "attempt": 0, // 0-indexed delivery attempt. integer
    "measuredAt": "2023-01-01T00:00:00Z", // when read-out started, ISO 8601 yyyy-mm-ddThh:mm:ssZ or YYYYYY-MM-DDTHH:mm:ss.sssZ, so in UTC
    "activePower": 12000.1, // in W, can be null
    "generatedEnergy": 250000.1, // in W, can be null
    "activePowerLimitPercentage": 30.1, // can be null
    "scheduled": true // false for "extra" measurements (eg. directly after command execution and at Teleport initialisation)
  }
]

Wind power

An example of a request containing one message forwarded from a Teleport device that is connected to a wind energy converter:

[
  {
    "type": "windPower:1", // identifies this schema
    "teleportHashId": "8de4y2", // uniquely identifies the teleport device
    "assetIdentifier": "enercon-4100", // brand and serial number of the asset or if that's not available, its (IP) address
    "attempt": 0, // 0-indexed delivery attempt. integer
    "measuredAt": "2023-01-01T00:00:00Z", // when read-out started, ISO 8601 yyyy-mm-ddThh:mm:ssZ or YYYYYY-MM-DDTHH:mm:ss.sssZ, so in UTC
    "activePower": 12000.1, // in W, can be null
    "windSpeed": 2.1, // in m/s, can be null
    "availableActivePower": 12000.1, // in W, can be null
    "constrainedAvailableActivePower": {
      "currentWind": 12000.1, // in W, can be null
      "technical": 12000.1, // in W, can be null
      "forceMajeure": 12000.1, // in W, can be null
      "externalSetpoints": 12000.1 // in W, can be null
    },
    "converters": [
      {
        "identifier": "12345", // serial number of the converter
        "activePower": 3.1, // in W, can be null
        "windSpeed": 2.4 // in m/s, can be null
      },
      {
        "identifier": "6789", // serial number of the converter
        "activePower": 9.1, // in W, can be null
        "windSpeed": 2.4 // in m/s, can be null
      }
    ],
    "activePowerLimit": {
      "percentage": 5.2 // can be null
    },
    "scheduled": true // false for measurements that are not part of the regular reporting interval, eg. directly after command execution and at Teleport initialisation
  }
]

Battery power

Batteries produce two types of messages: regular messages and flash messages. Regular messages can be exported in full, or to contain only information relevant for operators. For the strings that can occur in the errors and warnings properties, see Battery power error and warning codes.

Regular messages in full

An example of a request containing one message forwarded from a Teleport device that is connected to a battery:

[
  {
    "type": "batteryPower:1", // identifies this schema
    "teleportHashId": "8de4y2", // uniquely identifies the teleport device
    "assetIdentifier": "alfen-123", // brand and serial number of the asset or if that's not available, its (IP) address
    "attempt": 0, // 0-indexed delivery attempt. integer
    "measuredAt": "2023-01-01T00:00:00Z", // when read-out started, ISO 8601 yyyy-mm-ddThh:mm:ssZ or YYYYYY-MM-DDTHH:mm:ss.sssZ, so in UTC
    "batteryStatus": "on", // can be "on", "off" or "other" (see warning and errors in case of 'other')
    "energy": {
      "charged": 1000.2, // in Wh, can be null. Nonnegative
      "discharged": 1000.3, // in Wh, can be null. Nonnegative
    },
    "frequency": 50.2, // in Hz, can be null. Nonnegative
    "activePower": 1000.1, // in W, can be null. Positive means discharging, negative charging.
    "reactivePower": 100.1, // in var, can be null. Positive is injecting reactive power to the grid and negative is absorbing reactive power
    "stateOfCharge": 90.1, // in %, can be null. Nonnegative
    "stateOfHealth": 85.1, // in %, can be null. Nonnegative
    "availableEnergy": 50.1, // in Wh, can be null. Nonnegative
    "ratedEnergy": 1000.1, // in Wh, can be null. Nonnegative
    "availableActivePower": {
      "charge": 300.1, // in W, can be null. Nonnegative
      "discharge": 500.1, // in W, can be null. Nonnegative
    },
    "availableReactivePower": {
      "inject": 300.1, // in var, can be null. Nonnegative
      "absorb": 500.1, // in var, can be null. Nonnegative
    },
    "activePowerSetpoint": {
      "dispatchPower": 100.1, // in W, can be null. Positive means discharging, negative charging.
      "deliverFCR": 100.1, // in W, can be null. Positive means discharging, negative charging.
      "chargeToState": 20.1, // in W, can be null. Positive means discharging, negative charging.
      "aggregate": 220.1, // in W, can be null. Positive means discharging, negative charging.
    },
    "batteryEnergyStorageSystems": [
      {
        "identifier": "alfen-5678", // can be null
        "cellTemperature": {
          "min": 50.1, // in ºC, can be null, min value of all cells
          "max": 50.1, // in ºC, can be null, max value of all cells
        },
        "roomTemperature": 30.1, // in ºC, can be null
        "stateOfCharge": 50.1, // in %, can be null. Nonnegative
        "availableEnergy": 1000.1, // in Wh, can be null. Nonnegative
      }, 
      // can be many
    ],
    // The configuration property has the same structure as the operation property of a SetBatteryOperation. Values are actually read out from the battery, not just a copy of what the Teleport has been instructed to do
    "configuration": { 
      "dispatchPower": {
        "activePower": 50.1, // In W. Positive means discharging, negative charging.
      },
      "deliverFCR": {
        "maxRate": 100.1, // In W. Nonnegative.
      },
      "chargeToState": {
        "percentage": 50.1, // In %. Nonnegative
      }
    },
    "warnings": ["ALFEN_SOME_WARNING_1", "ATEPS_SOME_WARNING_B"], // complete list of warnings still to be determined
    "errors": ["ALFEN_SOME_ERROR_1"], // complete list of errors still to be determined
    "scheduleCompleteUntil": "2023-01-01T00:00:00Z", // first gap in the schedule for this assetIdentifier. ISO 8601 yyyy-mm-ddThh:mm:ssZ or YYYYYY-MM-DDTHH:mm:ss.sssZ, so in UTC
    "scheduled": true // false for measurements that are not part of the regular reporting interval, eg. directly after command execution and at Teleport initialisation
  }
]

Regular messages for operators

A regular message for operators contains a subset of the information available in the regular message and is sent out at the same frequency. An example of a request containing one message for operators forwarded from a Teleport device that is connected to a battery:

[
  {
    "type": "batteryPower.filtered:1", // identifies this schema
    "teleportHashId": "8de4y2", // uniquely identifies the teleport device
    "assetIdentifier": "alfen-123", // brand and serial number of the asset or if that's not available, its (IP) address
    "attempt": 0, // 0-indexed delivery attempt. integer
    "measuredAt": "2023-01-01T00:00:00Z", // when read-out started, ISO 8601 yyyy-mm-ddThh:mm:ssZ or YYYYYY-MM-DDTHH:mm:ss.sssZ, so in UTC
    "batteryStatus": "on", // can be "on", "off" or "other" (see warning and errors in case of 'other')
    "frequency": 50.1, // in Hz, can be null. Nonnegative
    "activePower": 1000.1, // in W, can be null. Positive means discharging, negative charging.
    "stateOfCharge": 90.1, // in %, can be null. Nonnegative
    "availableEnergy": 50.1, // in Wh, can be null. Nonnegative
    "ratedEnergy": 1000.1, // in Wh, can be null. Nonnegative
    "availableActivePower": {
      "charge": 300.1, // in W, can be null. Nonnegative
      "discharge": 500.1, // in W, can be null. Nonnegative
    },
    // The configuration property has the same structure as the operation property of a SetBatteryOperation. Values are actually read out from the battery, not just a copy of what the Teleport has been instructed to do
    "configuration": { 
      "dispatchPower": {
        "activePower": 50.1, // In W. Positive means discharging, negative charging.
      },
      "deliverFCR": {
        "maxRate": 100.1, // In W. Nonnegative.
      },
      "chargeToState": {
        "percentage": 50.1, // In %. Nonnegative
      }
    },
    "warnings": ["ALFEN_SOME_WARNING_1", "ATEPS_SOME_WARNING_B"], // complete list of warnings still to be determined
    "errors": ["ALFEN_SOME_ERROR_1"], // complete list of errors still to be determined
    "scheduleCompleteUntil": "2023-01-01T00:00:00Z", // first gap in the schedule for this assetIdentifier. ISO 8601 yyyy-mm-ddThh:mm:ssZ or YYYYYY-MM-DDTHH:mm:ss.sssZ, so in UTC
    "scheduled": true // false for measurements that are not part of the regular reporting interval, eg. directly after command execution and at Teleport initialisation
  }
]

Flash messages

Batteries report flash messages more often than regular messages (typically every second) and contain information that is needed for dispatching algorithms and to forward to the TSO when doing aFRR/FCR. An example of a request containing one flash message forwarded from a Teleport device that is connected to a battery:

[
  {
    "type": "batteryPower.flash:1", // identifies this schema
    "teleportHashId": "8de4y2", // uniquely identifies the teleport device
    "assetIdentifier": "tcp://192.168.0.2:2000", // brand and serial number of the asset or if that's not available, its (IP) address
    "attempt": 0, // 0-indexed delivery attempt. integer
    "measuredAt": "2023-01-01T00:00:00Z", // when read-out started, ISO 8601 yyyy-mm-ddThh:mm:ssZ or YYYYYY-MM-DDTHH:mm:ss.sssZ, so in UTC
    "frequency": 50.1, // in Hz, can be null
    "activePower": 1000.1, // in W, can be null. Positive means discharging, negative charging.
    "availableEnergy": 1000.1, // in Wh, can be null
    "availableActivePower": {
      "charge": 300.1, // in W, can be null
      "discharge": 500.1, // in W, can be null
    },
    "stateOfCharge": 90.1, // in %, can be null.
    "scheduled": true // false for measurements that are not part of the regular reporting interval, eg. directly after command execution and at Teleport initialisation
  }
]

Meter power

An example of a request containing one message forwarded from a Teleport device that is connected to a power meter:

[
  {
    "type": "meterPower:1", // identifies this schema
    "teleportHashId": "8de4y2", // uniquely identifies the teleport device
    "assetIdentifier": "janitza-UMG806-12345", // brand and serial number of the asset or if that's not available, its (IP) address
    "attempt": 0, // 0-indexed delivery attempt. integer
    "measuredAt": "2023-01-01T00:00:00Z", // when read-out started, ISO 8601 yyyy-mm-ddThh:mm:ssZ or YYYYYY-MM-DDTHH:mm:ss.sssZ, so in UTC
    "phaseVoltage": {
      "l1": 230.4, // in V, can be null. Nonnegative
      "l2": 230.1, // in V, can be null. Nonnegative
      "l3": 230.2, // in V, can be null. Nonnegative
    },
    "current": {
      "l1": 11.4, // in A, can be null. Delivering to the grid is a positive value
      "l2": 12.5, // in A, can be null. Delivering to the grid is a positive value
      "l3": 10.1, // in A, can be null. Delivering to the grid is a positive value
    },
    "activePower": {
      "l1": 2626.56, // in W, can be null. Delivering to the grid is a positive value
      "l2": 2876.25, // in W, can be null. Delivering to the grid is a positive value
      "l3": 2325.02, // in W, can be null. Delivering to the grid is a positive value
      "sum": 7827.83, // in W, can be null. Delivering to the grid is a positive value
    },
    "reactivePower": {
      "l1": 0.2, // in var, can be null. Positive is injecting reactive power to the grid and negative is absorbing reactive power
      "l2": 0.2, // in var, can be null. Positive is injecting reactive power to the grid and negative is absorbing reactive power
      "l3": 0.2, // in var, can be null. Positive is injecting reactive power to the grid and negative is absorbing reactive power
      "sum": 0.2, // in var, can be null. Positive is injecting reactive power to the grid and negative is absorbing reactive power
    },
    "frequency": 50.21,  // in Hz, can be null. Nonnegative
    "activeEnergyConsumed": {
      "l1": 31235.1, // in Wh, can be null. Nonnegative
      "l2": 31235.1, // in Wh, can be null. Nonnegative
      "l3": 31235.1, // in Wh, can be null. Nonnegative
      "sum": 93702.1, // in Wh, can be null. Nonnegative
    },
    "activeEnergyDelivered": {
      "l1": 31235.2, // in Wh, can be null. Nonnegative
      "l2": 31235.2, // in Wh, can be null. Nonnegative
      "l3": 31235.2, // in Wh, can be null. Nonnegative
      "sum": 93702.2, // in Wh, can be null. Nonnegative
    },
    "scheduled": true // false for measurements that are not part of the regular reporting interval, eg. directly after command execution and at Teleport initialisation
  }
]