code: def cache_instrument_models(self):
          
          log.debug("Updating instrument model cache")
          for mount in self.model_by_mount.keys():
              model_value = self._driver.read_pipette_model(mount)
              if model_value:
                  id_response = self._driver.read_pipette_id(mount)
              else:
                  id_response = None
              self.model_by_mount[mount] = {
                  'model': model_value,
                  'id': id_response
              }
              log.debug("{}: {} [{}]".format(
                  mount,
                  self.model_by_mount[mount]['model'],
                  self.model_by_mount[mount]['id']))
docs: Queries Smoothie for the model and ID strings of attached pipettes, and
          saves them so they can be reported without querying Smoothie again (as
          this could interrupt a command if done during a run or other movement).
  
          Shape of return dict should be:
  
          ```
          {
            "left": {
              "model": "<model_string>" or None,
              "id": "<pipette_id_string>" or None
            },
            "right": {
              "model": "<model_string>" or None,
              "id": "<pipette_id_string>" or None
            }
          }
          ```
  
          :return: a dict with pipette data (shape described above)