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

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

Le scénario Scheduler ne s’exécute pas manuellement, c’est le scénario « Mise à jour EDF » qui le pilote en faisant transiter des tags (on voit que la variable est vide). Il faut d’ailleurs penser à mettre la bonne commande en bas du script lorsqu’il fait la replanification.

Sinon tu es sûr d’avoir mis le dernier code, normalement il y a les variables d’heures de début d’heures pleine 2 qui doivent être créées etc.

D’ailleurs le scénario principal dit qu’il ne trouve pas les commandes, faudrait récupérer le chemin proprement via un bloc action et le sélectionnant dans la liste.

re,

dans mon virtuel j’ai fait une petite erreur

Toi ton exemple :
Conso Jour HP

Moi :

Conso**.** Jour HP

J’avais mis un point après Conso

Hello

Y 'a pas de souci toute aide et conseille sont les bienvenues , merci

Bonjour :slight_smile:

Bon j’ai été faire un tour sur le débug et c’est pas trop jolie mdr

Voici ce que ça me donne.

Je vais ressayé de recréer un objet Enedis pour tester car il doit y avoir un bug.

@mick74 Le problème vient d’Enedis car sur leur site j’ai aucunes mesures au 26/02.
Je comprends pas pourquoi.

Je viens de regarder, pareil, j’ai pas les données de hier. Je crois qu’il va falloir s’habituer car le service que propose Enedis est un peu en carton… Il y a des trous de données toutes les semaines… Pourtant c’est pas les budgets IT qui doivent manquer…

Merci d’avoir jeté un oeil :slight_smile:

Petite question dans le dernier script que tu nous as donné pour gérer les 2 plages horaires des HP/HC : est ce que ça gère quand il y a un trou au niveau de l’API Enedis ?

Oui je gère déjà ça grâce à un différentiel entre la date de dernière mise à jour par le scénario et la date de la dernière données horaire ajoutée. Si toutes les dernières données manquantes arrivent d’un coup, le script fera le calcul pour chaque jour du plus vieux au plus récent.
Par contre s’il y a par exemple sur 3 jours manquants, uniquement les 2 derniers jours, cela fera un trou d’une journée du fait que le script se sera déclenché (dernières données présentes). Je le fais quand même car si jamais j’attends encore 1 journée pour retenter la chance, les données ne seront plus en format à la demi heure (du fait du lissage lié à l’historisation) et les données calculées seront donc ensuite fausses.

Par contre pour le moment les trous des données horaires ne sont pas gérés par le plugin. Quand elles réapparaissent, le plugin enedis ne reprend que le dernier jour de données horaires.

1 « J'aime »

Hello
Bon voila une grosse récap de ce que j’ai fait :





Mon code :

Citation## 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 », « 08:08 ») : null;
(empty($scenario->getData(« EDF_HC_Start »))) ? $scenario->setData(« EDF_HC_Start », « 00:08 ») : 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(« #[MAISON][Variables EDF][Conso Jour HC]# »);
$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("#[MAISON][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("#[MAISON][Variables EDF][Tarif Jour HP]#");
	$commande_tarif_hier_hp = cmd::byString("#[MAISON][Variables EDF][Tarif Jour HC]#");
	$commande_tarif_hier_hc = cmd::byString("#[MAISON][Variables EDF][Tarif Jour]#");
	$commande_tarif_hier = cmd::byString("#[MAISON][Variables EDF][Conso Mois HP]#");
	$commande_conso_mois_hp = cmd::byString("#[MAISON][Variables EDF][Conso Mois HC]#");
	$commande_conso_mois_hc = cmd::byString("#[MAISON][Variables EDF][Conso Mois HC]#");
	$commande_moyenne_conso_jour_hp = cmd::byString("#[MAISON][Variables EDF][Moyenne Conso Jour HP]#");
	$commande_moyenne_conso_jour_hc = cmd::byString("#[MAISON][Variables EDF][Moyenne Conso Jour HC]#");
	$commande_estimation_conso_mois_hp = cmd::byString("#[MAISON][Variables EDF][Estimation Conso Mois HP]#");
	$commande_estimation_conso_mois_hc = cmd::byString("#[MAISON][Variables EDF][Estimation Conso Mois HC]#");
	$commande_estimation_conso_mois = cmd::byString("#[MAISON][Variables EDF][Estimation Conso Mois]#");
	$commande_estimation_prix_mois_hp = cmd::byString("#[MAISON][Variables EDF][Estimation Prix Mois HP]#");
	$commande_estimation_prix_mois_hc = cmd::byString("#[MAISON][Variables EDF][Estimation Prix Mois HC]#");
	$commande_estimation_prix_mois = cmd::byString("#[MAISON][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("#[MAISON][TECHNIQUE][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();
}





Mais j’ai du loupé quelque chose car comme on peux le voir sur mon virtuel ( en vert ) tout reste à 0

Merci

Salut, c’est top, tu as bien avancé !

Je pense que ça commence à être pas mal.
Ici tu es à 0 partout car je suppose que personne n’a eu la mise à jour des données horaires (cf précédents messages) et donc les calculs ne se sont pas faits.

Je vois que tu as adapté les variables pour supprimer les horaires secondaires, c’est parfait. Par contre attention il y a moyen que tu ais des erreurs à l’exécution quand les conditions seront bonnes car à un moment le script va chercher à seter des données de variables qui n’existent pas. Ex: $debut_heure_pleine2 = $scenario->getData("EDF_HP2_Start");

Sinon est-ce normal que tu ais une plage d’heures creuses de 00:08 à 08:08 ? Je sais pas comment le script va réagir vu que la période n’est pas à cheval sur 2 jours. Pour l’heure pleine ça devrait le faire, mais l’heure creuse ça va prendre de 00:01(« j-1 ») => 08:08 (donc ~ ok) mais il va aussi faire un calcul de 00:08 => 00:00 et donc prendre toute la journée… Si vraiment c’est ton créneau d’heures creuses, il faudra adapter le calcul de l’heure creuse.

Hello

Pour en apprendre un plus j’ai lu ton script (code ) effectivement j’ai viré deux ligne des EDF_HP2_Start

Au pire je vais les remettre

Pourquoi j’ai des horaires à la con en 00h08 et 08h08 tout simplement car j’entent mon relais jour / nuit ce déclenché à ses heures … Enedis qui envoi pas à des heures comme à 00H00 ou 08H00

Je vais mettre des heures ronde.

pour :mise à jour des données horaires
Je vais regarder dans mon debug Enedis pour voir