Bonjour,
L’API retourne 96 tranches de 15 min. Pour trouver la fenêtre glissante de 3h consécutives la moins chère, l’algo classique est une sliding window sur 12 slots (12 × 15 min = 3h).
Voici le code PHP complet :
<?php
/**
* Trouve la fenêtre de 3h consécutives la moins chère dans la journée.
* Algo : sliding window sur 12 slots de 15 min.
*/
function getCheapest3Hours(string $date): array
{
$url = sprintf(
'https://api.sobry.co/api/prices/raw?start=%s&end=%s&turpe=CU4&profil=particulier',
$date,
date('Y-m-d', strtotime($date . ' +1 day'))
);
$json = file_get_contents($url);
if (!$json) {
throw new \RuntimeException("Impossible de contacter l'API");
}
$response = json_decode($json, true);
if (!$response['success'] || empty($response['data'])) {
throw new \RuntimeException("Données invalides");
}
$slots = $response['data'];
$n = count($slots);
$window = 12; // 12 × 15 min = 3h
if ($n < $window) {
throw new \RuntimeException("Pas assez de données ({$n} slots)");
}
// 1. Somme de la première fenêtre
$currentSum = 0.0;
for ($i = 0; $i < $window; $i++) {
$currentSum += $slots[$i]['price_ttc_eur_kwh'];
}
$minSum = $currentSum;
$minStart = 0;
// 2. Sliding window : on avance slot par slot
for ($i = $window; $i < $n; $i++) {
$currentSum += $slots[$i]['price_ttc_eur_kwh'];
$currentSum -= $slots[$i - $window]['price_ttc_eur_kwh'];
if ($currentSum < $minSum) {
$minSum = $currentSum;
$minStart = $i - $window + 1;
}
}
$bestSlots = array_slice($slots, $minStart, $window);
return [
'start' => $bestSlots[0]['timestamp'],
'end' => $bestSlots[$window - 1]['timestamp'],
'avg_ttc_eur_kwh' => round($minSum / $window, 5),
'total_sum' => round($minSum, 5),
'slots' => $bestSlots,
];
}
// --- Utilisation ---
try {
$result = getCheapest3Hours('2025-10-23');
echo "✅ Meilleure fenêtre de 3h :\n";
echo " De : " . $result['start'] . "\n";
echo " À : " . $result['end'] . "\n";
echo " Prix moyen TTC : " . $result['avg_ttc_eur_kwh'] . " €/kWh\n";
echo " Somme des prix : " . $result['total_sum'] . " €/kWh\n";
} catch (\Exception $e) {
echo "Erreur : " . $e->getMessage() . "\n";
}
Pourquoi la sliding window ?
Naïvement on pourrait tester toutes les fenêtres possibles en recalculant la somme à chaque fois — c’est O(n × 12). La sliding window c’est O(n) : on ajoute le slot entrant et soustrait le slot sortant, sans tout recalculer.
Fenêtre [0..11] → somme initiale
Fenêtre [1..12] → somme += slot[12] - slot[0]
Fenêtre [2..13] → somme += slot[13] - slot[1]
...
Sur les données du 23/10/2025, la meilleure fenêtre serait autour de 03h45–06h45 (les slots à ~0.05094 €/kWh). Sur price_ttc_eur_kwh c’est le champ le plus pertinent car il inclut TURPE + accise + TVA.
Deux variantes utiles :
Si tu veux les 3h pas forcément consécutives (ex. pour piloter une charge interruptible), remplace l’algo par un simple tri :
usort($slots, fn($a, $b) => $a['price_ttc_eur_kwh'] <=> $b['price_ttc_eur_kwh']);
$cheapest12 = array_slice($slots, 0, 12); // 12 slots = 3h
Si la durée de 3h est paramétrable, remplace juste $window = 12 par $window = (int)($heures * 4).
Claude AI
Je trouve sa réponse pertinente. le plugin script t’impose de savoir quelle tranche horaire interroger, mais sinon tu récupérer toutes les tranches de la journée avec ce petit script php pour avoir les périodes les moins chères, consécutives, ou pas. Au final tu pourrais activer ton appareil sur les 12 périodes de 15 min les moins chères de la journée (si 3H est suffisant pour chauffer ton eau?)
Pifou