docs: def form_GPIO_map(self):
          """ This method creates a dictionary to map plant IDs to
          GPIO pins are associated in triples.
          Each ID gets a light, a fan, and a mist nozzle.
          """
          # Compute bank/pins/IOexpander address based on ID
          if self.ID == 1:
              self.IOexpander = 0x20
              self.bank = 0
              self.fan = 2
              self.light = 3
              self.valve = 4
          elif self.ID == 2:
              self.IOexpander = 0x20
              self.bank = 0
              self.fan = 5
              self.light = 6
              self.valve = 7
          elif self.ID == 3:
              self.IOexpander = 0x20
              self.bank = 1
              self.fan = 0
              self.light = 1
              self.valve = 2
          elif self.ID == 4:
              self.IOexpander = 0x20
              self.bank = 1
              self.fan = 3
              self.light = 5
              self.valve = 6
          else:
              raise InvalidIOMap(
                  "Mapping not available for ID: " + str(self.ID))
  
          # Check to make sure reserved pins are not requested
          if (self.bank == 0) and (min(self.fan, self.light, self.valve) < 2):
              raise InvalidIOMap(
                  "Pins A0 and A1 are reserved for other functions")
  
          self.GPIO_dict = [{'ID': self.ID, 'bank': self.bank,
                             'fan': self.fan, 'valve': self.valve, 'light': self.light}]
  
          # Append dictionary to class and resort dictionary by ID # if needed
          ControlCluster.GPIOdict.append(self.GPIO_dict)