{
  "metadata": {
    "id": "rev-pneumatic-hub",
    "name": "REV Pneumatic Hub",
    "type": "pneumatic_controller",
    "description": "REV Pneumatic Hub (PH) for FRC. Controls compressor and up to 16 solenoid channels via CAN.",
    "manufacturer": "REV Robotics",
    "part_number": "REV-11-1852",
    "datasheet_url": "https://docs.revrobotics.com/ph/",
    "tags": [
      "FRC",
      "pneumatic",
      "REV",
      "solenoid",
      "compressor",
      "CAN"
    ],
    "schema_version": "1.4.0",
    "version": "0.1.0",
    "taxonomy": [
      "actuator.pneumatic_controller",
      "robotics.frc"
    ]
  },
  "domains": [
    {
      "domain": "electrical",
      "power_domains": [
        {
          "id": "12v-in",
          "name": "12V Input",
          "nominal_voltage_V": 12,
          "voltage_range_V": [
            6,
            16
          ],
          "max_current_mA": 20000
        }
      ],
      "resources": [
        {
          "id": "12v-pos",
          "name": "12V+",
          "functions": [
            {
              "name": "HC_POS",
              "direction": "sink",
              "signal_class": "power"
            }
          ],
          "power_domain_id": "12v-in"
        },
        {
          "id": "12v-neg",
          "name": "12V-",
          "functions": [
            {
              "name": "HC_NEG",
              "direction": "sink",
              "signal_class": "ground"
            }
          ],
          "power_domain_id": "12v-in"
        },
        {
          "id": "can-h",
          "name": "CAN_H",
          "functions": [
            {
              "name": "CAN_H",
              "direction": "bidirectional",
              "signal_class": "data"
            }
          ]
        },
        {
          "id": "can-l",
          "name": "CAN_L",
          "functions": [
            {
              "name": "CAN_L",
              "direction": "bidirectional",
              "signal_class": "data"
            }
          ]
        },
        {
          "id": "comp-pos",
          "name": "COMPRESSOR+",
          "functions": [
            {
              "name": "COMP+",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "comp-neg",
          "name": "COMPRESSOR-",
          "functions": [
            {
              "name": "COMP-",
              "direction": "source",
              "signal_class": "ground"
            }
          ]
        },
        {
          "id": "sol-0",
          "name": "SOLENOID[0]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-1",
          "name": "SOLENOID[1]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-2",
          "name": "SOLENOID[2]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-3",
          "name": "SOLENOID[3]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-4",
          "name": "SOLENOID[4]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-5",
          "name": "SOLENOID[5]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-6",
          "name": "SOLENOID[6]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-7",
          "name": "SOLENOID[7]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-8",
          "name": "SOLENOID[8]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-9",
          "name": "SOLENOID[9]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-10",
          "name": "SOLENOID[10]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-11",
          "name": "SOLENOID[11]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-12",
          "name": "SOLENOID[12]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-13",
          "name": "SOLENOID[13]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-14",
          "name": "SOLENOID[14]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-15",
          "name": "SOLENOID[15]",
          "functions": [
            {
              "name": "SOL",
              "direction": "source",
              "signal_class": "power"
            }
          ]
        },
        {
          "id": "sol-gnd",
          "name": "SOLENOID_GND",
          "functions": [
            {
              "name": "SOL_GND",
              "direction": "source",
              "signal_class": "ground"
            }
          ]
        }
      ],
      "interfaces": [
        {
          "id": "power-in",
          "name": "Power Input",
          "protocol": {
            "type": "power",
            "role": "sink"
          },
          "requires": [
            {
              "function": "HC_POS",
              "count": 1
            },
            {
              "function": "HC_NEG",
              "count": 1
            }
          ],
          "max_instances": 1
        },
        {
          "id": "can-bus",
          "name": "CAN Bus",
          "protocol": {
            "type": "can",
            "role": "slave"
          },
          "requires": [
            {
              "function": "CAN_H",
              "count": 1
            },
            {
              "function": "CAN_L",
              "count": 1
            }
          ],
          "max_instances": 1
        },
        {
          "id": "compressor-out",
          "name": "Compressor Output",
          "protocol": {
            "type": "power",
            "role": "source"
          },
          "requires": [
            {
              "function": "COMP+",
              "count": 1
            },
            {
              "function": "COMP-",
              "count": 1
            }
          ],
          "max_instances": 1
        },
        {
          "id": "solenoid-out",
          "name": "Solenoid Output",
          "protocol": {
            "type": "power",
            "role": "source"
          },
          "requires": [
            {
              "function": "SOL",
              "count": 1
            },
            {
              "function": "SOL_GND",
              "count": 1,
              "shareable_with": [
                "all"
              ]
            }
          ],
          "max_instances": 16
        }
      ]
    }
  ],
  "node_geometry": {
    "xScale": 1,
    "yScale": 2,
    "outline": {
      "preset": "rounded_rectangle"
    }
  }
}