I'm using the following small snippet on my boxes, maybe others find this useful, too:
#!/bin/sh
#
# ap-toggle script
# written by Dirk Brenken (dev@brenken.org)
# usage:
# ap-toggle.sh on <radio> => switch the AP on all radios "on", you can limit this with the optional <radio>-parm
# ap-toggle.sh off <radio> => switch the AP on all radios "off", you can limit this with the optional <radio>-parm
# reference this script in /etc/crontabs/root and restart cron service afterwards, e.g.:
# 0 00 * * * /usr/bin/ap-toggle.sh off
# 0 06 * * * /usr/bin/ap-toggle.sh on
#
# This is free software, licensed under the GNU General Public License v3.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# set initial defaults
#
LC_ALL=C
PATH="/usr/sbin:/usr/bin:/sbin:/bin"
apt_ver="0.5"
apt_sysver="$(ubus -S call system board | jsonfilter -e '@.release.description')"
apt_action="${1}"
apt_radio="${2}"
. "/lib/functions.sh"
# f_prepare: gather wireless information & enable/disable AP interfaces
#
f_prepare()
{
local config="${1}"
local mode="$(uci -q get wireless."${config}".mode)"
local radio="$(uci -q get wireless."${config}".device)"
local disabled="$(uci -q get wireless."${config}".disabled)"
if [ "${mode}" = "ap" ] && ([ -z "${apt_radio}" ] || [ "${apt_radio}" = "${radio}" ])
then
if [ "${apt_action}" = "on" ] && ([ -z "${disabled}" ] || [ "${disabled}" = "1" ])
then
uci -q set wireless."${config}".disabled=0
elif [ "${apt_action}" = "off" ] && ([ -z "${disabled}" ] || [ "${disabled}" = "0" ])
then
uci -q set wireless."${config}".disabled=1
fi
fi
}
config_load wireless
config_foreach f_prepare wifi-iface
# commit & reload all changes, write final log message
#
if [ -n "$(uci -q changes wireless)" ]
then
uci -q commit wireless
ubus call network reload
apt_radio="${apt_radio:="all radios"}"
logger -t "ap-toggle-[${apt_ver}] info " "AP on ${apt_radio} has been switched '${apt_action}' (${apt_sysver})"
fi