Requête à faire en console sur le serveur Teslamate (Raspberry Pi dans mon cas) pour extraire les données de charge de plus de 5 minutes avec une puissance moyenne supérieure à 13 kW pour écarter les charges en courant AC (user = teslamate, base de données = teslamate dans mon cas, à remplacer par les valeurs contenues dans docker-compose.yml)
Code : Tout sélectionner
docker compose exec database psql teslamate teslamate -c "\copy (select cp.id,c.date,c.charger_power,c.battery_level from charging_processes as cp left join charges as c on c.charging_process_id = cp.id where cp.id > 0 and cp.duration_min > 5 and (cp.charge_energy_added/cp.duration_min*60) > 13 order by c.date asc) to 'fast_charge.csv' csv header"
Ensuite, il faut retrouver le fichier (qui va se planquer dans les sous-répertoires de docker)
On peut récupérer ce fichier puis faire tourner le script PHP suivant en ligne de commande (sans doute un peu brouillon, bricolé ce soir en quelques heures) qui va produire un fichier fast_time.csv contenant les temps moyens que l'on peut ensuite rouvrir dans Excel pour faire la mise en forme conditionnelle.
Avec dans le fichier processTesla.php
Code : Tout sélectionner
<?php
$f = fopen('fast_charge.csv','r');
$charges = array();
$last_data = array();
$r = fgets($f); // On purge la 1ère ligne
while ( $r = fgets($f) ) {
$r = trim($r);
$data = array();
list($data['charge_id'],$data['cur_time'],$data['power'],$data['level']) = explode(',', $r);
$c_id = $data['charge_id'];
if ( !isset($last_data['charge_id']) || $data['charge_id'] != $last_data['charge_id'] ) { // Nouvelle charge
$charges[$c_id]['debut'] = $data['cur_time'];
$charges[$c_id]['debut_timestamp'] = strtotime($data['cur_time']);
$charges[$c_id]['max_power'] = $data['power'];
$charges[$c_id]['start_level'] = $data['level'];
} else { // On enrichit la charge courante
$charges[$c_id]['end_level'] = $data['level'];
$charges[$data['charge_id']]['max_power'] = max($charges[$data['charge_id']]['max_power'], $data['power']);
if ( $data['level'] % 5 == 0 && !isset($charges[$c_id]['curve'][$data['level']]) ) {
$charges[$c_id]['curve'][$data['level']] = strtotime($data['cur_time']) - $charges[$c_id]['debut_timestamp'];
}
}
$last_data = $data;
}
fclose($f);
$synthese = array();
echo "Start;Max";
for ( $pct = 5; $pct <= 95 ; $pct+=5 ) {
$synthese[$pct] = array();
echo ";$pct";
}
echo "\n";
foreach ($charges as $id => $charge) {
echo $charge['start_level'].";".$charge['max_power'];
$start_level_category = ceil($charge['start_level']/5)*5;
for ( $pct = 5; $pct <= 95 ; $pct+=5 ) {
echo ";";
if ( isset($charge['curve'][$pct]) ) {
$tps_min = round($charge['curve'][$pct]/60.0,1); // Calcul temps en minutes
echo $tps_min;
if ( $charge['max_power'] > 50 ) { // On ignore les chargeurs qui n'ont pas débités au moins 50 kW au maxi (borne publique DC)
if ( isset($synthese[$start_level_category][$pct]) ) {
$synthese[$start_level_category][$pct]['min'] = min($synthese[$start_level_category][$pct]['min'], $tps_min);
$synthese[$start_level_category][$pct]['max'] = max($synthese[$start_level_category][$pct]['max'], $tps_min);
$synthese[$start_level_category][$pct]['avg'] = ($synthese[$start_level_category][$pct]['avg'] * $synthese[$start_level_category][$pct]['nb'] + $tps_min)/($synthese[$start_level_category][$pct]['nb']+1);
$synthese[$start_level_category][$pct]['nb'] += 1;
} else {
$synthese[$start_level_category][$pct]['min'] = $tps_min;
$synthese[$start_level_category][$pct]['max'] = $tps_min;
$synthese[$start_level_category][$pct]['avg'] = $tps_min;
$synthese[$start_level_category][$pct]['nb'] = 1;
}
}
}
}
echo "\n";
}
// Sortie des temps de charge
$out = "Start";
for ( $pct = 5; $pct <= 95 ; $pct+=5 ) {
$out .= "\t$pct";
}
$out .= "\n";
foreach ( $synthese as $start => $synth_row ) {
$out .= "[".($start-4).'-'.$start.']';
for ( $pct = 5; $pct <= 95 ; $pct+=5 ) {
$out .= "\t";
if ( isset($synthese[$start][$pct]) ) {
$out .= round($synthese[$start][$pct]['avg'],0);
}
}
$out .= "\n";
}
echo $out;
$out2 = str_replace("\t",";",$out);
file_put_contents('fast_time.csv', $out2);
// Fichier à ouvrir ensuite avec Excel
// Sortie du nombre de charges à chaque point du tableau
$out = "Start";
for ( $pct = 5; $pct <= 95 ; $pct+=5 ) {
$out .= "\t$pct";
}
$out .= "\n";
foreach ( $synthese as $start => $synth_row ) {
$out .= "[".($start-4).'-'.$start.']';
for ( $pct = 5; $pct <= 95 ; $pct+=5 ) {
$out .= "\t";
if ( isset($synthese[$start][$pct]) ) {
$out .= round($synthese[$start][$pct]['nb'],0);
}
}
$out .= "\n";
}
echo $out;
?>
Si tu galères à faire tourner le script PHP, tu peux essayer de m'envoyer ton extract de base de données en MP (si c'est faisable).
L'idéal serait que tout cela soit intégré à un écran de Teslamate mais là ça dépasse mes compétences :)