Type Application Shared Language (ASL) Specifications

component.attribute.class.gt.000

{
  "gtr_asl": "001",
  "type_name": "component.attribute.class.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Component Attribute Class Gt. Authority for the attributes of the component.attribute.class.gt.000 belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data. Generally speaking, a component attribute class is meant to specify WHAT you might order from a plumbing supply store to 'get the same part.' The Component refers to something that will have a specific serial number.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component-attribute-class.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). This identifier is used to associate a make/model with a specific component (i.e. the component will point to its ComponentAttributeClassId).",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Optional Mutable field to include manufacturer's model name. Note that several different models may be given the same spaceheat.make.model enum name.",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "component.attribute.class.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ComponentAttributeClassId": "683c193a-bf83-4491-a294-c0e32865a407",
    "DisplayName": "Axeman Pressurized 150 Gallon Water Tank",
    "TypeName": "component.attribute.class.gt",
    "Version": "000"
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

component.gt.000

{
  "gtr_asl": "001",
  "type_name": "component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Component Gt. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary identifier for components in all GridWorks registries.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for ComponentAttributeClass object articulated by the component.attribute.class.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "This is an optional, mutable field whose use is strongly encouraged. It may include information about HOW the component is used in a hardware layout. It may also include the HwUid for the component.",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "description": "Usually this is determined by the inheriting class.",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ComponentId": "780788df-9706-4299-b116-304a48838338",
    "DisplayName": "Little Orange house Axeman Tank",
    "ComponentAttributeClassId": "683c193a-bf83-4491-a294-c0e32865a407",
    "TypeName": "component.gt",
    "Version": "000"
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

data.channel.000

{
  "gtr_asl": "001",
  "type_name": "data.channel",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Data Channel. A data channel is a concept of some collection of readings that share all characteristics other than time.",
  "properties": {
    "DisplayName": {
      "type": "string",
      "description": "This display name is the handle for the data channel. It is meant to be set by the person/people who will be analyzing time series data. It is only expected to be unique within the data channels associated to a specific Terminal Asset.",
      "required": true
    },
    "AboutName": {
      "type": "string",
      "format": "SpaceheatName",
      "title": "About Name",
      "description": "The name of the SpaceheatNode whose physical quantities are getting captured.",
      "required": true
    },
    "CapturedByName": {
      "type": "string",
      "format": "SpaceheatName",
      "title": "",
      "description": "The name of the SpaceheatNode that is capturing the physical quantities (which can be AboutName but does not have to be).",
      "required": true
    },
    "TelemetryName": {
      "type": "string",
      "format": "spaceheat.telemetry.name",
      "title": "",
      "description": "The name of the physical quantity getting measured.",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "data.channel",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "SpaceheatName": {
      "type": "string",
      "description": "Lowercase words separated by periods, where the word characters can be alphanumeric or a hyphen and the first word starts with an alphabet character.",
      "example": "store-hot-pipe"
    }
  }
}

egauge.io.000

{
  "gtr_asl": "001",
  "type_name": "egauge.io",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Used for an eGauge meter's component information in a hardware layout. When the component associated to a PowerMeter ShNode has MakeModel EGAUGE__4030, there is a significant amount of configuration required to specify both what is read from the eGauge (input) and what is then sent up to the SCADA (output). This type handles that information.",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/egauge-io.html",
  "properties": {
    "InputConfig": {
      "type": "egauge.register.config.000",
      "description": "This is the data available from the modbus csv map provided by eGauge for this component, for example http://egauge14875.egaug.es/6001C/settings.html for a eGauge device with ID 14875",
      "required": true
    },
    "OutputConfig": {
      "type": "telemetry.reporting.config.000",
      "description": "This is the data as the Scada proactor expects to consume it from the power meter driver proactor.",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "egauge.io",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "InputConfig": {
      "Address": 9016,
      "Name": "house-panel-power",
      "Description": "change in value",
      "Type": "f32",
      "Denominator": 1,
      "Unit": "W",
      "TypeName": "egauge.register.config",
      "Version": "000"
    },
    "OutputConfig": {
      "TelemetryNameGtEnumSymbol": "af39eec9",
      "AboutNodeName": "house-panel-power",
      "ReportOnChange": true,
      "SamplePeriodS": 300,
      "Exponent": 0,
      "UnitGtEnumSymbol": "f459a9c3",
      "AsyncReportThreshold": 0.02,
      "NameplateMaxValue": 3500,
      "TypeName": "telemetry.reporting.config",
      "Version": "000"
    },
    "TypeName": "egauge.io",
    "Version": "000"
  }
}

egauge.register.config.000

{
  "gtr_asl": "001",
  "type_name": "egauge.register.config",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Used to translate eGauge's Modbus Map. This type captures the information provided by eGauge in its modbus csv map, when reading current, power, energy, voltage, frequency etc from an eGauge 4030.",
  "properties": {
    "Address": {
      "type": "integer",
      "description": "EGauge's modbus holding address. Note that the EGauge modbus map for holding address 100 will be 30100 - the '+30000' indicates it is a holding address. We use the 4-digit address after the '3'.",
      "required": true
    },
    "Name": {
      "type": "string",
      "description": "The name assigned in the EGauge's modbus map. This is configured by the user (see URL)",
      "required": true
    },
    "Description": {
      "type": "string",
      "description": "Again, assigned by the EGauge modbus map. Is usually 'change in value'",
      "required": true
    },
    "Type": {
      "type": "string",
      "description": "EGauge's numerical data type. Typically our power measurements are f32 ( 32-bit floating-point number). The serial number & firmware are t16 (which work to treat as 16-bit unsigned integer) and timestamps are u32 (32-bit unsigned integer).",
      "required": true
    },
    "Denominator": {
      "type": "integer",
      "description": "Some of the modbus registers divide by 3.60E+06 (cumulative energy registers typically). For the power, current, voltage and phase angle the denominator is 1.",
      "required": true
    },
    "Unit": {
      "type": "string",
      "description": "The EGauge unit - typically A, Hz, or W.",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "egauge.register.config",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "Address": 9016,
    "Name": "house-panel-power",
    "Description": "change in value",
    "Type": "f32",
    "Denominator": 1,
    "Unit": "W",
    "TypeName": "egauge.register.config",
    "Version": "000"
  }
}

electric.meter.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "electric.meter.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking  Electric Meter ComponentAttributeClasses. GridWorks Spaceheat SCADA uses the GridWorks GNodeRegistry structures and abstractions for managing relational device data. The Cac, or ComponentAttributeClass, is part of this structure.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component-attribute-class.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "MakeModel": {
      "type": "string",
      "format": "spaceheat.make.model",
      "title": "MakeModel",
      "description": "The brand name identifier for the electric meter (what you would specify in order to buy one).",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: EGauge 4030",
      "required": false
    },
    "TelemetryNameList": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "format": "spaceheat.telemetry.name",
      "title": "TelemetryNames read by this power meter",
      "required": true
    },
    "PollPeriodMs": {
      "type": "integer",
      "description": "Poll Period refers to the period of time between two readings by the local actor. This is in contrast to Capture Period, which refers to the period between readings that are sent up to the cloud (or otherwise saved for the long-term).",
      "required": true
    },
    "Interface": {
      "type": "string",
      "format": "local.comm.interface",
      "title": "",
      "required": true
    },
    "DefaultBaud": {
      "type": "integer",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "electric.meter.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ComponentAttributeClassId": "739a6e32-bb9c-43bc-a28d-fb61be665522",
    "DisplayName": "EGauge 4030",
    "InterfaceGtEnumSymbol": "c1e7a955",
    "MakeModelGtEnumSymbol": "beb6d3fb",
    "PollPeriodMs": 1000,
    "TelemetryNameList": ["af39eec9"],
    "TypeName": "electric.meter.cac.gt",
    "Version": "000"
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "PositiveInteger": {
      "type": "string",
      "description": "Must be positive when interpreted as an integer. Interpretation as an integer follows the pydantic rules for this - which will round down rational numbers. So 1.7 will be interpreted as 1 and is also fine, while 0.5 is interpreted as 0 and will raise an exception.",
      "example": ""
    }
  }
}

electric.meter.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "electric.meter.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Electric Meter Components. Designed for specific instances of Electric Meters. It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/electric-meters.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of an ElectricMeter, and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for ElectricMeterCac object articulated by the electric.meter.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Oak EGauge6074",
      "required": false
    },
    "ConfigList": {
      "type": "array",
      "items": {
        "type": "telemetry.reporting.config.000"
      },
      "description": "This power meter will produce multiple data channels. Each data channel measures a certain quantities (like power, current) for certain ShNodes (like a boost element or heat pump).",
      "required": true
    },
    "HwUid": {
      "type": "string",
      "description": "For eGauge, use what comes back over modbus address 100.",
      "required": false
    },
    "ModbusHost": {
      "type": "string",
      "required": false
    },
    "ModbusPort": {
      "type": "integer",
      "format": "NonNegativeInteger",
      "title": "",
      "required": false
    },
    "EgaugeIoList": {
      "type": "array",
      "items": {
        "type": "egauge.io.000"
      },
      "description": "This should be empty unless the MakeModel of the corresponding component attribute class is EGauge 4030. The channels that can be read from an EGauge 4030 are configurable by the person who installs the device. The information is encapsulated in a modbus map provided by eGauge as a csv from a device-specific API. The EGaugeIoList maps the data from this map to the data that the SCADA expects to see.",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "electric.meter.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "axioms": {
    "Axiom1": {
      "title": "Modbus consistency",
      "description": "ModbusHost is None if and only if ModbusPort is None"
    },
    "Axiom2": {
      "title": "Egauge4030 consistency",
      "description": "If the EgaugeIoList has non-zero length, then the ModbusHost is not None and the set of output configs is equal to ConfigList as a set"
    }
  },
  "example": {
    "ComponentAttributeClassId": "739a6e32-bb9c-43bc-a28d-fb61be665522",
    "ComponentId": "36a31af8-5ff6-4105-a751-fb858889bc60",
    "DisplayName": "Oak EGauge6074",
    "HwUid": "BP01954",
    "ModbusHost": "eGauge6074.local",
    "ModbusPort": 502,
    "ConfigList": [
      {
        "AboutNodeName": "a.m.house.panel.power",
        "AsyncReportThreshold": 0.02,
        "Exponent": 0,
        "NameplateMaxValue": 3500,
        "ReportOnChange": true,
        "SamplePeriodS": 300,
        "TelemetryNameGtEnumSymbol": "af39eec9",
        "TypeName": "telemetry.reporting.config",
        "UnitGtEnumSymbol": "f459a9c3",
        "Version": "000"
      },
      {
        "AboutNodeName": "oilpluspumpspower",
        "AsyncReportThreshold": 0.02,
        "Exponent": 0,
        "NameplateMaxValue": 1000,
        "ReportOnChange": true,
        "SamplePeriodS": 300,
        "TelemetryNameGtEnumSymbol": "af39eec9",
        "TypeName": "telemetry.reporting.config",
        "UnitGtEnumSymbol": "f459a9c3",
        "Version": "000"
      }
    ],
    "EgaugeIoList": [
      {
        "InputConfig": {
          "Address": 9016,
          "Denominator": 1,
          "Description": "change in value",
          "Name": "house-panel-power",
          "Type": "f32",
          "TypeName": "egauge.register.config",
          "Unit": "W",
          "Version": "000"
        },
        "OutputConfig": {
          "AboutNodeName": "a.m.house.panel.power",
          "AsyncReportThreshold": 0.02,
          "Exponent": 0,
          "NameplateMaxValue": 3500,
          "ReportOnChange": true,
          "SamplePeriodS": 300,
          "TelemetryNameGtEnumSymbol": "af39eec9",
          "TypeName": "telemetry.reporting.config",
          "UnitGtEnumSymbol": "f459a9c3",
          "Version": "000"
        },
        "TypeName": "egauge.io",
        "Version": "000"
      },
      {
        "InputConfig": {
          "Address": 9018,
          "Denominator": 1,
          "Description": "change in value",
          "Name": "oil-boiler-plus-pumps",
          "Type": "f32",
          "TypeName": "egauge.register.config",
          "Unit": "W",
          "Version": "000"
        },
        "OutputConfig": {
          "AboutNodeName": "oilpluspumpspower",
          "AsyncReportThreshold": 0.02,
          "Exponent": 0,
          "NameplateMaxValue": 1000,
          "ReportOnChange": true,
          "SamplePeriodS": 300,
          "TelemetryNameGtEnumSymbol": "af39eec9",
          "TypeName": "telemetry.reporting.config",
          "UnitGtEnumSymbol": "f459a9c3",
          "Version": "000"
        },
        "TypeName": "egauge.io",
        "Version": "000"
      }
    ],
    "TypeName": "electric.meter.component.gt",
    "Version": "000"
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "PositiveInteger": {
      "type": "string",
      "description": "Must be positive when interpreted as an integer. Interpretation as an integer follows the pydantic rules for this - which will round down rational numbers. So 1.7 will be interpreted as 1 and is also fine, while 0.5 is interpreted as 0 and will raise an exception.",
      "example": ""
    },
    "NonNegativeInteger": {
      "type": "string",
      "description": "Must be non-negative when interpreted as an integer. Interpretation as an integer follows the pydantic rules for this - which will round down rational numbers. So 0 is fine, and 1.7 will be interpreted as 1 and is also fine.",
      "example": ""
    }
  }
}

fibaro.smart.implant.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "fibaro.smart.implant.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Fibaro Make/Model. A small IoT Z-Wave device with two analog sensors, two digital outputs and a 1-wire temp sensor.",
  "url": "https://www.fibaro.com/us/products/smart-implant/",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "Model": {
      "type": "string",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: FGBS-222 v5.2",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "fibaro.smart.implant.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ComponentAttributeClassId": "7ce0ce69-14c6-4cb7-a33f-2aeca91e0680",
    "DisplayName": "Fibaro SmartImplant FGBS-222",
    "Model": "FGBS-222 v5.2",
    "TypeName": "fibaro.smart.implant.cac.gt",
    "Version": "000"
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

fibaro.smart.implant.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "fibaro.smart.implant.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Fibaro Smart Implant. Designed for specific Fibaro Smart Implants. It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://www.fibaro.com/us/products/smart-implant/",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of an Fibaro, and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for FibaroSmartImplantCac object articulated by the fibaro.smart.implant.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "ZWaveDSK": {
      "type": "string",
      "description": "The Z-Wave DSK (Device Specific Key) is a unique identifier associated with a Z-Wave device, used during the process of securely including the device into a Z-Wave network. It helps establish secure communication between the Z-Wave controller and the device, ensuring that only authorized devices can join the network. Unfortunately Hubitat does not currently provide a way to view the ZWave DSK of a Fibaro.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Fibaro Smart Implant 1010 A (For Fibaro A as opposed to B for GridWorks TankModule1 with Serial Number 1010).",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "description": "Use the Fibaro S2 PIN Code, which is printed on the back of each Fibaro Implant.",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "fibaro.smart.implant.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ComponentId": "1fdd40dd-14d7-4da2-8cf8-7cf66484e385",
    "ComponentAttributeClassId": "7ce0ce69-14c6-4cb7-a33f-2aeca91e0680",
    "DisplayName": "Fibaro 1010 A",
    "ZWaveDSK": "",
    "HwUid": "20134",
    "TypeName": "fibaro.smart.implant.component.gt",
    "Version": "000"
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

gt.dispatch.boolean.110

{
  "gtr_asl": "001",
  "type_name": "gt.dispatch.boolean",
  "version": "110",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "GridWorks Type Boolean Dispatch. Boolean dispatch command designed to be sent from an AtomicTNode to a SCADA.",
  "properties": {
    "AboutNodeName": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "The Spaceheat Node getting dispatched",
      "required": true
    },
    "ToGNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "GNodeAlias of the SCADA",
      "required": true
    },
    "FromGNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "GNodeAlias of AtomicTNode",
      "required": true
    },
    "FromGNodeInstanceId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "GNodeInstance of the AtomicTNode",
      "required": true
    },
    "RelayState": {
      "type": "integer",
      "format": "Bit",
      "title": "Relay State (0 or 1)",
      "description": "A Relay State of `0` indicates the relay is OPEN (off). A Relay State of `1` indicates the relay is CLOSED (on). Note that `0` means the relay is open whether or not the relay is normally open or normally closed (For a normally open relay, the relay is ENERGIZED when it is in state `0` and DE-ENERGIZED when it is in state `1`.)",
      "required": true
    },
    "SendTimeUnixMs": {
      "type": "integer",
      "format": "ReasonableUnixTimeMs",
      "title": "Time the AtomicTNode sends the dispatch, by its clock",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.dispatch.boolean",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "110",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "Bit": {
      "type": "string",
      "description": "The value must be the integer 0 or the integer 1. Will not attempt to first interpret as an integer. For example, 1.3 will not be interpreted as 1 but will raise an error.",
      "example": ""
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

gt.dispatch.boolean.local.110

{
  "gtr_asl": "001",
  "type_name": "gt.dispatch.boolean.local",
  "version": "110",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Dispatch message sent locally by SCADA HomeAlone actor. By Locally, this means sent without access to Internet. The HomeAlone actor must reside within the Local Area Network of the SCADA - typically it should reside on the same hardware.",
  "properties": {
    "RelayState": {
      "type": "integer",
      "format": "Bit",
      "title": "Relay State (0 or 1)",
      "description": "A Relay State of `0` indicates the relay is OPEN (off). A Relay State of `1` indicates the relay is CLOSED (on). Note that `0` means the relay is open whether or not the relay is normally open or normally closed (For a normally open relay, the relay is ENERGIZED when it is in state `0` and DE-ENERGIZED when it is in state `1`.)",
      "required": true
    },
    "AboutNodeName": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "About Node Name",
      "description": "The boolean actuator Spaceheat Node getting turned on or off.",
      "required": true
    },
    "FromNodeName": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "From Node Name",
      "description": "The Spaceheat Node sending the command.",
      "required": true
    },
    "SendTimeUnixMs": {
      "type": "integer",
      "format": "ReasonableUnixTimeMs",
      "title": "Send Time in Unix Milliseconds",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.dispatch.boolean.local",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "110",
      "required": true
    }
  },
  "formats": {
    "Bit": {
      "type": "string",
      "description": "The value must be the integer 0 or the integer 1. Will not attempt to first interpret as an integer. For example, 1.3 will not be interpreted as 1 but will raise an error.",
      "example": ""
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

gt.driver.booleanactuator.cmd.100

{
  "gtr_asl": "001",
  "type_name": "gt.driver.booleanactuator.cmd",
  "version": "100",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Boolean Actuator Driver Command. The boolean actuator actor reports when it has sent an actuation command to its driver so that the SCADA can add this to information to be sent up to the AtomicTNode.",
  "url": "https://gridworks.readthedocs.io/en/latest/relay-state.html",
  "properties": {
    "RelayState": {
      "type": "integer",
      "format": "Bit",
      "title": "",
      "required": true
    },
    "ShNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "",
      "required": true
    },
    "CommandTimeUnixMs": {
      "type": "integer",
      "format": "ReasonableUnixTimeMs",
      "title": "",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.driver.booleanactuator.cmd",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "100",
      "required": true
    }
  },
  "formats": {
    "Bit": {
      "type": "string",
      "description": "The value must be the integer 0 or the integer 1. Will not attempt to first interpret as an integer. For example, 1.3 will not be interpreted as 1 but will raise an error.",
      "example": ""
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

gt.sh.booleanactuator.cmd.status.100

{
  "gtr_asl": "001",
  "type_name": "gt.sh.booleanactuator.cmd.status",
  "version": "100",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Boolean  Actuator Driver Command Status Package. This is a subtype of the status message sent from a SCADA to its AtomicTNode. It contains a list of all the commands that a particular boolean actuator actor has reported as sending as actuation commands to its driver in the last transmission period (typically 5 minutes).",
  "url": "https://gridworks.readthedocs.io/en/latest/relay-state.html",
  "properties": {
    "ShNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "SpaceheatNodeAlias",
      "description": "The alias of the spaceheat node that is getting actuated. For example, `a.elt1.relay` would likely indicate the relay for a resistive element.",
      "required": true
    },
    "RelayStateCommandList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "required": true
    },
    "CommandTimeUnixMsList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "format": "ReasonableUnixTimeMs",
      "title": "List of Command Times",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.sh.booleanactuator.cmd.status",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "100",
      "required": true
    }
  },
  "formats": {
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

gt.sh.cli.atn.cmd.110

{
  "gtr_asl": "001",
  "type_name": "gt.sh.cli.atn.cmd",
  "version": "110",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "AtomicTNode CLI Command. This is a generic type mechanism for a crude command line interface on a SCADA, brokered by the AtomicTNode.",
  "properties": {
    "FromGNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "GNodeAlias",
      "description": "Must be the SCADA's AtomicTNode.",
      "required": true
    },
    "SendSnapshot": {
      "type": "boolean",
      "description": "Asks SCADA to send back a snapshot. For this version of the type, nothing would happen if SendSnapshot were set to False. However, we include this in case additional variations are added later.",
      "required": true
    },
    "FromGNodeId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "GNodeId",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.sh.cli.atn.cmd",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "110",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    }
  }
}

gt.sh.multipurpose.telemetry.status.100

{
  "gtr_asl": "001",
  "type_name": "gt.sh.multipurpose.telemetry.status",
  "version": "100",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Data read from a MultipurposeSensor run by a Spaceheat SCADA. A list of readings about a specific SpaceheatNode made by a MultipurposeSensor node, for a Spaceheat SCADA. Designed as part of a status message sent from the SCADA to its AtomicTNode typically once every 5 minutes. The nth element of each of its two lists refer to the same reading (i.e. what the value is, when it was read).",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/multipurpose-sensor.html",
  "properties": {
    "AboutNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "AboutNodeAlias",
      "description": "The SpaceheatNode representing the physical object that the sensor reading is collecting data about. For example, a multipurpose temp sensor that reads 12 temperatures would have data for 12 different AboutNodeAliases, including say `a.tank1.temp1` for a temp sensor at the top of a water tank.",
      "required": true
    },
    "SensorNodeAlias": {
      "type": "string",
      "description": "The alias of the SpaceheatNode representing the telemetry device",
      "required": true
    },
    "TelemetryName": {
      "type": "string",
      "format": "spaceheat.telemetry.name",
      "title": "TelemetryName",
      "description": "The TelemetryName of the readings. This is used to interpet the meaning of the reading values. For example, WaterTempCTimes1000 means the reading is measuring the a reading of 37 deg C.",
      "required": true
    },
    "ValueList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "The values of the readings.",
      "required": true
    },
    "ReadTimeUnixMsList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "format": "ReasonableUnixTimeMs",
      "title": "List of Read Times",
      "description": "The times that the MultipurposeSensor took the readings, in unix milliseconds",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.sh.multipurpose.telemetry.status",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "100",
      "required": true
    }
  },
  "axioms": {
    "Axiom1": {
      "title": "ListLengthConsistency",
      "description": "ValueList and ReadTimeUnixMsList must have the same length."
    }
  },
  "formats": {
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

gt.sh.simple.telemetry.status.100

{
  "gtr_asl": "001",
  "type_name": "gt.sh.simple.telemetry.status",
  "version": "100",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Data read from a SimpleSensor run by a SpaceHeat SCADA. A list of readings from a simple sensor for a Spaceheat SCADA. Designed as part of a status message sent from the SCADA to its AtomicTNode typically once every 5 minutes. The nth element of each of its two lists refer to the same reading (i.e. what the value is, when it was read).",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/simple-sensor.html",
  "properties": {
    "ShNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "SpaceheatNodeAlias",
      "description": "The Alias of the SimpleSensor associated to the readings",
      "required": true
    },
    "TelemetryName": {
      "type": "string",
      "format": "spaceheat.telemetry.name",
      "title": "TelemetryName",
      "description": "The TelemetryName of the readings. This is used to interpet the meaning of the reading values. For example, WaterTempCTimes1000 means the reading is measuring the temperature of water, in Celsius multiplied by 1000. So a value of 37000 would be a reading of 37 deg C.",
      "required": true
    },
    "ValueList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "description": "The values of the readings.",
      "required": true
    },
    "ReadTimeUnixMsList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "format": "ReasonableUnixTimeMs",
      "title": "List of Read Times",
      "description": "The times that the SImpleSensor took the readings, in unix milliseconds",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.sh.simple.telemetry.status",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "100",
      "required": true
    }
  },
  "axioms": {
    "Axiom1": {
      "title": "ListLengthConsistency",
      "description": "ValueList and ReadTimeUnixMsList must have the same length."
    }
  },
  "formats": {
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

gt.sh.status.110

{
  "gtr_asl": "001",
  "type_name": "gt.sh.status",
  "version": "110",
  "owner": "gridworks@gridworks-consulting.com",
  "description": ". Status message sent by a Spaceheat SCADA every 5 minutes",
  "properties": {
    "FromGNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "",
      "required": true
    },
    "FromGNodeId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "",
      "required": true
    },
    "AboutGNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "",
      "required": true
    },
    "SlotStartUnixS": {
      "type": "integer",
      "format": "ReasonableUnixTimeS",
      "title": "",
      "required": true
    },
    "ReportingPeriodS": {
      "type": "integer",
      "required": true
    },
    "SimpleTelemetryList": {
      "type": "array",
      "items": {
        "type": "gt.sh.simple.telemetry.status.100"
      },
      "required": true
    },
    "MultipurposeTelemetryList": {
      "type": "array",
      "items": {
        "type": "gt.sh.multipurpose.telemetry.status.100"
      },
      "required": true
    },
    "BooleanactuatorCmdList": {
      "type": "array",
      "items": {
        "type": "gt.sh.booleanactuator.cmd.status.100"
      },
      "required": true
    },
    "StatusUid": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.sh.status",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "110",
      "required": true
    }
  },
  "formats": {
    "ReasonableUnixTimeS": {
      "type": "string",
      "description": "Integer reflecting unix time seconds between 1970 and 3000",
      "example": ""
    },
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    }
  }
}

gt.sh.telemetry.from.multipurpose.sensor.100

{
  "gtr_asl": "001",
  "type_name": "gt.sh.telemetry.from.multipurpose.sensor",
  "version": "100",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Data sent from a MultipurposeSensor to a Spaceheat SCADA. A set of readings made at the same time by a multipurpose sensor, sent by the MultipurposeSensor SpaceheatNode actor to its SCADA. The nth element of each of its three readings (what is getting read, what the value is, what the TelemetryNames are).",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/multipurpose-sensor.html",
  "properties": {
    "ScadaReadTimeUnixMs": {
      "type": "integer",
      "format": "ReasonableUnixTimeMs",
      "title": "ScadaReadTime in Unix MilliSeconds",
      "required": true
    },
    "AboutNodeAliasList": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "format": "LeftRightDot",
      "title": "AboutNodeAliasList",
      "description": "List of aliases of the SpaceHeat Nodes getting measured",
      "required": true
    },
    "TelemetryNameList": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "format": "spaceheat.telemetry.name",
      "title": "TelemetryNameList",
      "description": "List of the TelemetryNames. The nth name in this list indicates the TelemetryName of the nth alias in the AboutNodeAliasList.",
      "required": true
    },
    "ValueList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.sh.telemetry.from.multipurpose.sensor",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "100",
      "required": true
    }
  },
  "axioms": {
    "Axiom1": {
      "title": "ListLengthConsistency",
      "description": "AboutNodeAliasList, ValueList and TelemetryNameList must all have the same length."
    }
  },
  "formats": {
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

gt.telemetry.110

{
  "gtr_asl": "001",
  "type_name": "gt.telemetry",
  "version": "110",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Data sent from a SimpleSensor to a SCADA. This type is meant to be used by a SimpleSensor, where _what_ is doing the reading can be conflated with _what_ is being read.",
  "properties": {
    "ScadaReadTimeUnixMs": {
      "type": "integer",
      "format": "ReasonableUnixTimeMs",
      "title": "Scada Read Time in Unix Milliseconds",
      "required": true
    },
    "Value": {
      "type": "integer",
      "description": "The value of the reading.",
      "required": true
    },
    "Name": {
      "type": "string",
      "format": "spaceheat.telemetry.name",
      "title": "Name",
      "description": "The name of the Simple Sensing Spaceheat Node. This is both the AboutNodeName and FromNodeName for a data channel. The TelemetryName (and thus Units) are expected to be inferred by the Spaceheat Node. For example this is done initially in SCADA code according to whether the component of the Node is a PipeFlowSensorComponent, SimpleTempSensorComponent etc.",
      "required": true
    },
    "Exponent": {
      "type": "integer",
      "description": "Say the TelemetryName is WaterTempCTimes1000; this corresponds to units of Celsius. To match the implication in the name, the Exponent should be 3, and a Value of 65300 would indicate 65.3 deg C",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "gt.telemetry",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "110",
      "required": true
    }
  },
  "formats": {
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

heartbeat.b.001

{
  "gtr_asl": "001",
  "type_name": "heartbeat.b",
  "version": "001",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Heartbeat B. This is the Heartbeat intended to be sent between the Scada and the AtomicTNode to allow for block-chain validation of the status of their communication.",
  "url": "https://gridworks.readthedocs.io/en/latest/dispatch-contract.html",
  "properties": {
    "FromGNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "My GNodeAlias",
      "required": true
    },
    "FromGNodeInstanceId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "My GNodeInstanceId",
      "required": true
    },
    "MyHex": {
      "type": "string",
      "format": "HexChar",
      "title": "Hex character getting sent",
      "required": true
    },
    "YourLastHex": {
      "type": "string",
      "format": "HexChar",
      "title": "Last hex character received from heartbeat partner.",
      "required": true
    },
    "LastReceivedTimeUnixMs": {
      "type": "integer",
      "format": "ReasonableUnixTimeMs",
      "title": "Time YourLastHex was received on my clock",
      "required": true
    },
    "SendTimeUnixMs": {
      "type": "integer",
      "format": "ReasonableUnixTimeMs",
      "title": "Time this message is made and sent on my clock",
      "required": true
    },
    "StartingOver": {
      "type": "boolean",
      "description": "(typically the AtomicTNode in an AtomicTNode / SCADA pair) wants to start the heartbeating volley over. The result is that its partner will not expect the initiator to know its last Hex.",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "heartbeat.b",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "001",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "HexChar": {
      "type": "string",
      "description": "single-char string in '0123456789abcdefABCDEF'",
      "example": "d"
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}

hubitat.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "hubitat.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Hubitat Component Attribute Class (GridWorks Type). Hubitat is a company that makes IoT hubs. This is a type for MakeModels made by Hubitat.",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/iot-hubs.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Hubitat Elevation C-7",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "hubitat.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ComponentAttributeClassId": "62528da5-b510-4ac2-82c1-3782842eae07",
    "DisplayName": "Hubitat Elevation C-7",
    "TypeName": "hubitat.cac.gt",
    "Version": "000"
  }
}

hubitat.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "hubitat.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Hubitat Component (GridWorks Type). Designed for specific Hubitat hubs. It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/iot-hubs.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of a Hubitat, and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for HubitatCac object articulated by the hubitat.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "Hubitat": {
      "type": "dictDict",
      "description": "Includes the information needed to access the MakerAPI of a Hubitat on the Local area network: Host, MakerApiID, AccessToken and MacAddress for the Hubitat.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Oak Hubitat 81:37:82 (using the last 6 digits of the Hubitat MacId in the display name, as well as the short alias for the associated g node.)",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "description": "Use the final 6 characters of the Hubitat mac address.",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "hubitat.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "axioms": {
    "Axiom1": {
      "title": "Hubitat.MacAddressId must have MacAddress format",
      "description": "Mac Address format is 6 pairs of double hex digits separated by colons, agnostic to caps. - e.g. '34:E1:D1:81:37:82' and '34:e1:d1:81:37:82' both satisfy this property. This works in python: MAC_REGEX = re.compile('[0-9a-f]{2}([-:]?)[0-9a-f]{2}(\\1[0-9a-f]{2}){4}$') and then bool(MAC_REGEX.match(mac_str.lower()))"
    },
    "Axiom2": {
      "title": "HwUid matches Hubitat MacAddress",
      "description": "The HwUid must exist, and it must be lower alphanumeric versions of the last 6 digits of the Hubitat.MacAddressId with the colons taken out. For example, if the HubitatMacAddressId is '34:E1:D1:81:37:8A' then the HwUid must be '81378a'."
    }
  },
  "example": {
    "ComponentAttributeClassId": "62528da5-b510-4ac2-82c1-3782842eae07",
    "ComponentId": "48039704-7d45-4937-adda-0e362d13cef6",
    "DisplayName": "Oak Hubitat 81:37:82",
    "Hubitat": {
      "AccessToken": "a8232144-abe9-4eed-bcfd-8f182600b8e7",
      "Host": "hubitat-keene-oak.local",
      "MacAddress": "34:E1:D1:81:37:82",
      "MakerApiId": 2
    },
    "HwUid": "813782",
    "TypeName": "hubitat.component.gt",
    "Version": "000"
  }
}

hubitat.poller.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "hubitat.poller.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Hubitat Poller Cac (GridWorks Type). A class of devices - like a Honeywell Z-Wave T6 Thermostat - that can be polled through a Hubitat IoT hub.",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Honeywell T6 ZWave Thermostat",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "hubitat.poller.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

hubitat.poller.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "hubitat.poller.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Hubitat Poller Component (GridWorks Types). A specific instance of a Hubitat Poller Cac (like a Honeywell T6 Thermostat) - a device that can be polled through a Hubitat IoT hub.",
  "properties": {
    "ComponentId": {
      "type": "string",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for HubitatPollerCac object articulated by the hubitat.poller.cac.gt.000 type.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Downstairs Thermostat",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "description": "Unique Hardware Identifier",
      "required": false
    },
    "Poller": {
      "type": "dictDict",
      "description": "Includes hubitat_component_id (str), device_id (int), enabled (bool), poll_period_s (int) and attributes.",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "hubitat.poller.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

hubitat.tank.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "hubitat.tank.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Hubitat Tank Component Attribute Class (GridWorks Type). A class of MakeModels for GridWorks tank temp sensor modules that use Hubitat hubs as part of the data collection.",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/gridworks-tank-module-1.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: GridWorks TankModule1",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "hubitat.tank.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ComponentAttributeClassId": "60ac199d-679a-49f7-9142-8ca3e6428a5f",
    "DisplayName": "GridWorks TankModule1",
    "TypeName": "hubitat.tank.cac.gt",
    "Version": "000"
  }
}

hubitat.tank.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "hubitat.tank.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Hubitat Tank Component (GridWorks Type). This is a specific instance of a GridWorks temp sensing Tank Module that uses a Hubitat to read the remote data. It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/gridworks-tank-module-1.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of a GridWorks TankModule1 and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for HubitatTankCac object articulated by the hubitat.tank.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "Tank": {
      "type": "dictDict",
      "description": "The configuration information (HubitatTankSettingsGt) about the 4 analog temperature sensors for a GridWorks TankModule1.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: GridWorks TankModule <buffer> SN 1010",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "description": "Use the GridWorks Serial number for GridWorks TankModule1.",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "hubitat.tank.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ComponentAttributeClassId": "60ac199d-679a-49f7-9142-8ca3e6428a5f",
    "ComponentId": "f26d412b-3918-427c-9bb9-cb17b7f2e7e4",
    "DisplayName": "Oak Tank Module <buffer>  SN 1010",
    "Tank": {
      "devices": [
        {
          "analog_input_id": 1,
          "device_id": 103,
          "enabled": true,
          "exponent": 1,
          "fibaro_component_id": "1fdd40dd-14d7-4da2-8cf8-7cf66484e385",
          "rest": null,
          "stack_depth": 1,
          "tank_label": "1010 A1 (Thermistor #1 TANK TOP)",
          "telemetry_name_gt_enum_symbol": "c89d0ba1",
          "temp_unit_gt_enum_symbol": "ec14bd47"
        },
        {
          "analog_input_id": 2,
          "device_id": 104,
          "enabled": true,
          "exponent": 1,
          "fibaro_component_id": "1fdd40dd-14d7-4da2-8cf8-7cf66484e385",
          "rest": null,
          "stack_depth": 2,
          "tank_label": "1010 A2 (Thermistor #2)",
          "telemetry_name_gt_enum_symbol": "c89d0ba1",
          "temp_unit_gt_enum_symbol": "ec14bd47"
        },
        {
          "analog_input_id": 1,
          "device_id": 24,
          "enabled": true,
          "exponent": 1,
          "fibaro_component_id": "a6241764-329d-462f-94f9-0283f707d195",
          "rest": null,
          "stack_depth": 3,
          "tank_label": "1010 B1 (Thermistor #3)",
          "telemetry_name_gt_enum_symbol": "c89d0ba1",
          "temp_unit_gt_enum_symbol": "ec14bd47"
        },
        {
          "analog_input_id": 2,
          "device_id": 25,
          "enabled": true,
          "exponent": 1,
          "fibaro_component_id": "a6241764-329d-462f-94f9-0283f707d195",
          "rest": null,
          "stack_depth": 4,
          "tank_label": "1010 B2 (Thermistor #4 TANK BOTTOM)",
          "telemetry_name_gt_enum_symbol": "c89d0ba1",
          "temp_unit_gt_enum_symbol": "ec14bd47"
        }
      ],
      "hubitat_component_id": "48039704-7d45-4937-adda-0e362d13cef6",
      "sensor_supply_voltage": 23.7
    },
    "TypeName": "hubitat.tank.component.gt",
    "Version": "000"
  }
}

multipurpose.sensor.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "multipurpose.sensor.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Multipuprose Sensor ComponentAttributeClasses. GridWorks Spaceheat SCADA uses the GridWorks GNodeRegistry structures and abstractions for managing relational device data. The Cac, or ComponentAttributeClass, is part of this structure.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component-attribute-class.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "MakeModel": {
      "type": "string",
      "format": "spaceheat.make.model",
      "title": "MakeModel",
      "description": "Meant to be enough to articulate any difference in how GridWorks code would interact with a device. Should be able to use this information to buy or build a device.",
      "required": true
    },
    "PollPeriodMs": {
      "type": "integer",
      "description": "Poll Period refers to the period of time between two readings by the local actor. This is in contrast to Capture Period, which refers to the period between readings that are sent up to the cloud (or otherwise saved for the long-term).",
      "required": true
    },
    "Exponent": {
      "type": "integer",
      "description": "Say the TelemetryName is WaterTempCTimes1000; this corresponds to units of Celsius. To match the implication in the name, the Exponent should be 3, and a Value of 65300 would indicate 65.3 deg C",
      "required": true
    },
    "TempUnit": {
      "type": "string",
      "format": "spaceheat.unit",
      "title": "Temp Unit",
      "required": true
    },
    "TelemetryNameList": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "format": "spaceheat.telemetry.name",
      "title": "",
      "required": true
    },
    "MaxThermistors": {
      "type": "integer",
      "description": "The maximum number of temperature sensors this multipurpose sensor can read.",
      "required": false
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: GridWorks TSnap1.0 as 12-channel analog temp sensor",
      "required": false
    },
    "CommsMethod": {
      "type": "string",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "multipurpose.sensor.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

multipurpose.sensor.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "multipurpose.sensor.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Multupurpose Sensor Components. This type was first designed to work with a 12-channel analog temp sensor built into the first generation GridWorks SCADA box (GSCADA 1). It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/component.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of a MultipurposeSensor (perhaps only the 12-channel analog temp sensor), and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for MultipurposeSensorCac object articulated by the multipurpose.sensor.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "ChannelList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "required": true
    },
    "ConfigList": {
      "type": "array",
      "items": {
        "type": "telemetry.reporting.config.000"
      },
      "required": true
    },
    "HwUid": {
      "type": "string",
      "required": false
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Oak Multipurpose Temp Sensor Component <100>",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "multipurpose.sensor.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "example": {
    "ChannelList": [1, 2],
    "ComponentAttributeClassId": "432073b8-4d2b-4e36-9229-73893f33f846",
    "ComponentId": "109e0bde-2f04-4cd4-9e69-bb2732a368e2",
    "ConfigList": [
      {
        "AboutNodeName": "a.dist.swt.temp",
        "AsyncReportThreshold": 0.005,
        "Exponent": 3,
        "NameplateMaxValue": 100000,
        "ReportOnChange": true,
        "SamplePeriodS": 60,
        "TelemetryNameGtEnumSymbol": "c89d0ba1",
        "TypeName": "telemetry.reporting.config",
        "UnitGtEnumSymbol": "ec14bd47",
        "Version": "000"
      },
      {
        "AboutNodeName": "a.dist.rwt.temp",
        "AsyncReportThreshold": 0.005,
        "Exponent": 3,
        "NameplateMaxValue": 100000,
        "ReportOnChange": true,
        "SamplePeriodS": 60,
        "TelemetryNameGtEnumSymbol": "c89d0ba1",
        "TypeName": "telemetry.reporting.config",
        "UnitGtEnumSymbol": "ec14bd47",
        "Version": "000"
      }
    ],
    "DisplayName": "Multipurpose Temp Sensor Component <100>",
    "HwUid": "100",
    "TypeName": "multipurpose.sensor.component.gt",
    "Version": "000"
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    }
  }
}

pipe.flow.sensor.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "pipe.flow.sensor.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Pipe Flow Sensor ComponentAttributeClasses. GridWorks Spaceheat SCADA uses the GridWorks GNodeRegistry structures and abstractions for managing relational device data. The Cac, or ComponentAttributeClass, is part of this structure.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component-attribute-class.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "MakeModel": {
      "type": "string",
      "format": "spaceheat.make.model",
      "title": "",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Atlas Scientific EZO FLO i2c",
      "required": false
    },
    "CommsMethod": {
      "type": "string",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "pipe.flow.sensor.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

pipe.flow.sensor.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "pipe.flow.sensor.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Pipe Flow Sensor Components. Designed for Pipe Flow Sensors. It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/component.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of a PipeFlowSensor, and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for PipeFlowSensorCac object articulated by the pipe.flow.sensor.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "I2cAddress": {
      "type": "integer",
      "required": true
    },
    "ConversionFactor": {
      "type": "number",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Sample: Pipe Flow Meter Component <dist-flow>",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "required": false
    },
    "ExpectedMaxGpmTimes100": {
      "type": "integer",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "pipe.flow.sensor.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

power.watts.000

{
  "gtr_asl": "001",
  "type_name": "power.watts",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Real-time power of TerminalAsset in Watts. Used by a SCADA -> Atn or Atn -> AggregatedTNode to report real-time power of their TerminalAsset. Positive number means WITHDRAWAL from the grid - so generating electricity creates a negative number. This message is considered worse than useless to send after the first attempt, and does not require an ack. Shares the same purpose as gs.pwr, but is not designed to minimize bytes so comes in JSON format.",
  "properties": {
    "Watts": {
      "type": "integer",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "power.watts",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  }
}

relay.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "relay.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Relay ComponentAttributeClasses. GridWorks Spaceheat SCADA uses the GridWorks GNodeRegistry structures and abstractions for managing relational device data. The Cac, or ComponentAttributeClass, is part of this structure.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component-attribute-class.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "MakeModel": {
      "type": "string",
      "format": "spaceheat.make.model",
      "title": "",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "required": false
    },
    "TypicalResponseTimeMs": {
      "type": "integer",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "relay.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

relay.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "relay.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Relay Components. Designed for Relays. It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of a Relay, and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for RelayCac object articulated by the relay.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "required": false
    },
    "Gpio": {
      "type": "integer",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "required": false
    },
    "NormallyOpen": {
      "type": "boolean",
      "description": "Normally open relays default in the open position, meaning that when they're not in use, there is no contact between the circuits. When power is introduced, an electromagnet pulls the first circuit into contact with the second, thereby closing the circuit and allowing power to flow through",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "relay.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

resistive.heater.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "resistive.heater.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Resistive Heater ComponentAttributeClasses. GridWorks Spaceheat SCADA uses the GridWorks GNodeRegistry structures and abstractions for managing relational device data. The Cac, or ComponentAttributeClass, is part of this structure.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component-attribute-class.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "MakeModel": {
      "type": "string",
      "format": "spaceheat.make.model",
      "title": "",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "required": false
    },
    "NameplateMaxPowerW": {
      "type": "integer",
      "required": true
    },
    "RatedVoltageV": {
      "type": "integer",
      "format": "PositiveInteger",
      "title": "",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "resistive.heater.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "PositiveInteger": {
      "type": "string",
      "description": "Must be positive when interpreted as an integer. Interpretation as an integer follows the pydantic rules for this - which will round down rational numbers. So 1.7 will be interpreted as 1 and is also fine, while 0.5 is interpreted as 0 and will raise an exception.",
      "example": ""
    }
  }
}

resistive.heater.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "resistive.heater.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Resistive Heater Components. Designed for Resistive Heaters. It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of a ResistiveHeater, and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for ResistiveHeaterCac object articulated by the resistive.heater.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "required": false
    },
    "TestedMaxHotMilliOhms": {
      "type": "integer",
      "required": false
    },
    "TestedMaxColdMilliOhms": {
      "type": "integer",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "resistive.heater.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

rest.poller.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "rest.poller.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "REST Poller Cac (GridWorks Type). Type for devices that can be polled by SCADA software via a REST endpoint on the LAN. For example a HoneyWell ZWave thermostat that can queried via a IoT hub like a Hubitat C7.",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "rest.poller.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  }
}

rest.poller.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "rest.poller.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "REST Poller Component (GridWorks Type). Designed for generic REST Pollers (like Honeywell Z-Wave thermostats). It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component.html",
  "properties": {
    "TypeName": {
      "type": "string",
      "value": "rest.poller.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  }
}

simple.temp.sensor.cac.gt.000

{
  "gtr_asl": "001",
  "type_name": "simple.temp.sensor.cac.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Simple Temp Sensor ComponentAttributeClasses. GridWorks Spaceheat SCADA uses the GridWorks GNodeRegistry structures and abstractions for managing relational device data. The Cac, or ComponentAttributeClass, is part of this structure.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component-attribute-class.html",
  "properties": {
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "ComponentAttributeClassId",
      "description": "Unique identifier for the device class (aka 'cac' or Component Attribute Class). Authority is maintained by the World Registry.",
      "required": true
    },
    "MakeModel": {
      "type": "string",
      "format": "spaceheat.make.model",
      "title": "",
      "required": true
    },
    "TypicalResponseTimeMs": {
      "type": "integer",
      "required": true
    },
    "Exponent": {
      "type": "integer",
      "description": "Say the TelemetryName is WaterTempCTimes1000; this corresponds to units of Celsius. To match the implication in the name, the Exponent should be 3, and a Value of 65300 would indicate 65.3 deg C",
      "required": true
    },
    "TempUnit": {
      "type": "string",
      "format": "spaceheat.unit",
      "title": "",
      "required": true
    },
    "TelemetryName": {
      "type": "string",
      "format": "spaceheat.telemetry.name",
      "title": "",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "required": false
    },
    "CommsMethod": {
      "type": "string",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "simple.temp.sensor.cac.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

simple.temp.sensor.component.gt.000

{
  "gtr_asl": "001",
  "type_name": "simple.temp.sensor.component.gt",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Type for tracking Simple Temp Sensor Components. Designed for simple temp sensors that read only one temp. It extends the component.gt.000 type. Authority for the attributes of the component.gt.000 (ComponentId, ComponentAttributeClassId, DisplayName, HwUid) belongs to the WorldRegistry. The WorldRegistry is part of the GridWorks 'BackOffice' structure for managing relational device data . Notably, ComponentId and ComponentAttributeClass are both required and immutable. HwUid is optional but once it is set to a non-null value that is also immutable - it is meant to be an immutable identifier associated to a specific physical device, ideally one that can be read remotely by the SCADA and also by the naked eye. The DisplayName is mutable, with its current value in time governed by the WorldRegistry.",
  "url": "https://g-node-registry.readthedocs.io/en/latest/component.html",
  "properties": {
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Component Id",
      "description": "Primary GridWorks identifier for a specific physical instance of a SimpleTempSensor, and also as a more generic Component.",
      "required": true
    },
    "ComponentAttributeClassId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for SimpleTempSensorCac object articulated by the simple.temp.sensor.cac.gt.000 type.",
      "description": "Unique identifier for the device class. Authority for these, as well as the relationship between Components and ComponentAttributeClasses (Cacs) is maintained by the World Registry.",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "required": false
    },
    "HwUid": {
      "type": "string",
      "required": false
    },
    "Channel": {
      "type": "integer",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "simple.temp.sensor.component.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    }
  }
}

snapshot.spaceheat.000

{
  "gtr_asl": "001",
  "type_name": "snapshot.spaceheat",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "",
  "properties": {
    "FromGNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "",
      "required": true
    },
    "FromGNodeInstanceId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "",
      "required": true
    },
    "Snapshot": {
      "type": "telemetry.snapshot.spaceheat.000",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "snapshot.spaceheat",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    }
  }
}

spaceheat.node.gt.100

{
  "gtr_asl": "001",
  "type_name": "spaceheat.node.gt",
  "version": "100",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Spaceheat Node. A SpaceheatNode, or ShNode, is an organizing principal for the SCADA software. ShNodes can represent both underlying physical objects (water tank), measurements of these objects (temperature sensing at the top of a water tank), and actors within the code (an actor measuring multiple temperatures, or an actor responsible for filtering/smoothing temperature data for the purposes of thermostatic control).",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/spaceheat-node.html",
  "properties": {
    "ShNodeId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "",
      "required": true
    },
    "Alias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "",
      "required": true
    },
    "ActorClass": {
      "type": "string",
      "format": "sh.actor.class",
      "title": "",
      "required": true
    },
    "Role": {
      "type": "string",
      "format": "sh.node.role",
      "title": "",
      "required": true
    },
    "DisplayName": {
      "type": "string",
      "required": false
    },
    "ComponentId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Unique identifier for Component object articulated by the component.gt.000 type.",
      "description": "Used if a Spaceheat Node is associated with a physical device.",
      "required": false
    },
    "ReportingSamplePeriodS": {
      "type": "integer",
      "required": false
    },
    "RatedVoltageV": {
      "type": "integer",
      "format": "PositiveInteger",
      "title": "",
      "required": false
    },
    "TypicalVoltageV": {
      "type": "integer",
      "format": "PositiveInteger",
      "title": "",
      "required": false
    },
    "InPowerMetering": {
      "type": "boolean",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "spaceheat.node.gt",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "100",
      "required": true
    }
  },
  "formats": {
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "PositiveInteger": {
      "type": "string",
      "description": "Must be positive when interpreted as an integer. Interpretation as an integer follows the pydantic rules for this - which will round down rational numbers. So 1.7 will be interpreted as 1 and is also fine, while 0.5 is interpreted as 0 and will raise an exception.",
      "example": ""
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    }
  }
}

ta.data.channels.000

{
  "gtr_asl": "001",
  "type_name": "ta.data.channels",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Terminal Asset Data Channels. A list of data channels associated to a specific Terminal Asset.",
  "properties": {
    "TerminalAssetGNodeAlias": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "GNodeAlias for the Terminal Asset",
      "description": "The Alias of the Terminal Asset about which the time series data is providing information.",
      "required": true
    },
    "TerminalAssetGNodeId": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "GNodeId for the Terminal Asset",
      "description": "The immutable unique identifier for the Terminal Asset.",
      "required": true
    },
    "TimeUnixS": {
      "type": "integer",
      "format": "ReasonableUnixTimeS",
      "title": "TimeUnixS",
      "description": "The time that this list of data channels was created",
      "required": true
    },
    "Author": {
      "type": "string",
      "description": "Author of this list of data channels.",
      "required": true
    },
    "Channels": {
      "type": "array",
      "items": {
        "type": "data.channel.000"
      },
      "required": true
    },
    "Identifier": {
      "type": "string",
      "format": "UuidCanonicalTextual",
      "title": "Identifier",
      "description": "Unique identifier for a specific instance of this type that can be used to establish how time series csv's were constructed.",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "ta.data.channels",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "formats": {
    "ReasonableUnixTimeS": {
      "type": "string",
      "description": "Integer reflecting unix time seconds between 1970 and 3000",
      "example": ""
    },
    "UuidCanonicalTextual": {
      "type": "string",
      "description": "A string of hex words separated by hyphens of length 8-4-4-4-12.",
      "example": "652ba6b0-c3bf-4f06-8a80-6b9832d60a25"
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    }
  }
}

telemetry.reporting.config.000

{
  "gtr_asl": "001",
  "type_name": "telemetry.reporting.config",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "",
  "properties": {
    "TelemetryName": {
      "type": "string",
      "format": "spaceheat.telemetry.name",
      "title": "",
      "required": true
    },
    "AboutNodeName": {
      "type": "string",
      "format": "LeftRightDot",
      "title": "",
      "description": "The name of the SpaceheatNode whose physical quantity is getting captured.",
      "required": true
    },
    "ReportOnChange": {
      "type": "boolean",
      "required": true
    },
    "SamplePeriodS": {
      "type": "integer",
      "required": true
    },
    "Exponent": {
      "type": "integer",
      "description": "Say the TelemetryName is WaterTempCTimes1000; this corresponds to units of Celsius. To match the implication in the name, the Exponent should be 3, and a Value of 65300 would indicate 65.3 deg C",
      "required": true
    },
    "Unit": {
      "type": "string",
      "format": "spaceheat.unit",
      "title": "",
      "required": true
    },
    "AsyncReportThreshold": {
      "type": "number",
      "required": false
    },
    "NameplateMaxValue": {
      "type": "integer",
      "format": "PositiveInteger",
      "title": "",
      "required": false
    },
    "TypeName": {
      "type": "string",
      "value": "telemetry.reporting.config",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "axioms": {
    "Axiom1": {
      "title": "Async reporting consistency",
      "description": "If AsyncReportThreshold exists, so does NameplateMaxValue"
    }
  },
  "example": {
    "TelemetryNameGtEnumSymbol": "af39eec9",
    "AboutNodeName": "house-panel-power",
    "ReportOnChange": true,
    "SamplePeriodS": 300,
    "Exponent": 0,
    "UnitGtEnumSymbol": "f459a9c3",
    "AsyncReportThreshold": 0.02,
    "NameplateMaxValue": 3500,
    "TypeName": "telemetry.reporting.config",
    "Version": "000"
  },
  "formats": {
    "PositiveInteger": {
      "type": "string",
      "description": "Must be positive when interpreted as an integer. Interpretation as an integer follows the pydantic rules for this - which will round down rational numbers. So 1.7 will be interpreted as 1 and is also fine, while 0.5 is interpreted as 0 and will raise an exception.",
      "example": ""
    },
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    }
  }
}

telemetry.snapshot.spaceheat.000

{
  "gtr_asl": "001",
  "type_name": "telemetry.snapshot.spaceheat",
  "version": "000",
  "owner": "gridworks@gridworks-consulting.com",
  "description": "Snapshot of Telemetry Data from a SpaceHeat SCADA. A snapshot of all current sensed states, sent from a spaceheat SCADA to its AtomicTNode. The nth element of each of the three lists refer to the same reading (i.e., what is getting read, what the value is, what the TelemetryNames are.)",
  "url": "https://gridworks-protocol.readthedocs.io/en/latest/spaceheat-node.html",
  "properties": {
    "ReportTimeUnixMs": {
      "type": "integer",
      "format": "ReasonableUnixTimeMs",
      "title": "ReportTimeUnixMs",
      "description": "The time, in unix ms, that the SCADA creates this type. It may not be when the SCADA sends the type to the atn (for example if Internet is down).",
      "required": true
    },
    "AboutNodeAliasList": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "format": "LeftRightDot",
      "title": "AboutNodeAliases",
      "description": "The list of Spaceheat nodes in the snapshot.",
      "required": true
    },
    "ValueList": {
      "type": "array",
      "items": {
        "type": "integer"
      },
      "required": true
    },
    "TelemetryNameList": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "format": "spaceheat.telemetry.name",
      "title": "",
      "required": true
    },
    "TypeName": {
      "type": "string",
      "value": "telemetry.snapshot.spaceheat",
      "title": "The type name"
    },
    "Version": {
      "type": "string",
      "title": "The type version",
      "default": "000",
      "required": true
    }
  },
  "axioms": {
    "Axiom1": {
      "title": "ListLengthConsistency",
      "description": "AboutNodeAliastList, ValueList and TelemetryNameList must all have the same length."
    }
  },
  "formats": {
    "LeftRightDot": {
      "type": "string",
      "description": "Lowercase alphanumeric words separated by periods, with the most significant word (on the left) starting with an alphabet character.",
      "example": "dw1.isone.me.freedom.apple"
    },
    "ReasonableUnixTimeMs": {
      "type": "string",
      "description": "An integer reflecting unix time in MILLISECONDS between midnight Jan 1 2000 and midnight Jan 1 3000 UTC",
      "example": "1702327940710"
    }
  }
}