Calcul de différence par journée

Eléphanteau du PHP | 19 Messages

23 nov. 2013, 22:46

Bonsoir,
J'ai un enregistrement régulier toutes les 5 min d'un compteur edf dans une sql avec un timestamp et la valeur de ce compteur. Je voudrais récupérer la consommation elec de chaque jour.
Je ne sais pas comment faire une différence en php entre la valeur du jour et la valeur de la veille. Le résultat final doit être la date de la veille et la consommation. Je voudrais par la suite convertir ces valeurs en json pour utiliser highchart.
Merci de votre aide.
:D

Mammouth du PHP | 2278 Messages

24 nov. 2013, 18:23

Quand j'ai vu le titre, j'ai cru à une plaisanterie. Différence entre deux dates aurait meiux valu. Enfin...
ca devrait aider:
<?PHP
$now = time();
$now_clair = date ( "d", $now  );
$jour = 86400;
$hier = $now - $jour;
$hier_clair = date ( "d", $hier  );
print "$now $now_clair; $hier $hier_clair ";
?>
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 19 Messages

24 nov. 2013, 22:39

Bonjour,
:non: Ceci me donne la différence entre 2 dates.
Je me suis peut être mal exprimé.
En fait j'ai 4 colonnes dans ma sql
une colonne timestamp (int)
une colonne date_rec (yyyy-mm-dd)
une colonne HC (dec) (compteur heures creuses)
une colonne HP (dec) (compteur heures pleines)
L'ensemble est mis à jour toutes les 5 min.
Je souhaite avoir la consommation par jour en HP et HC, ceci le jour même jusqu'à 0h00 et tous les jours d'avant. Le résultat final doit être un timestamp et une valeur HP et une valeur HC par jour ou a partir de 0h00 afin de les utiliser dans un graphique highstocks.
Merci.

Eléphant du PHP | 79 Messages

24 nov. 2013, 22:52

Bonjour,

Ta base de données ne dois pas être bonne :D

Comment les heures pleines et creuses sont-elles définies ?

Est-ce des créneaux horaires ?

Par exemple entre 0h à 7h15 = heures creuses 7h16 à 0h heures pleines pour le lundi.
Un autre système pour le mardi, mercredi, etc.

J'aimerai savoir quelle mesure fait ta base de données du compteur ? Quantité de watt consommé ?

Ciao

Eléphanteau du PHP | 19 Messages

24 nov. 2013, 23:59

Les valeurs de HC et HP sont dec(12,3) mon module téléinfo renvoie la valeur du compteur HC ou HP toutes les 5 min. En fait j'ai un cron sur mon nas qui intérroge mon module téléinfo toutes les 5 min et qui va écrire dans la sql les valeurs timestamp, rec_date, rec_time, HP, et HC.
Si je suis en HP seule les valeurs HP changent la valeur HC reste fixe et vis versa lorsque je suis en HC. Les valeurs récupérées sont du types :
timestamp : 1377617403
HP : 18530653.000
HC : 13153307.000

timestamp : 1377616802
HP : 18530560.000
HC : 13153307.000
Dans ce cas j'ai consommé 93Wh en HP, et 0 en HC comment faire pour le calculer jour/jour et a intervalle régulier de 0h00 à 23h59 et ceci pour tous les jours.

Les données sont en Wh. Le problème est de faire une consommation par 24h des HP ou HC peu importe l'heure du changement HP/HC et cela pour tous les jours.
Voici un exemplaire de ma table sql
Image
@+

Mammouth du PHP | 2278 Messages

25 nov. 2013, 10:30

Quand tu consultes tu récupères le time stamp la coso HP et Hc que tu stockes en local; puis tu calcules le timestamp de J-1 ($anterieur)par la fonctin que je t'ai ndiquée et tu reconsultes ta bdd avec un where timesamp = $anterieur (ou en encadrant le time stamp de + ou - 5)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 19 Messages

26 nov. 2013, 19:14

Après quelques essai. Je ne récupère rien.
Pour une même journée j'ai :
une date_rec identique pour toute la jounée
un timestamp min et un timestamp max de cette jounée associée à des valeurs HP mini et max du jour de cette même dat_rec.
Comment faire pour récupérer ces valeurs et faire la différence sur une journée ?
Merci

Eléphanteau du PHP | 19 Messages

27 nov. 2013, 18:54

J'ai essayé ce code, j'ai un doute sur les 2 requêtes, et le timestamp hier.
<?php
$host="localhost";
$username="root"; 
$password=""; 
$db_name="ecodevices";
$table = "infoeco";
$con=mysql_connect("$host", "$username", "$password")or die("Connexion sql refusé"); 
mysql_select_db("$db_name")or die("Connexion sql refusé");
$startTime = mktime(0, 0, 0, date('m'), date('d')-1, date('Y'));
$endTime = mktime(23, 59, 59, date('m'), date('d')-1, date('Y'));
$sql = "select timestp
	from $table
	WHERE timestp >= $startime
    AND timestp <= $endTime 
    ORDER BY timestp";
$result = mysql_query($sql);
$sql = "SELECT rec_date, DATE_FORMAT(rec_date, $dateformatsql)as periode,
    ((MAX(T1_HCHP) - MIN(T1_HCHP)) / 1000) AS hp, 
    ((MAX(T1_HCHC) - MIN(T1_HCHC)) / 1000) AS hc  
    FROM $table
    WHERE timestp > $startime
    GROUP BY periode
    ORDER BY rec_date" ;
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
extract ($row);
$data[] = array($timestp, $hp, $hc);
}
echo json_encode($data);
?>
Le resultat obtenu est null.

Eléphant du PHP | 79 Messages

28 nov. 2013, 03:16

Le système qui enregistre les watts consommé défini comment si tu es en hp ou hc ?

sinon pour ta base de donnée ton timestamp doit être un timestamp pas un int et tu peux même le mette en CURRENT_TIMESTAMP par défaut pour qu'il met automatiquement la date d'enregistrement.

Après ça tu n'as plus qu'a faire une requête sql du style :

SELECT 
    SUM(conso_HC) AS conso_HC, 
    SUM(conso_HP) As conso_HP, 
    YEAR(timestamp) AS annee, 
    MONTH(timestamp) AS mois,
    DAY(timestamp) AS jour,
    FROM table 
    WHERE timestamp BETWEEN hier AND ajourdhui
Mais je pense que la construction de ta base de donnée n'ai pas du tout bonne. C'est pour sa que j'aimerai comprendre d'où vient-elle, est-ce toi qui a décidé que les enregistrements devaient être fait de cette manière ou pas.

Sinon dans l'idée. Au lieu de chercher à savoir quel jour on était hier :P. Je ferai une chose très simple, un calendrier.

Tu es sur l'année N. Tu déclines tous les jours de l'année dans un tableau html structuré par mois et tu te place niveau lisibilité sur le jour "aujourd'hui".

Cela peut se faire très simplement avec un objet datetime. (http://www.php.net/manual/fr/class.datetime.php)

il est tard là maintenant, demain je te fait un exemple.

Ciao

Eléphanteau du PHP | 19 Messages

28 nov. 2013, 14:19

Dans ma table, j'ai :
une colonne timestp avec une structure(int 11)
une colonne rec_date avec une structure date
une colonne rec_time avec une structure time
une colonne T1_HCHP valeur du compteur heures pleines
une colonne T1_HCHC valeur du compteur heures creuses.
L'ensemble est mi à jour toutes les 5min.
En fait récuperer la valeur de la consommation par jour ou par date pour utiliser highstocks par la suite.
Merci.

Eléphanteau du PHP | 19 Messages

28 nov. 2013, 19:23

Avec ce code, j'affiche la consommation du jour en cours au format json

Code : Tout sélectionner

[["1385506802",22,15]]
Que dois-je faire pour réaliser la même chose pour chaque jour de consommation.
$host="localhost";
$username="root"; 
$password=""; 
$db_name="ecodevices";
$table = "infoeco";
$con=mysql_connect("$host", "$username", "$password")or die("Connexion sql refusé"); 
mysql_select_db("$db_name")or die("Connexion sql refusé");
$now = time();
$hier = mktime(0, 0, 0, date("m")  , date("d")-1, date("Y"));
$sql = "select timestp,
	((MAX(T1_HCHP) - MIN(T1_HCHP)) / 1000) AS hp, 
    ((MAX(T1_HCHC) - MIN(T1_HCHC)) / 1000) AS hc  
	from $table
	WHERE timestp BETWEEN $hier AND $now";
$result = mysql_query($sql);
while ($row = mysql_fetch_array($result)) {
extract ($row);
$data[] = array($timestp, (int)$hp, (int)$hc);
}
echo json_encode($data);

Eléphant du PHP | 79 Messages

29 nov. 2013, 01:49

Est ce que tu peux changer ta valeur INT de ton timestamp par une valeur TIMESTAMP (c'est à dire : aaaa-mm-jj hh:mm:ss) ?

Eléphant du PHP | 79 Messages

29 nov. 2013, 14:50

Si oui fait le !! C'est de cette manière qui te permettra de gérer les dates et pas un entier.

De cette manière tu pourras interpréter tes résultats dans un calendrier de ce type :

<?php

// page index.php

function calandar( $year )
{
    $result = array();
    
    $datetime = new DateTime( "$year-01-01", new DateTimeZone( 'Europe/Paris' ) );
    
    while( $datetime-> format( 'Y' ) == $year )
    {
        $y = $datetime-> format( 'Y' );
        $m = $datetime-> format( 'n' );
        $d = $datetime-> format( 'j' );
        $w = str_replace( '0', '7', $datetime-> format( 'w' ) );
        
        $result[$y][$m][$d] = $w ;
        
        $datetime-> add( new DateInterval( 'P1D' ) );
    }
    
    return $result ;
}

$array_days = array(
    1 => 'lundi',
    'mardi',
    'mercredi',
    'jeudi',
    'vendredi',
    'samedi',
    'dimanche'
);

$array_months = array(
    1 => 'Janvier',
    'février',
    'mars',
    'avril',
    'mai',
    'juin',
    'juillet',
    'août',
    'septembre',
    'octobre',
    'novembre',
    'décembre'
);

$year = date( "Y" );

if( isset( $_GET['year'] ) )
{
    $year = $_GET['year'];
}

$calandar = calandar( $year );

?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Calendrier</title>
        
        <style>
            html{
                font-family: verdana;
            }
            .year{
                color: red;
                font-size: 55px;
            }
            .year a{
                text-decoration: none;
                color: red;
            }
            .year a:hover{
                color: darkred;
            }
            .year a:visited{
                color: red;
            }
            .months ul{
                margin: 0px;
                padding: 0px;
                padding-top: 10px;
                display: block;
                list-style-type: none;
            }
            .months li{
                float: left;
                padding-right: 10px;
            }
            .months a{
                color: red;
                text-decoration: none;
            }
            .months a:hover{
                color: blueviolet;
            }
            .months a:visited{
                color: red;
            }
            .month{
                padding-top: 10px;
                padding-bottom: 50px;
                clear: both;
            }
            .month table{
                border-collapse: collapse
            }
            .month td{
                border: 1px solid black;
            }
            .colspan{
                border: none;
            }
            .relative{
                height: 100px;
                width: 100px;
            }
            .day{
                text-align: center;
                font-size: 20px;
            }
        </style>
        
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
        
        <script>
            jQuery(function($){
                $('.month').hide();
                $('.month:first').show();
                $('.months a:first').addClass('active');
                var index = 1 ;
                $('.months a').click(function(){
                    var month = $(this).attr('id').replace('link-','');
                    if( month !== index ){
                        $('#month-' + index).hide();
                        $('#month-' + month).show();
                        $('.months a').removeClass('active');
                        $('.months a#link-' + month).addClass('active');
                        index = month ;
                    }
                    return false ;
                });
            });
        </script>
        
    </head>
    <body>
        <div class="calandar">
            <div class="year">
                <a href="index.php?year=<?php echo $year - 1 ?>">-</a>
                <span><?php echo $year ?></span>
                <a href="index.php?year=<?php echo $year + 1 ?>">+</a>
            </div>
            <div class="months">
                <ul>
                    <?php foreach( $array_months as $id => $month ): ?>
                    <li><a href="" id="link-<?php echo $id ?>"><?php echo $month ?></a></li>
                    <?php endforeach ?>
                </ul>
            </div>
            <?php foreach( current( $calandar ) as $m => $days ): ?>
            <div class="month" id="month-<?php echo $m ?>">
                <table>
                    <thead>
                        <tr>
                            <?php foreach( $array_days as $day ): ?>
                            <th><?php echo substr( $day, 0, 3 ) ?></th>
                            <?php endforeach ?>
                        </tr>
                    </thead>
                    <tbody>
                        <tr>
                        <?php $end = end( $days ) ?>
                        <?php foreach( $days as $d => $w ): ?>
                            <?php if( $d == 1 and $w != 1 ): ?>
                            <td colspan="<?php echo $w - 1 ?>" class="colspan"></td>
                            <?php endif ?>
                            <td>
                                <div class="relative">
                                    <div class="day"><?php echo $d ?></div>
                                </div>
                            </td>
                            <?php if( $w == 7 ): ?>
                        </tr><tr>
                            <?php endif ?>
                        <?php endforeach ?>
                        <?php if( $end != 7 ): ?>
                            <td class="padding" colspan="<?php echo 7 - $end ?>"></td>
                        <?php endif ?>
                        </tr>
                    </tbody>
                </table>
            </div>
            <?php endforeach ?>
        </div>
    </body>
</html>
visuel :

Image

A partir de la tu n'as plus qu'a inscrire les résultats HC & HP dans l'année $year, le mois $month et le jour $d. D'où l'extrème utilité d'exploiter une valeur TIMESTAMP (AAAA-MM-JJ HH:MM:SS) et pas INT. Tu pourras récupérer l'année, le mois et le jour en les groupant par date avec les fonctions suivantes :

YEAR(),MONTH(),DAY(),DATE().

SELECT
    ((MAX(conso_HP) - MIN(conso_HP)) / 1000) AS conso_hp,
    ((MAX(conso-HC) - MIN(conso_HC)) / 1000) AS conso_hc ,
    YEAR(timestamp) AS annee,
    MONTH(timestamp) AS mois,
    DAY(timestamp) AS jour,
FROM calendrier
GROUP BY DATE(timestamp)
Ciao

Eléphanteau du PHP | 19 Messages

29 nov. 2013, 15:12

Merci beaucoup, je pensai au départ que cela était moins compliqué.
J'ai une colonne date au format aaaa:mm:jj et une colonne time au format hh:mm:ss
Je vais essayé et encore merci.