Taking the difference in timestamps between successive entries
You don't need a self join of any kind. Just use variables.

SELECT
time_recorded AS current,
@prev AS previous,
timestampdiff(second, time_recorded, @prev) AS diff_between_current_and_previous,
@prev := time_recorded
FROM
reading
, (SELECT @prev := null) var_init_subquery
WHERE device_id = 1154
ORDER BY time_recorded


What's important in this query is first the ORDER BY and then the ordering in the SELECT clause.

@prev AS previous, /*here it outputs the value of the previous row*/
@prev := time_recorded /*here the value of the current row is assigned*/


The subquery in the FROM clause is just a fancy way to not have to write "two queries" like this:

SET @prev := NULL;
SELECT
time_recorded AS current,
@prev AS previous,
timestampdiff(second, time_recorded, @prev) AS diff_between_current_and_previous,
@prev := time_recorded
FROM
reading
WHERE device_id = 1154
ORDER BY time_recorded