Calculs sur Heure Pleine / Heure Creuse et Tarifications / Coûts

Bonjour,
J’ia bien appliqué ton code en prenant soin d’adapter et créé tous les variables et objets.

j’ai bien environs 18000 données à uploader mais mon code ne rentre pas dans la condition étant donné que mes dernières données sont du 24-02-21 23:30 et nous sommes le 25-02-21.

je mets une capture d’écran de mon log.

Ok c’est très simple, il faut mettre la bonne date pour la variable suivante:

image

Au maximum tu dois avoir 7j en données horaires qui sont en période de 30mn, si tu as récréé le compteur. Il faut donc mettre la date au 18 ou au 19 février. Si tu mets plus, les données historisées ne seront pas bonnes et donc le calculs seront faux.

Il faudrait que je mette une valeur par défaut si la variable est vide.

J’ai effectivement mis la variable au 18 février mais rien ne change en relançant le scénario.
Juste les jours à updater sont modifiés.


En fait la date de collect n’est pas à aujourd’hui, du coup pour lui il n’a encore pas les données pour s’éxécuter. Je n’ai pas calculé qu’on est le 25. Normalement, le plugin enedis aurait du rajouter une valeur au 25 février à minuit comme la capture ci-dessous.

image

C’est bien ce qu’il me semblait. donc je vais attendre 00H01 ce soir pour voir ce qu’il se passe.

J’ai une autre question car je dispose de 2 trames horaires HP HC comment doit on modifier le code ?

Merci pour ton aide

Tu peux relancer la synchro avec la commande Rafraichir au niveau de l’objet compteur.

Sinon voici une nouvelle version qui intègre la partie 2 plages horaires.
J’ai également ajouté un contrôle des variables et set par défaut si jamais elles existent pas.
Je n’ai pas contre pas pu tester vu que je n’ai pas 2 créneaux.

Je suis parti sur cette hypothèse en terme de plages horaires:

image

En terme de variables:
Heures pleines = Minuit j-1 => $debut_hc + $debut_hp => $debut_hc2 + $debut_hp2 => minuit
Dans le cas présent:
$debut_hc => EDF_HC_Start = 02:00
$debut_hp => EDF_HP_Start = 07:00
$debut_hc2 => EDF_HC2_Start = 14:00
$debut_hp2 => EDF_HP2_Start = 17:00

@getbes , si tu veux également tester.

Si vos retours sont positifs, je mettrai à jour le sujet principale :slight_smile:

## Vérification présence des variables ou setting par défaut
(empty($scenario->getData("EDF_Nb_Plages"))) ? $scenario->setData("EDF_Nb_Plages", "1") : null;
(empty($scenario->getData("EDF_HP_Start"))) ? $scenario->setData("EDF_HP_Start", "06:30") : null;
(empty($scenario->getData("EDF_HC_Start"))) ? $scenario->setData("EDF_HC_Start", "22:30") : null;
(empty($scenario->getData("EDF_HP2_Start"))) ? $scenario->setData("EDF_HP2_Start", "A REMPLIR") : null;
(empty($scenario->getData("EDF_HC2_Start"))) ? $scenario->setData("EDF_HC2_Start", "A REMPLIR") : null;
(empty($scenario->getData("EDF_Tarif_KWh_HP"))) ? $scenario->setData("EDF_Tarif_KWh_HP", "0.1727") : null;
(empty($scenario->getData("EDF_Tarif_KWh_HC"))) ? $scenario->setData("EDF_Tarif_KWh_HC", "0.1296") : null;
(empty($scenario->getData("EDF_Tarif_Abo_Mois"))) ? $scenario->setData("EDF_Tarif_Abo_Mois", "11.60") : null;
(empty($scenario->getData("EDF_Last_Var_Update"))) ? $scenario->setData("EDF_Last_Var_Update", date('Y-m-d H:i:s',strtotime("now - 1 days"))) : null;


## Vérification de la dernière exécution réussie
$commande_conso_hier_hp = cmd::byString("#[Appartement][Variables EDF][Conso Jour HP]#");
$collectDate_conso_hier_hp = $commande_conso_hier_hp->getCollectDate();

if (date('Y-m-d', strtotime($collectDate_conso_hier_hp)) == date('Y-m-d',strtotime("yesterday"))){
	$scenario->setLog("Scenario déjà lancé, annulation. Date dernier enregistrement valeurs:".date('Y-m-d', strtotime($collectDate_conso_hier_hp)));
} else {

		## récupération de la date de dernière maj et vérification du nombre de jours à updater
		$derniere_maj_donnees = date('Y-m-d',strtotime($scenario->getData("EDF_Last_Var_Update")));
		
		if($derniere_maj_donnees == 0) {}
		$nb_jour_a_updater = scenarioExpression::time_diff($derniere_maj_donnees, "now",d);
		if ($nb_jour_a_updater == 1){
			$scenario->setLog("Seulement 1 jour a updater");
		} else {
			$scenario->setLog("Attention: ".$nb_jour_a_updater." jours a updater");
		}
		
		### Verification presences donnees horaires

		$commande_ConsoHoraire = cmd::byString("#[Appartement][Compteur Linky][Consommation horaire]#");
		$collectDate_ConsoHoraire = $commande_ConsoHoraire->getCollectDate();

	if (date('Y-m-d', strtotime($collectDate_ConsoHoraire)) == date('Y-m-d',strtotime("now"))) {

		### Get and Set variables
		$nb_plages_horaires = $scenario->getData("EDF_Nb_Plages");
		$debut_heure_pleine = $scenario->getData("EDF_HP_Start");
		$debut_heure_creuse = $scenario->getData("EDF_HC_Start");
		$debut_heure_pleine2 = $scenario->getData("EDF_HP2_Start");
		$debut_heure_creuse2 = $scenario->getData("EDF_HC2_Start");		
		$tarif_heure_pleine = $scenario->getData("EDF_Tarif_KWh_HP");
		$tarif_heure_creuse = $scenario->getData("EDF_Tarif_KWh_HC");
		$tarif_abonnement = $scenario->getData("EDF_Tarif_Abo_Mois");


		## Commandes

		$commande_conso_hier_hc = cmd::byString("#[Appartement][Variables EDF][Conso Jour HC]#");
		$commande_tarif_hier_hp = cmd::byString("#[Appartement][Variables EDF][Tarif Jour HP]#");
		$commande_tarif_hier_hc = cmd::byString("#[Appartement][Variables EDF][Tarif Jour HC]#");
		$commande_tarif_hier = cmd::byString("#[Appartement][Variables EDF][Tarif Jour]#");
		$commande_conso_mois_hp = cmd::byString("#[Appartement][Variables EDF][Conso Mois HP]#");
		$commande_conso_mois_hc = cmd::byString("#[Appartement][Variables EDF][Conso Mois HC]#");
		$commande_moyenne_conso_jour_hp = cmd::byString("#[Appartement][Variables EDF][Moyenne Conso Jour HP]#");
		$commande_moyenne_conso_jour_hc = cmd::byString("#[Appartement][Variables EDF][Moyenne Conso Jour HC]#");
		$commande_estimation_conso_mois_hp = cmd::byString("#[Appartement][Variables EDF][Estimation Conso Mois HP]#");
		$commande_estimation_conso_mois_hc = cmd::byString("#[Appartement][Variables EDF][Estimation Conso Mois HC]#");
		$commande_estimation_conso_mois = cmd::byString("#[Appartement][Variables EDF][Estimation Conso Mois]#");
		$commande_estimation_prix_mois_hp = cmd::byString("#[Appartement][Variables EDF][Estimation Prix Mois HP]#");
		$commande_estimation_prix_mois_hc = cmd::byString("#[Appartement][Variables EDF][Estimation Prix Mois HC]#");
		$commande_estimation_prix_mois = cmd::byString("#[Appartement][Variables EDF][Estimation Prix Mois Global]#");

		$id_commande_ConsoHoraire = $commande_ConsoHoraire->getId();
		$id_commande_ConsoHoraireCreux = $commande_conso_hier_hc->getId();
		$id_commande_ConsoHorairePlein = $commande_conso_hier_hp->getId();


		### Lancement du calcul des données pour x jours

		for($n=($nb_jour_a_updater-1); $n >= 0; $n--){

			$date_valeurs = date('Y-m-d H:i:s', strtotime("yesterday - $n days 00:01"));
			$date_JourEt1_minuit = date('Y-m-d H:i:s', strtotime("today - $n days 00:00"));
			$scenario->setLog("Ajout du ".date('Y-m-d', strtotime("yesterday - $n days")));
			$jour_restant_mois = scenarioExpression::time_diff("now - $n days", "first day of next month",d);


			## NOTE: la valeur de la minute 0 ne doit pas être prise => ajout de 1mn
			$debut_hp = date('Y-m-d H:i:s', strtotime("yesterday - $n days $debut_heure_pleine +1 minute"));
			$debut_hc = date('Y-m-d H:i:s', strtotime("yesterday - $n days $debut_heure_creuse + 1 minute"));
			
			if ($nb_plages_horaires == 1) {
				$conso_hier_hp = history::getStatistique($id_commande_ConsoHoraire, $debut_hp, $debut_hc)["sum"] /2;
			}else{
				$debut_hp2 = date('Y-m-d H:i:s', strtotime("yesterday - $n days $debut_heure_pleine2 +1 minute"));
				$debut_hc2 = date('Y-m-d H:i:s', strtotime("yesterday - $n days $debut_heure_creuse2 +1 minute"));
				## Heures pleines =  Minuit j-1 => $debut_hc + $debut_hp => $debut_hc2 + $debut_hp2 => minuit
				$conso_hier_hp = ((history::getStatistique($id_commande_ConsoHoraire, $date_valeurs, $debut_hc)["sum"]) + (history::getStatistique($id_commande_ConsoHoraire, $debut_hp, $debut_hc2)["sum"]) + (history::getStatistique($id_commande_ConsoHoraire, $debut_hp2, $date_JourEt1_minuit)["sum"])) /2;
			}
			
			## Si donnée horaire à 0, envoyer un message dans le centre de message, sinon continuer
			if ($conso_hier_hp == 0) {

				$title = 'Erreur Récupération données EDF';
				$message = 'Données de consommation horaire null pour le '.date('Y-m-d', strtotime("yesterday - $n days"));
				message::add($title, $message);
				
			} else {
				if ($nb_plages_horaires == 1) {
					$conso_hier_hc = (history::getStatistique($id_commande_ConsoHoraire, $date_valeurs, $debut_hp)["sum"] + history::getStatistique($id_commande_ConsoHoraire, $debut_hc, $date_JourEt1_minuit)["sum"] ) /2;
				} else {
					## Heures creuses = $debut_hc => $debut_hp + $debut_hc2 => $debut_hp2
					$conso_hier_hc = (history::getStatistique($id_commande_ConsoHoraire, $debut_hc, $debut_hp)["sum"] + history::getStatistique($id_commande_ConsoHoraire, $debut_hc2, $debut_hp2)["sum"] ) /2;
				}
				$tarif_hier_hp = $conso_hier_hp * $tarif_heure_pleine;
				$tarif_hier_hc = $conso_hier_hc * $tarif_heure_creuse;
				$tarif_hier = $tarif_hier_hp + $tarif_hier_hc;

				# Historisation intermédiaire
				$commande_conso_hier_hp->event($conso_hier_hp, $date_valeurs);
				$commande_conso_hier_hc->event($conso_hier_hc, $date_valeurs);
				$commande_tarif_hier_hp->event($tarif_hier_hp, $date_valeurs);
				$commande_tarif_hier_hc->event($tarif_hier_hc, $date_valeurs);
				$commande_tarif_hier->event($tarif_hier, $date_valeurs);


				# Calculs 
				$conso_mois_hc = scenarioExpression::statisticsBetween($id_commande_ConsoHoraireCreux, "sum", "first day of this month", "now");
				$conso_mois_hp = scenarioExpression::statisticsBetween($id_commande_ConsoHorairePlein, "sum", "first day of this month", "now");

				$moyenne_conso_jour_hc = scenarioExpression::statisticsBetween($id_commande_ConsoHoraireCreux, "avg", "first day of this month", "now");
				$moyenne_conso_jour_hp = scenarioExpression::statisticsBetween($id_commande_ConsoHorairePlein, "avg", "first day of this month", "now");

				$estimation_conso_mois_hc = $conso_mois_hc + ($moyenne_conso_jour_hc * $jour_restant_mois);
				$estimation_conso_mois_hp = $conso_mois_hp + ($moyenne_conso_jour_hp * $jour_restant_mois);
				$estimation_conso_mois = $estimation_conso_mois_hc + $estimation_conso_mois_hp;

				$estimation_prix_mois_hc = $estimation_conso_mois_hc * $tarif_heure_creuse;
				$estimation_prix_mois_hp = $estimation_conso_mois_hp * $tarif_heure_pleine;
				$estimation_prix_mois_global = $estimation_prix_mois_hc + $estimation_prix_mois_hp + $tarif_abonnement;

				## Log dans le scénario pour tracer si besoin
				$scenario->setLog("conso_hier_hp = ".$conso_hier_hp);
				$scenario->setLog("conso_hier_hc = ".$conso_hier_hc);
				$scenario->setLog("tarif_hier_hp = ".$tarif_hier_hp);
				$scenario->setLog("tarif_hier_hc = ".$tarif_hier_hc);
				$scenario->setLog("tarif_hier = ".$tarif_hier);
				$scenario->setLog("conso_mois_hc = ".$conso_mois_hc);
				$scenario->setLog("conso_mois_hp = ".$conso_mois_hp);
				$scenario->setLog("moyenne_conso_jour_hc = ".$moyenne_conso_jour_hc);
				$scenario->setLog("moyenne_conso_jour_hp = ".$moyenne_conso_jour_hp);
				$scenario->setLog("jour_restant_mois = ".$jour_restant_mois);
				$scenario->setLog("estimation_conso_mois_hc = ".$estimation_conso_mois_hc);
				$scenario->setLog("estimation_conso_mois_hp = ".$estimation_conso_mois_hp);
				$scenario->setLog("estimation_conso_mois = ".$estimation_conso_mois);
				$scenario->setLog("estimation_prix_mois_hc = ".$estimation_prix_mois_hc);
				$scenario->setLog("estimation_prix_mois_hp = ".$estimation_prix_mois_hp);
				$scenario->setLog("estimation_prix_mois_global = ".$estimation_prix_mois_global);


				# Historisation
				$commande_conso_mois_hp->event($conso_mois_hp, $date_valeurs);
				$commande_conso_mois_hc->event($conso_mois_hc, $date_valeurs);
				$commande_moyenne_conso_jour_hp->event($moyenne_conso_jour_hp, $date_valeurs);
				$commande_moyenne_conso_jour_hc->event($moyenne_conso_jour_hc, $date_valeurs);
				$commande_estimation_conso_mois_hp->event($estimation_conso_mois_hp, $date_valeurs);
				$commande_estimation_conso_mois_hc->event($estimation_conso_mois_hc, $date_valeurs);
				$commande_estimation_conso_mois->event($estimation_conso_mois, $date_valeurs);
				$commande_estimation_prix_mois_hp->event($estimation_prix_mois_hp, $date_valeurs);
				$commande_estimation_prix_mois_hc->event($estimation_prix_mois_hc, $date_valeurs);
				$commande_estimation_prix_mois->event($estimation_prix_mois_global, $date_valeurs);
				
				# Mise à jour variable dernière màj en fois boucle terminée si pas d'erreur
				$scenario->setData("EDF_Last_Var_Update", date('Y-m-d H:i:s',strtotime("now - $n days")));
				
			}
		}

	} else {     ## Si données horaires non présentes, rescheduler un lancement 30mn plus tard

		$scenario->setLog("Donnees horaire non presente. Replanification de la tache. Derniere collecte horaire EDF presente: ".$collectDate_ConsoHoraire);

		# Infos sur le schéduleur
		$scenario_scheduler = scenario::byString("#[Technique][Tools][Scenario Scheduler]#");

		#Récupération des tags du scénario
		$tags = $scenario_scheduler->getTags();
		#Modification des tags
		$tags['#cible#'] = "EDF";
		$tags['#action#'] = "LAUNCH";
		$tags['#duree#'] = 30 ;

		#Envoi des tags et le lancement de la reprogrammation
		$scenario_scheduler->setTags($tags);
		$scenario_scheduler->launch();
	}

}

Bonjour,

Merci pour l’évolution. Pas trop de temps en ce moment. Je vais essayer la semaine prochaine et je te fais un retour.

Pas de soucis. Faut voir avec @yannou ce qu’il en pense du coup. De mon côté le scénario continue de bien marcher pour le mode 1 plage horaire.

Il faudra bien penser à renseigner les plages et aussi compléter la variable qui indique leur nombre (seté à 1 par défaut). Lancer une première fois le scénario devrait créer toutes les variables avec les valeurs par défaut. A exécuter de manière indépendante car sinon la suite du scénario se déroule, ou sinon il faudra simplement penser à enlever 1j à la variable « EDF_Last_Var_Update » afin qu’il refasse les calculs proprement avec les bonnes valeurs de variables (ou encore les renseigner directement dans le code qui set les variables par défaut :wink: ).

Merci pour tes modifications c’est gentil de te pencher sur nos problèmes :slight_smile:

Jai integrer ton codes avec tes nouvelles variables. j’ai rafraîchi l’objet compteur mais rien n’y fait :browning:

Tu peux mettre le plugin enedis en mode debug et mettre les logs une fois ton refresh effectué ?
C’est bizarre que tes données datent toujours de la veille, normalement la valeur de minuit (qui représente la consommation des 30 dernières minutes de la journée) devrait être présente également.

Et tout cas c’est le comportement que j’ai, je ne sais pas si d’autres personnes peuvent le confirmer.

Voilà ce que j’ai en mode débug après un rafraissiment. Bizarre effectivement…

Hello

Désolé de pas répondre de suite ou assez vite, je suis en déplacement dans toute la France la semaine … boulot oblige… lol

Alors je vais commencé dans l’ordre et petit à petit …

Petit 1
Comment crée les variables ( ou allez dans jeedom ? )

et ses variables:

#[Appartement][Variables EDF][Conso Jour HP]#
#[Appartement][Variables EDF][Conso Jour HC]#
#[Appartement][Variables EDF][Tarif Jour HP]#
#[Appartement][Variables EDF][Tarif Jour HC]#
#[Appartement][Variables EDF][Tarif Jour]#
#[Appartement][Variables EDF][Conso Mois HP]#
#[Appartement][Variables EDF][Conso Mois HC]#
#[Appartement][Variables EDF][Moyenne Conso Jour HP]#
#[Appartement][Variables EDF][Moyenne Conso Jour HC]#
#[Appartement][Variables EDF][Estimation Conso Mois HP]#
#[Appartement][Variables EDF][Estimation Conso Mois HC]#
#[Appartement][Variables EDF][Estimation Conso Mois]#
#[Appartement][Variables EDF][Estimation Prix Mois HP]#
#[Appartement][Variables EDF][Estimation Prix Mois HC]#
#[Appartement][Variables EDF][Estimation Prix Mois Global]#

Il faudra regarder demain matin quand tu auras la mise à jour :slight_smile: tu auras toutes les valeurs.

Si je peux me permettre de te répondre, pour créer les variables tu créé un virtuel que tu appelle « Variables EDF » et tu ajoute chaque variables en infos.

Pour les autres variables :

Tu les ajoute directement dans l’onglet « Outils »/« Variables ».

Voilà :slight_smile:

Oui mais le soucis c’est que ce matin j’aurais du avoir la mise à jour aussi mais c’est à la date d’hier.

Tu peux prendre le dernier script que j’ai publié hier et qui gère 2 créneaux horaires d’heure creuse.
Au début il y a le code qui va vérifier si les variables sont présentes et si non les créer. Pense à mettre directement les bonnes valeurs pour que tu n’ais pas besoin de les modifier dans l’interface Jeedom ( dans outils → variables , de tête)

1 « J'aime »

Justement ce sera plus compréhensible demain vu qu’on aura toutes les informations via les logs de debug :slight_smile:

1 « J'aime »

Bon un petit résumé de ce que je viens de faire :

Ça commence à être pas mal. Par contre dans le scénario Scheduler attention, le but est de relancer le scénario EDF, pas lui même, faut donc modifier l’action scénario pour pointer vers le scénario Mise à jour EDF.

En gros le scheduler c’est juste pour dire au Scheduler de rescheduler une mise à jour des données EDF car un scénario ne peut pas s’auto rappeler.

Après le code que tubas mis c’est pas le nouveau.
Le nouveau est dans ce commentaire, je l’ai pas mis à jour dans le poste principal car j’attends que les personnes qui m’ont demandé la modification de plage testent :

Les premières lignes sont celles dédiées à la vérification des variables.

Re,

Bon j’ai corrigé le scenario pour qui lance la mise a jour EDF…

J’ai mis le nouveau code que tu me donne …

Quand je lance les scenario j’ai ceci :

le second