def set_noise_filter(self, user_gpio, steady, active):
        """
        Sets a noise filter on a GPIO.
        Level changes on the GPIO are ignored until a level which has
        been stable for [*steady*] microseconds is detected.  Level
        changes on the GPIO are then reported for [*active*]
        microseconds after which the process repeats.
        user_gpio:= 0-31
           steady:= 0-300000
           active:= 0-1000000
        Returns 0 if OK, otherwise PI_BAD_USER_GPIO, or PI_BAD_FILTER.
        This filter affects the GPIO samples returned to callbacks set up
        with [*callback*] and [*wait_for_edge*].
        It does not affect levels read by [*read*],
        [*read_bank_1*], or [*read_bank_2*].
        Level changes before and after the active period may
        be reported.  Your software must be designed to cope with
        such reports.
        ...
        pi.set_noise_filter(23, 1000, 5000)
        ...
        """
        # pigpio message format

        # I p1 user_gpio
        # I p2 steady
        # I p3 4
        ## extension ##
        # I active
        extents = [struct.pack("I", active)]
        res = yield from self._pigpio_aio_command_ext(_PI_CMD_FN, user_gpio,
                                                      steady, 4, extents)
        return _u2i(res)