code: def commands(self):
          
          (self._commands, value) = self.get_cached_attr_set(self._commands, 'commands')
          return value
docs: Returns a list of commands that are supported by the motor
          controller. Possible values are `run-forever`, `run-to-abs-pos`, `run-to-rel-pos`,
          `run-timed`, `run-direct`, `stop` and `reset`. Not all commands may be supported.
  
          - `run-forever` will cause the motor to run until another command is sent.
          - `run-to-abs-pos` will run to an absolute position specified by `position_sp`
            and then stop using the action specified in `stop_action`.
          - `run-to-rel-pos` will run to a position relative to the current `position` value.
            The new position will be current `position` + `position_sp`. When the new
            position is reached, the motor will stop using the action specified by `stop_action`.
          - `run-timed` will run the motor for the amount of time specified in `time_sp`
            and then stop the motor using the action specified by `stop_action`.
          - `run-direct` will run the motor at the duty cycle specified by `duty_cycle_sp`.
            Unlike other run commands, changing `duty_cycle_sp` while running *will*
            take effect immediately.
          - `stop` will stop any of the run commands before they are complete using the
            action specified by `stop_action`.
          - `reset` will reset all of the motor parameter attributes to their default value.
            This will also have the effect of stopping the motor.