MySQL speed up aggregation query on table
I think the best thing to do is create a generated column and use that as your index. Consider this:

 CREATE TABLE `meterreadings` (
 `Id` bigint(20) NOT NULL AUTO_INCREMENT,
 `meterid` varchar(16) DEFAULT NULL,
 `metervalue` int(11) DEFAULT NULL,
 `date_time` timestamp NULL DEFAULT NULL,
 `fifteen_mins_date` datetime AS 
    (concat(DATE_FORMAT(date_time, 'Y-m-d H:'), 
            15*(minute(date_time) div 15), 
            ':00')) STORED,
 PRIMARY KEY (`Id`),
 KEY `meterid` (`meterid`),
 KEY `fifteen_mins_date` (`fifteen_mins_date`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;


Then, your query could look like this:

SELECT AVG(metervalue) as value, DATE_FORMAT(min(date_time), "%d %b %Y %H:%i") as label 
FROM meterreadings WHERE meterid IN (SELECT meterid from devices) 
   AND fifteen_mins_date BETWEEN '2018-06-23' AND '2018-06-24' 
GROUP BY `fifteen_mins_date` 
ORDER BY min(date_time) ASC;