-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathChauffageProgrammation
160 lines (149 loc) · 7.86 KB
/
ChauffageProgrammation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
$scenario->setLog( '------------------------ lancement -------------------------');
// paramètres
// auto programmation, exécution toutes les jours à minuit une pour revoir les flags
$szNomEquipementChaudiere = $scenario->getData('ChaudiereThermostat'); // nom de l'équipement Thermostat
if($szNomEquipementChaudiere=='') {
$scenario->setLog('nom équipement chaudière introuvable, lancement le scenario pour évaluation des variables avant svp');
$scList = $scenario->byObjectNameGroupNameScenarioName('Aucun','Chauffage','ChauffageEvalVariables');
if ($scList ==NULL) {
$scenario->setLog('scenario non trouvé, arrêt'); $scenario->stop();
} else
{
$scenario->setLog('scenario évaluation des variables déclenché');
$scList->execute('','lancement par '.$scenario->getName());
$scenario->stop();
}
}
// lecture de la programmation
$prgStandard = $scenario->getData('ChaudiereProgrammeStandard');
$prgWeekEnd = $scenario->getData('ChaudiereProgrammeWeekEnd');
$prgFeries = $scenario->getData('ChaudiereProgrammeFeries');
if($prgStandard=='' || $prgWeekEnd=='' || $prgFeries=='') {
$scenario->setLog('programmation non définie, lancement le scenario pour évaluation des variables avant svp');
$scList = $scenario->byObjectNameGroupNameScenarioName('Aucun','Chauffage','ChauffageEvalVariables');
if ($scList ==NULL) {
$scenario->setLog('scenario non trouvé, arrêt'); $scenario->stop();
} else
{
$scenario->setLog('scenario évaluation des variables déclenché');
$scList->execute('','lancement par '.$scenario->getName());
$scenario->stop();
}
}
// réactive le scénario si pas activé.
if ($scenario->getIsActive()==0) {
$scenario->setIsActive(1); $scenario->save();
}
// création des tableaux de programmation à partir des variables
// le format des variables est : [heure,mode[/]]
$aKeys =array('heure','mode');
$dProgrammeStandard = array();
$dProgrammeWeekEnd = array();
$dProgrammeFeries = array();
$dProg = array();
foreach(explode('/', $prgStandard) as $a){ $scenario->setLog('prog std: '.json_encode($a, true));
array_push($dProgrammeStandard, array_combine($aKeys,explode(',', $a))); }
foreach(explode('/', $prgWeekEnd) as $a) { $scenario->setLog('prog we : '.json_encode($a, true));
array_push($dProgrammeWeekEnd, array_combine($aKeys,explode(',', $a))); }
foreach(explode('/', $prgFeries) as $a) { $scenario->setLog('prog fer: '.json_encode($a, true));
array_push($dProgrammeFeries, array_combine($aKeys,explode(',', $a))); }
$bEstFerie = $scenario->getData('ChaudiereFerie');
$bPeriodeChauffe = $scenario->getData('ChaudierePeriodeChauffe');
$bWeekEnd = $scenario->getData('ChaudiereWeekEnd');
$cFinChauffe = $scenario->getData('ChaudiereFinChauffe');
$cDebutChauffe = $scenario->getData('ChaudiereDebutChauffe');
// Est-elle Vérouillée ? si oui on sort pour éviter de changer le mode
$scenario->setLog( 'lecture vérouillage chaudière '.'#'.$szNomEquipementChaudiere . '[Verrou]#');
$cmd = cmd::byString('#'.$szNomEquipementChaudiere . '[Verrouillage]#');
$szEtatChaudiere = $cmd->execCmd();
$scenario->setLog( 'lecture vérouillage chaudière retour=' . ($szEtatChaudiere ? 'vérouillée' : 'dévérouilée'));
if ($szEtatChaudiere == true) { //vérouillée en température de consigne ?
$scenario->setLog( 'chaudière vérouillée, la programmation est ignorée');
} else {
// lecture de la date et de l'heure actuelle
$dDateActuelle = new DateTime('now');
// récupère l'état de la chaudière, mode commuté actuellement
$cmd = cmd::byString('#'.$szNomEquipementChaudiere . '[Mode]#');
$szModeChaudiere = $cmd->execCmd();
$scenario->setLog( 'lecture du mode mode='.$szModeChaudiere);
if ($szModeChaudiere == "Off") {
// La chaudière est arrêtée manuellement, on doit désactiver la programmation
$scenario->setLog( 'On est dans le mode Off, on saute la programmation');
// désactivation du scénario
// $scenario->setIsActive(0); $scenario->save();
} else
if ($szModeChaudiere == "Hors Gel") {
// La chaudière est en hors gel jusqu'à passage manuellement sur un mode quelconque
$scenario->setLog( 'On est dans le mode hors gel (vacances), on saute la programmation');
// remise à zéro des valeurs du prochain cycle
$scenario->setData('ChaudiereProchainCycleHeure', '');
$scenario->setData('ChaudiereProchainCycleMode', '');
} else
// dans la période de non chauffe on sort direct
if ($bPeriodeChauffe==0) {
// on est dans la période où l'on chauffe plus donc pas de programmation
$scenario->setLog( 'On est hors période de chauffe, programmation ignorée');
// changement de la programmation pour retour à période de chauffe
$scenario->setMode("schedule"); $scenario->setSchedule('00 00 '.str_replace('/', ' ',$cDebutChauffe).' *');
$scenario->setIsActive(1); $scenario->save();
$scenario->setLog( 'reprogrammation temporisateur à partir du début de chauffe ('.$cDebutChauffe.')');
// remise à zéro des valeurs du prochain cycle
$scenario->setData('ChaudiereProchainCycleHeure', '');
$scenario->setData('ChaudiereProchainCycleMode', '');
} else { // on est en période de chauffe
// remettre le timer sur le défaut
$scenario->setMode("schedule");
$scenario->setSchedule(array('0 * * * *', '30 * * * * '));
$scenario->save();
if ($bEstFerie==1) {
// on est pas un jour férié, si des traitements sont à faire c'est ici
$scenario->setLog( 'on est en jour férié');
$dProg = $dProgrammeFeries;
} else
if ($bWeekEnd==1) {
// on est en week-end, le week-end a l'antériorité sur les jours fériés
$scenario->setLog( 'on est en weekend');
$dProg = $dProgrammeWeekEnd;
} else { // jour standard
$scenario->setLog( 'on est en jour standard');
$dProg = $dProgrammeStandard;
};
$szCommuterVers = '';
$iTimeset = 0;
foreach (array_reverse($dProg) as $szHeure) {
$dIntervalle = new DateTime(date('Y-m-d') . ' ' . $szHeure['heure']);
$iTimeset = ((date('H') - substr($szHeure['heure'],0,2)) *60) + (date('i')-substr($szHeure['heure'],3,2) );
$scenario->setLog( 'delta minute =' . $iTimeset.' avec '.$szHeure['heure']. ' depuis '.date('H:i'));
if ($dDateActuelle >= $dIntervalle) { // à la première heure qui va, on sort de la boucle
$szCommuterVers = $szHeure['mode'];
$scenario->setLog( 'heure trouvé qui correspond =' . $szHeure['heure']);
break;
}
}
$scenario->setLog( 'test de la commutation en mode {' . $szCommuterVers . '}');
if (($szCommuterVers != '') && ($szCommuterVers != $szModeChaudiere) && ($iTimeset <=5)) {
// on a trouvé une commutation et on doit changer de mode
$scenario->setLog( 'commutation en mode ' . $szCommuterVers);
$cmd = cmd::byString('#'.$szNomEquipementChaudiere . '['.$szCommuterVers.']#');
$cmd->execCmd($szCommuterVers);
$scenario->setLog( 'commutation en mode ' . $szCommuterVers.' envoyée');
} else
$scenario->setLog( 'conditons de commutation non remplie {' . $szCommuterVers . '}');
// calcule maintenant le prochain cycle pour afficher par anticipation
$szCommuterVers = '';
foreach ($dProg as $szHeure) {
$dIntervalle = new DateTime(date('Y-m-d') . ' ' . $szHeure['heure']);
$scenario->setLog( 'lecture intervalle heure=' . $szHeure['heure']);
if ($dDateActuelle < $dIntervalle) { // à la première heure qui va, on sort de la boucle
$szCommuterVers = $szHeure['mode'].' à '.$szHeure['heure'];
break;
}
}
if ($szCommuterVers=="") $szHeure = $dProg[0];
$scenario->setLog( 'prochain cycle à ' . $szHeure['heure'].' en mode '.$szHeure['mode']);
$scenario->setData('ChaudiereProchainCycleHeure', $szHeure['heure']);
$scenario->setData('ChaudiereProchainCycleMode', $szHeure['mode']);
}
// calendrier
// jours fériés
}