docs: def scan_devices(self, subnet, timeout=None):
          """
          Scan cameras in a range of ips
  
          Params:
          subnet - subnet, i.e: 192.168.1.0/24
                   if mask not used, assuming mask 24
  
          timeout_sec - timeout in sec
  
          Returns:
          """
  
          # Maximum range from mask
          # Format is mask: max_range
          max_range = {
              16: 256,
              24: 256,
              25: 128,
              27: 32,
              28: 16,
              29: 8,
              30: 4,
              31: 2
          }
  
          # If user didn't provide mask, use /24
          if "/" not in subnet:
              mask = int(24)
              network = subnet
          else:
              network, mask = subnet.split("/")
              mask = int(mask)
  
          if mask not in max_range:
              raise RuntimeError("Cannot determine the subnet mask!")
  
          # Default logic is remove everything from last "." to the end
          # This logic change in case mask is 16
          network = network.rpartition(".")[0]
  
          if mask == 16:
              # For mask 16, we must cut the last two
              # entries with .
  
              # pylint: disable=unused-variable
              for i in range(0, 1):
                  network = network.rpartition(".")[0]
  
          # Trigger the scan
          # For clear coding, let's keep the logic in if/else (mask16)
          # instead of only one if
          if mask == 16:
              for seq1 in range(0, max_range[mask]):
                  for seq2 in range(0, max_range[mask]):
                      ipaddr = "{0}.{1}.{2}".format(network, seq1, seq2)
                      thd = threading.Thread(
                          target=self.__raw_scan, args=(ipaddr, timeout)
                      )
                      thd.start()
          else:
              for seq1 in range(0, max_range[mask]):
                  ipaddr = "{0}.{1}".format(network, seq1)
                  thd = threading.Thread(
                      target=self.__raw_scan, args=(ipaddr, timeout)
                  )
                  thd.start()
  
          return self.amcrest_ips