Calculer le coût de consommation électrique en fonction de la consommation ou de l'état d'un objet

Bon je spam un peu la community aujourd’hui.

Je partage un petit script PHP que j’ai écris qui permet de calculer le prix de la consommation électrique d’un objet suivant sa consommation mais également suivant un état. Cela peut être utile notamment pour les ampoules n’ayant pas de mesures de consommation mais pour lesquels on connait leur état.

Ici ce sont les fonctions à mettre dans la user.function.class.php

public static function costForStateHistory($start_date, $end_date, $state_cmd, $power_on, $power_off) {
    	$cout_total = 0;
      	$all = self::getDataHistoryForCmd($start_date, $end_date, $state_cmd);
      	for ($i = 0; $i < (count($all) - 1); $i++) {
       		$history = $all[$i];
            $date = $history->getDatetime();
            $date = strtotime($date);
          	$value = $history->getValue();
          	$valueW = 0;
          	if ($value == 1) {
          		$valueW = $power_on;
       	 	} else {
          		$valueW = $power_off;
       	 	}
          	$valuekW = $valueW / 1000;

			// on remet en h
			$next_history = $all[$i + 1];
			$next_date = $next_history->getDatetime();
			$next_date = strtotime($next_date);
          	$duration_s = ($next_date - $date);

			$cout = self::costElectricity($valuekW, $duration_s, $date);
			$cout_total = $cout_total + $cout;
		}
		$cout_total = round($cout_total, 3);
		return $cout_total;
    }

	public static function costForPowerHistory($start_date, $end_date, $power_cmd) {
      	$cout_total = 0;

		$all = self::getDataHistoryForCmd($start_date, $end_date, $power_cmd);
		for ($i = 0; $i < (count($all) - 1); $i++) {

			$history = $all[$i];
			$valueW = $history->getValue();
			$valuekW = $valueW / 1000;
			
			$date = $history->getDatetime();
			$date = strtotime($date);
  
			// on remet en h
			$next_history = $all[$i + 1];
			$next_date = $next_history->getDatetime();
			$next_date = strtotime($next_date);
          	$duration_s = ($next_date - $date);

			$cout = self::costElectricity($valuekW, $duration_s, $date);
			$cout_total = $cout_total + $cout;
		}
		$cout_total = round($cout_total, 3);
		return $cout_total;
	}
  
  	public static function costForConsumptionHistory($start_date, $end_date, $power_cmd) {
      	$cout_total = 0;

		$all = self::getDataHistoryForCmd($start_date, $end_date, $power_cmd);
		for ($i = 1; $i < count($all); $i++) {

			$history = $all[$i];
          	$history_before = $all[$i - 1];
			$valuekWh = $history->getValue();
			$valuekWh_before = $history_before->getValue();
          	$deltakWh = $valuekWh - $valuekWh_before;
			$date = $history->getDatetime();

			$cout = self::costElectricity($deltakWh, NULL, $date);
			$cout_total = $cout_total + $cout;
		}
		$cout_total = round($cout_total, 3);
		return $cout_total;
	}
  
    public static function getDataHistoryForCmd($start_date, $end_date, $cmd) {
      	$cmdId = cmd::byString($cmd)->getId();
		$all = history::all($cmdId, $start_date, $end_date);
      	return $all;
    }

  	public static function costElectricity($power_consumption_kW, $duration_s, $date) {
      	$cout_elec = 0.1116;
		$cout_elec_hc = 0.0757;
      	$kWh = 0;
      	if ($duration_s != NULL) {
          	$duration_h = $duration_s / 3600;
            $kWh = ($duration_h * $power_consumption_kW);
        } else {
          	$kWh = $power_consumption_kW;
        }
      	$dateH = date('H', $date);
      	$cout_appliquer = $cout_elec;
		// on vérifie les heures creuses
		if ($dateH >= 22 && $dateH < 6) {
			// Nous sommes en heure creuse
			$cout_appliquer = $cout_elec_hc;
		}
		$cout = $cout_appliquer * $kWh;
      	return $cout;
    }

A noter que je renseigne dans ce script le coût en heures pleines / heures creuses ainsi que les heures du switch.
A partir de la nous avons deux cas possible.
Vous souhaitez calculer le prix de la consommation d’un objet dont vous connaissez justement la consomation sur une période donnée:

require_once dirname(__FILE__) . '/../../data/php/user.function.class.php';

// Notification for the day
$debut = date("Y-m-d H:i:s", strtotime("first day of this month"));
$fin = date("Y-m-d H:i:s", strtotime("last day of this month"));  

$cost_dryer = userFunction::costForConsumptionHistory($debut, $fin, "#[Cuisine][Prise Sèche Linge][Consommation]#");
cmd::byString("#[Appartement][Appartement coûts][Coût sèche linge]#")->event($cost_dryer);

Vous souhaitez calculer le prix de la consommation d’un objet électrique dont vous connaissez juste l’état:

$lampes = ["[Salon][Lampadaire]", "[Salon][Lampes bibliotheque]", "[Cuisine][Lampes plan de travail]", "[Placard technique][Lampe placard technique]"];
foreach ($lampes as $lampe) {
    $power_on = cmd::byString("#".$lampe."[Wh_on]#")->execCmd();
    $power_off = cmd::byString("#".$lampe."[Wh_off]#")->execCmd();
	$cost = userFunction::costForStateHistory($debut, $fin, "#".$lampe."[Etat]#", $power_on, $power_off);
  	cmd::byString("#".$lampe."[cost_monthly]#")->event($cost_light);
  	$cost_light = $cost_light + $cost;
}

A noter qu’il faut du coup au moins avoir la puissance que consomme l’objet allumé et l’objet éteins. Dans le code cela correspond à Wh_on et Wh_off.

Exemple de mon virtuel:

Peut être que ca pourra donner des idées à quelques’un. J’ai hésité à développer un plugin dessus. je ne savais pas si cela pouvais intéresser.

A adapter / améliorer suivant vos besoins

3 « J'aime »

Bonsoir,

J’ai vu de nombreuses demandes de calcul similaire. Un plugin serait probablement intéressant

Merci pour le partage

1 « J'aime »

Peut-être que je me lancerais sur un plugin alors :slight_smile:

I y a un excellent tuto « VDM » comme mot clef

Oui je le connais celui la :slight_smile:
Il faut déjà que je finisse mon plugin actuel