Local dealers push to break Kenya Power’s token meter monopoly
Local dealers push to break Kenya Power’s token meter monopoly
Read this story aloud
Listen to the clean text version of this article
Ready
4 min listen
Audio reading is not supported on this browser.
The Africa Smart Meter Association has raised concerns that Kenya Power’s control over token meter tendering has hindered the growth of local manufacturers
Electricity users in Kenya may soon have the option to purchase token meters from authorised dealerships, challenging Kenya Power’s monopoly on the market.
The move aims to provide consumers with greater flexibility in connecting to the power grid without being limited to purchasing meters from the state-owned utility.
The Africa Smart Meter Association has raised concerns that Kenya Power’s control over token meter tendering has hindered the growth of local manufacturers.
Industry representatives argue that just as the e-Tims rollout has diversified the market, Kenya Power should establish standards and authorise select dealers to improve access for consumers.
During a recent Senate energy committee meeting on Tuesday, the association Secretary General James Ngomeli revealed that currently, less than 10 per cent of the smart meters used in Kenya are locally manufactured.
He pointed out that the situation favours assembly plants that import parts rather than fostering local manufacturing.
Latest Stories
- Taita Taveta County unveils cooperative fund to boost rural access to credit
- Lilian Odira targets personal best and Diamond League final after dream victory in Eugene
- Karua, Matiang’i demand arrest and resignation of PS Fikirini over Cecil Ouma shooting
- A Super El Niño is coming: Five hard‑won lessons the world can learn from Africa
“However, we are confident that this figure could increase to 60 per cent if a compelling business case is established, similar to what has been achieved with laptop assembly plants,” Ngomeli added.
Local manufacturers highlighted that the existing environment makes it nearly impossible to invest further in the sector.
“There is a major issue with the lack of approved manufacturing standards for smart meters by the Energy and Petroleum Regulatory Authority (EPRA), creating uncertainty for producers,” Ngomeli added.
He pointed out that significant investments are required to assemble smart meters, but high interest rates make competition challenging.
A major concern raised was the absence of approved manufacturing standards for smart meters from the Energy and Petroleum Regulatory Authority (EPRA). This lack of clarity creates uncertainty for producers looking to enter the market.
Long-term agreements
Manufacturers are advocating for long-term framework agreements with major off-takers like Kenya Power to ensure a steady demand for locally produced smart meters.
Currently, Kenya Power acquires between 800,000 and 1 million meters annually to address the growing need for new customer connections and the expansion of the prepaid meter system.
Charles Kaloki, chairman of the association, underscored the importance of collaboration between universities, research institutions, and companies like Kenya Power to promote the use of locally produced components.
This collaboration could enhance the sustainability of the industry.
Nairobi Senator Edwin Sifuna inquired about the challenges local producers face in meeting Kenya Power’s needs.
Kaloki responded by stressing that both the utility firm and EPRA have yet to establish localised standards tailored for local manufacturers.
“There is no reason why they can’t authorise dealers and open up the space for more players,” he argued.
Kaloki noted that by increasing local production of smart meters, the government and utility companies could significantly reduce reliance on imports.
This could lower costs associated with tariffs, shipping, and currency exchange rates by up to $100 million (approximately Sh12.9 billion), making smart meter deployment more affordable.
While there are currently four assembly plants operating in the country, the market remains highly competitive and somewhat secretive.
Intense competition for Kenya Power tenders leads many players to keep their business strategies confidential. This secrecy stifles collaboration and broader participation in the industry.
Despite these challenges, the association remains hopeful that opening up the market will lead to innovation and better opportunities for local manufacturers.
Other Topics To Read
Top Stories Today
- Karua, Matiang’i demand arrest of PS Fikirini over Cecil Ouma shooting
- Taita Taveta to launch cooperative fund to boost rural credit access
- World Champion Lilian Odira beats Keely Hodgkinson in Eugene thriller
- Coast leaders rally support for 10-point agenda, reject divisive politics
- A Super El Niño is coming: Five lessons Africa can teach the world
- Faith Kipyegon reveals hamstring injury after rare defeat in Eugene
`;
}
return “;
}
function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;
const likeButton = canComment && comment.status === ‘approved’
? “
: “;
const replyButton = canComment && comment.status === ‘approved’
? “
: ”;
return `
`;
}
function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;
const edited = comment.is_edited
? “
: ”;
const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `
`
: “;
return `
`;
}
function replyFormMarkup(commentId) {
return `
`;
}
function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;
if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}
notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}
function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;
const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}
function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});
const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;
const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;
replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);
const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}
function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}
async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};
const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);
async function loadComments(reset = true) {
if (state.busy) return;
state.busy = true;
setNotice(widget, ”);
loading.hidden = false;
if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}
try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);
const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});
const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};
state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;
setCount(widget, state.total);
if (reset) {
list.innerHTML = ”;
}
if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}
loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}
async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);
if (!textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
textarea.value = ”;
if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;
if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}
setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}
async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);
if (!commentId || !textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}
closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}
async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;
const originalHtml = button.innerHTML;
try {
button.disabled = true;
button.innerHTML = ‘Working…’;
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});
const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);
button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}
if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}
if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}
if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}
widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}
const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}
const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});
widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});
loadComments(true);
}
document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();
Trending
Eight arrested in Marsabit over Sh1.2 million SIM swap fraudNorthern Kenya
|Bashir Mbuthia
|1 day ago
Faith Kipyegon reveals hamstring injury after rare defeat as focus shifts to second half of seasonAthletics
|Erick Kariuki
|3 hours ago
Six killed as matatu, trailer collide head-on along Nakuru-Eldoret highwayNews
|Rachael Mutabasi
|1 day ago
Somali Embassy hosts Kenya leaders, diplomats for 66th Independence Day celebrationsSomalia
|Abdirahman Khalif
|7 hours ago
Court declares Ruaraka School land public, rules Sh1.5 billion payout illegalNews
|Carolyne Kubwa
|1 day ago
Pakistan to host next round of US-Iran talks on July 11Middle-East
|XINHUA
|7 hours ago
Mbappé fires France past Paraguay into World Cup quarter-finalsSports
|Erick Kariuki
|12 hours ago
Invisible peacebuilders: How ‘diplomacy works’ to prevent conflictWorld
|UN News
|11 hours ago
Machakos Mitumba Market traders suffer heavy losses after midnight fireNews
|Lucy Mumbi
|9 hours ago
Lilian Odira targets personal best and Diamond League final after dream victory in EugeneAthletics
|Erick Kariuki
|1 hour ago