When you change the type of external antenna used by an AP in Ekahau, the name of the AP model is not updated to reflect that new external antenna name:
So this simple script aims to update the name of the AP models in order for them to reflect the name of the external antenna actually used. After executing the script, you should see something like this:
The Code
import argparse
import time
import os
import zipfile
import json
import pathlib
import shutil
from pprint import pprint
def main():
parser = argparse.ArgumentParser(
description='This script will update the name of model of AP based on the name of the external antenna')
parser.add_argument('file', metavar='esx_file', help='Ekahau project file')
args = parser.parse_args()
current_filename = pathlib.PurePath(args.file).stem
working_directory = os.getcwd()
# Load & Unzip the Ekahau Project File
with zipfile.ZipFile(args.file, 'r') as myzip:
myzip.extractall(current_filename)
# Load the accessPoints.json file into the accessPoints dictionary
with myzip.open('accessPoints.json') as json_file:
accessPoints = json.load(json_file)
# Load the simulatedRadios.json file into the simulatedRadios dictionary
with myzip.open('simulatedRadios.json') as json_file:
simulatedRadios = json.load(json_file)
# Load the antennaTypes.json file into the antennaTypes dictionary
with myzip.open('antennaTypes.json') as json_file:
antennaTypes = json.load(json_file)
# Loop through the AP and auto populate the tag values based on the AP properties
for ap in accessPoints['accessPoints']:
for radio in simulatedRadios['simulatedRadios']:
if ap['id'] == radio['accessPointId']:
for antenna in antennaTypes['antennaTypes']:
if radio['antennaTypeId'] == antenna['id']:
if antenna['frequencyBand'] == "FIVE":
if antenna['apCoupling'] == "EXTERNAL_ANTENNA":
ext_antenna_name = antenna['name'].split(' ')[1]
ext_antenna_vendor = antenna['name'].split(' ')[0]
ap_model = ap['model'].split(' +')[0]
ap['model'] = ap_model + ' + ' + ext_antenna_vendor + ' ' + ext_antenna_name
print(
f"{ap['name']}: new model name set to '{ap['model']}'")
# Write the changes into the accessPoints.json File
with open(working_directory + '/' + current_filename + '/accessPoints.json', 'w') as file:
json.dump(accessPoints, file, indent=4)
# Create a new version of the Ekahau Project
new_filename = current_filename + '_modified'
shutil.make_archive(new_filename, 'zip', current_filename)
shutil.move(new_filename + '.zip', new_filename + '.esx')
# Cleaning Up
shutil.rmtree(current_filename)
if __name__ == "__main__":
start_time = time.time()
print('** Updating AP Model Names...\n')
main()
run_time = time.time() - start_time
print("\n** Time to run: %s sec" % round(run_time, 2))Note: we might update it in the future. So make sure to also check the GitHub repository to see the latest version available: https://github.com/francoisverges/semfio-ekahau
Usage
Simply create a copy of your project file (.esx file) and run the script against it:
A modified version of your project file will be created. When you open it, you should see AP model names matching the name of the external antennas used.
Links & Resources
- Source code on Github: https://github.com/francoisverges/semfio-ekahau/blob/master/update-ap-model-name/update-ap-model-name.py
- Github Repository for Ekahau related scripts: https://github.com/francoisverges/semfio-ekahau
- GitHub Wiki: https://github.com/francoisverges/semfio-ekahau/wiki/How-to-use-%22Update-AP-Model-Name%22


