Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

Script sauvegarde capteurs sur BDD externe

De l'installation à l'utilisation venez discuter de JEEDOM au quotidien
Répondre
djo074
Timide
Messages : 50
Inscription : 19 janv. 2018, 14:59

Script sauvegarde capteurs sur BDD externe

Message par djo074 » 13 août 2018, 17:13

Bonjour à tous.
Après avoir fait le tour du forum, je n'ai pas trouvé réponse à ma question:
En cours de migration d'eedomus vers jeedom, je regarde petit a petit comment reproduire les taches qui m’intéresse, entre les 2 systemes, dont celui-ci:
Il s'agit d'un script PHP situé sur mon NAS qui à la demande eedomus va extraire les valeurs de périphériques choisis et les stocker sur ma base maria DB (pypmyadmin) toujours sur mon NAS. Ainsi je garde une trace sur le long terme et je peux tracer sur Grafana par exemple.
Dans le principe, le script regarde si la base est créée, les dernières données enregistrées et ajoute a partir de ce moment les nouvelles valeurs.
Je ne suis malheureusement pas capable de transcrire ce script pour jeedom, pour assurer la continuité lorsque j'aurai inclu mes périphérique, mais peut être l'un(e) d'entre vous le réalise déjà...

En vous remerciant par avance,

Bonne fin de journée!

Djo

Avatar de l’utilisateur
Theduck38
Helper
Messages : 2714
Inscription : 22 févr. 2015, 17:32
Localisation : Près de Grenoble
Contact :

Re: Script sauvegarde capteurs sur BDD externe

Message par Theduck38 » 14 août 2018, 06:51

Bonjour,

Il faudrait savoir comment ton script est fait exactement.

Voici un exemple de code php à mettre dans un scénario qui te loggue des valeurs dans une BDD externe à l'aide d'un script php externe (fait à l'origine sur une Vera pour enregistrer tous les paramètres mesurés).

Code : Tout sélectionner

//Toutes données sauf vent
$sc->log('************ DEBUT Upload Highcharts ************');
$feeds = '';
//Tableau des commandes info
$Liste = array(array('T_Ext','#[Extérieur][T-H Extérieure][Température]#'),
			   array('T_Salon','#[Salon][T-H-P Salon][Température]#'),
			   array('T_Cbls','#[Combles][T Combles][Température]#'),
			   array('T_ChPa','#[Chambre Parents][T-H Chambre parents][Température]#'),
			   array('T_ChJu','#[Chambre Juliette][T-H Chambre Juliette][Température]#'),
			   array('T_SdB','#[Salle de Bain][T-H SdB][Température]#'),
			   array('T_ChLu','#[Chambre Lucie][T-H Chambre Lucie][Température]#'),
			   array('T_Coul','#[Palier][Présence Palier][Température]#'),
			   array('T_Mezz','#[Mezzanine][Présence Mezzanine][Température]#'),
			   array('T_Garage','#[Garage][T-H Garage][Température]#'),
			   array('T_Caisson','#[Combles][Caisson-TH][Température]#'),
			   array('H_Ext','#[Extérieur][T-H Extérieure][Humidité]#'),
			   array('H_Salon','#[Salon][T-H-P Salon][Humidité]#'),
			   array('H_ChPa','#[Chambre Parents][T-H Chambre parents][Humidité]#'),
			   array('H_ChJu','#[Chambre Juliette][T-H Chambre Juliette][Humidité]#'),
			   array('H_SdB','#[Salle de Bain][T-H SdB][Humidité]#'),
			   array('H_ChLu','#[Chambre Lucie][T-H Chambre Lucie][Humidité]#'),
			   array('H_Garage','#[Garage][T-H Garage][Humidité]#'),
			   array('H_Caisson','#[Combles][Caisson-TH][Humidité]#'),
			   array('P_Atm','#[Salon][T-H-P Salon][Pression]#'),
			   array('Ct_Maison','#[Maison][Elec-Conso Globale][Consommation]#'),
			   array('Ct_Geo','#[Garage][Consommation Géothermie][Consommation]#'),
			   array('U_Ext','#[Extérieur][Capteur UV][UV]#'),
			   array('P_Tot','#[Extérieur][Pluviomètre][Pluie_totale]#'),
			   array('P_Speed','#[Extérieur][Pluviomètre][Rainrate]#')			   
			   );
//Construction du message
for ($i=0; $i<count($Liste); $i++) {
	$temp = $sc->getCmd($Liste[$i][1]);
	$feeds .= '&f'.($i+1).'='.$Liste[$i][0].'&v'.($i+1).'='.$temp;
	}
//Appel du fichier logger
$message = "http://192.168.1.6/loggergraph.php?feeds=" . (count($Liste)) . $feeds;
$sc->log('Le message d_appel sera ' . $message);
//La ligne suivante poste les valeurs...
$lines = file($message);
$sc->log('************ FIN Upload Highcharts ************');
Dans mon cas, il faut passer en paramètre au logger php le nombre de feeds puis chaque feed avec son nom et sa valeur :
par exemple : &f=P_atm&v=1018

Cette structure se base sur la classe 'sc' de dJuL, qui s'installe à part dans Jeedom (voir le fil adapté 'framework sc' : viewtopic.php?f=27&t=17645#p317295)
-- TD38 --
Helper Officiel Jeedom
Zimeteo sur Jeedom : http://www.meteo.lecoin.info
Jeedom Stable sur serveur custom
Le risque électrique - Afficheur leds RGB - Tablette Murale - Thermostat connecté

djo074
Timide
Messages : 50
Inscription : 19 janv. 2018, 14:59

Re: Script sauvegarde capteurs sur BDD externe

Message par djo074 » 14 août 2018, 12:34

Merci Theduck,

Evidemment tout est possible, mais encore faut il maîtriser le code. de plus je suis nouveau sur jeedom, et là je sors de ma zone de confort de l'eedomus pour une migration progressive.
A présent j'utilise sur mon NAS le script https://forum.eedomus.com/viewtopic.php?f=12&t=2185 et d'un get http j'appel le script php qui rempli la base.
Je vais essayer de comprendre ta méthode, mais en face, il me faudra un script php sur mon NAS...

Encore merci!

Djo

Ekinox
Timide
Messages : 407
Inscription : 07 mars 2015, 13:17
Localisation : Toulouse

Re: Script sauvegarde capteurs sur BDD externe

Message par Ekinox » 14 août 2018, 13:36

Hello, j'utilise un script php pour sauvegarder, ds une base MySql deportée des données Jeedom (temp, conso elec, chgt d'etat des capteurs).
Je te partage tout ca si tu veux; passe plutôt en messages prives pour échanger les scripts. Bye.
NUC i5+ESXi 6.0 (Jeedom sur Debian 8 avec zWave+RFXCom+MySensors+HuaweiG200)+IPX800v4+RaspPi (Multiroom SqueezeBox, Arrosage). 35 zWave/10 RFXCom/4 MySensors/Alarme filaire sur IPX (ouv, mvt, sirène ext), 4 Cameras

Avatar de l’utilisateur
Theduck38
Helper
Messages : 2714
Inscription : 22 févr. 2015, 17:32
Localisation : Près de Grenoble
Contact :

Re: Script sauvegarde capteurs sur BDD externe

Message par Theduck38 » 14 août 2018, 16:41

Dans le code que je t'ai donné, il y a aussi "en face" (côté NAS) un script en php. Il s'appelle 'loggergraph.php' (tu peux repérer son nom dans le code).
Voici son contenu :

Code : Tout sélectionner

<?php

    $db_name  = "graph";
    $db_login = "login";
    $db_passw = "password";
    $db_table = "graph_tbl";

    if (!isset($_GET['f1']) || !isset($_GET['v1']))
    die ("v or f is null");
 
    $feeds = $_GET['feeds'];
 
    $db = mysql_connect('localhost', $db_login, $db_passw);
    mysql_select_db($db_name, $db) or die('Erreur SQL !<br>'.mysql_error());
 
    $sql = "INSERT INTO ".$db_table." (ffeed, ftimestamp, fvalue) VALUES";
    for($i=1;$i<=$feeds;$i++){
    $feed = $_GET['f'.$i];
    $value = $_GET['v'.$i];
    if ($i==$feeds){
      $sql.=" (\"".$feed."\", NOW(), ".$value.")";
      } else {
              $sql.=" (\"".$feed."\", NOW(), ".$value."),";
             }
 
      }
    mysql_query($sql, $db) or die('Erreur SQL !<br>'.mysql_error());
    echo "OK";

    ?>
Il ajoute à la queue leu leu les noms et les valeurs. Puis c'est au code qui affiche les graphes d'aller extraire correctement les données.
Ta structure de BDD est probablement différente, mais c'est l'idée générale : le code du scénario Jeedom appelle un .php situé dans le NAS avec toute une série de paramètres derrière qui sont les valeurs à logguer dans la base.
-- TD38 --
Helper Officiel Jeedom
Zimeteo sur Jeedom : http://www.meteo.lecoin.info
Jeedom Stable sur serveur custom
Le risque électrique - Afficheur leds RGB - Tablette Murale - Thermostat connecté

djo074
Timide
Messages : 50
Inscription : 19 janv. 2018, 14:59

Re: Script sauvegarde capteurs sur BDD externe

Message par djo074 » 15 août 2018, 22:37

Merci Theduck, je vais regarder cela.
En plus de ce que Ekinox partagera, je devrais pouvoir me dépatouiller.
J'avance tranquillou, et ce grace à vous.

A ciao.

Djo

djo074
Timide
Messages : 50
Inscription : 19 janv. 2018, 14:59

Re: Script sauvegarde capteurs sur BDD externe

Message par djo074 » 05 sept. 2018, 08:59

Bonjour à tous,
Grace à Theduck38 et Ekinox, j'ai évolué dans ma quete de logger des valeurs de jeedom dans une base externe à jeedom.
Ekinox m'a proposé une solution performante mais trop complexe pour mon moi et mon niveau en php et connaissance naissante sur jeedom

J'ai donc retenue la solution de Theduck, qui fait le job de manière plus compréhensible pour moi. Voici donc la démarche, que je veux détailler simplement pour les novices comme moi. Je ne fait que retranscrire les aides qui m'ont été fourni

Tout d'abord, installer le Framework SC. :http://rulistaff.free.fr/sc/doc/?package-Demarrage
il est possible de créer un scénario, avec 1 bloc installation, et 1 bloc de mise à jour comme le fait Theduck, qui sera déclenché régulierement:

Code : Tout sélectionner

//Installation framework
if (!class_exists('sc', false)) {
  eval(file_get_contents("http://rulistaff.free.fr/sc/install"));
}
       
et

Code : Tout sélectionner

//Mise a jour
//Charge la librairie install
$sc->load('install');
//Lance la mise à jour/réinstallation du framework sc
$sc->install->update_sc();
Image

Puis créer un autre scénario avec bloc code pour la récupération de la valeur du périphérique et l'appel du script, que j'ai mis sur mon NAS, là où il y a également la BDD:

Code : Tout sélectionner

//Toutes données 
$sc->log('************ DEBUT Upload Highcharts ************');
$feeds = '';
//Tableau des commandes info
$Liste = array(array('T_mezzanine','#[domobox][temp hygro mezzanine][Température]#'), //définir ici les périphériques à sauvegarder
			   array('T_piscine','#[domobox][temperature piscine][temp]#')
              );
//Construction du message
for ($i=0; $i<count($Liste); $i++) {
	$temp = $sc->getCmd($Liste[$i][1]);
	$feeds .= '&f'.($i+1).'='.$Liste[$i][0].'&v'.($i+1).'='.$temp;
	}
//Appel du fichier logger
$message = "http://192.168.x.xx/loggergraph.php?feeds=" . (count($Liste)) . $feeds; //appel du script loggergraph qui s'occupera de stocker sur la bdd
$sc->log('Le message d_appel sera ' . $message);
//La ligne suivante poste les valeurs...
$lines = file($message);
$sc->log('************ FIN Upload Highcharts ************');
dans le log de ce scénario, on pourra trouver le "message"qui va etre envoyé, utile pour débugger:
Du coté du NAS, il faudra y inserer le script "Loggergraph.php"

Code : Tout sélectionner

<?php

    $db_name  = "jeedomDB";
    $db_login = "user_name";
    $db_passw = "passwd";
    $db_table = "graph_tbl";

    if (!isset($_GET['f1']) || !isset($_GET['v1']))
    die ("v or f is null");
 
    $feeds = $_GET['feeds'];
 
    $db = mysql_connect('localhost', $db_login, $db_passw);
    mysql_select_db($db_name, $db) or die('Erreur SQL !<br>'.mysql_error());
 
    $sql = "INSERT INTO ".$db_table." (ffeed, ftimestamp, fvalue) VALUES";
    for($i=1;$i<=$feeds;$i++){
    $feed = $_GET['f'.$i];
    $value = $_GET['v'.$i];
    if ($i==$feeds){
      $sql.=" (\"".$feed."\", NOW(), ".$value.")";
      } else {
              $sql.=" (\"".$feed."\", NOW(), ".$value."),";
             }
 
      }
    mysql_query($sql, $db) or die('Erreur SQL !<br>'.mysql_error());
    echo "OK";

    ?>
Puis créer la base ad-hoc, pour moi mariaDB via phpMyAdmin:
Image

Voilà, j'espère que cette description est claire et simple, je remercie encore Theduck et Ekinox.
A voir comment faire évoluer cela.

Bonne journée.
Joël.

Avatar de l’utilisateur
Theduck38
Helper
Messages : 2714
Inscription : 22 févr. 2015, 17:32
Localisation : Près de Grenoble
Contact :

Re: Script sauvegarde capteurs sur BDD externe

Message par Theduck38 » 05 sept. 2018, 22:17

Bonjour,

Pour compléter... voici un exemple de fichier php qui permet de tracer des graphiques issus de la BDD remplie selon le format ci-dessus...

Créer un fichier php sur votre serveur qui contient la BDD :

Code : Tout sélectionner

<?php
//Connexion a la base de données
// Remplacez localhost, username, password, par vos informations de connexion.
$hostname = "localhost";
$database = "your_db";
$username = "user";
$password = "password";
$Conn = mysql_pconnect($hostname, $username, $password); 
?>
<?php 
//On test la présence du paramètre de longueur du graphique dans l'url ===> remplacé par 100%
//if (isset($_GET['width'])) $width = $_GET['width'];
//Si celui-ci n'est pas présent, alors par défaut, la longueur sera de 1280px
//else $width = "1280"; 

//On test la présence du paramètre de hauteur du graphique dans l'url
if (isset($_GET['height'])) $height = $_GET['height'];
//Si celui-ci n'est pas présent, alors par défaut, la hauteur sera de 400px
else $height = "400";

//On test la présence du paramètre de titre du graphique dans l'url
if (isset($_GET['title'])) $title = $_GET['title'];
//Si celui-ci n'est pas présent, alors par défaut, le nom sera Sans titre
else $title = "Sans titre";

//On test la présence de l'unité de mesure des valeurs du graphique
if (isset($_GET['suffix'])) $suffix = $_GET['suffix'];
//Si celui-ci n'est pas présent, alors par défaut, nous laissons vide
else $suffix = "";

//On test la présence de la limitation temporelle
if (isset($_GET['startdate'])) $startdate = $_GET['startdate'];
//Si celle-ci n'est pas présente, alors on définit une valeur par défaut à une semaine d'historique
else $startdate = date("Y-m-d", mktime(0, 0, 0, date("m")  , date("d")-7, date("Y")));

//A partir d'ici, nous créons une boucle afin de récupérer le nom et la description de toutes les sondes présentes dans l'URL
$feeds=$_GET['feeds'];

$a = array(); // On itinialise notre liste de flux
$b = array(); // On itinialise notre liste de nom de flux
$i = 0; // Notre variable qui sera incrémentée dans la boucle

foreach($feeds as $id => $nom) {
//foreach($_GET as $var) { // Pour chaque valeur du tableau $_GET on crée une variable $var
	$a[$i] = $id; // On met la valeur dans le tableau avec la valeur de $i
	$b[$i] = $nom;
	$i++; // On incrémente
}
?>
<html>
<head>
<title>Coincoin - Highstock </title>
<!-- Chargement des librairies: Jquery & highcharts -->
<script type='text/javascript' src='js/jquery.min.js'></script>
<script type="text/javascript" src="js/highstock.js" ></script>
<script type="text/javascript" src="js/themes/gray.js" ></script>
<script type="text/javascript" src="js/modules/exporting.js" ></script>
<!-- Chargement des traductions -->
<script type="text/javascript" src="js/options.js"></script>
<!-- Chargement des variables, et paramètres de Highcharts -->
	<script type="text/javascript">
$(function() {

		$('#container').highcharts('StockChart', {

			//RangeSelector correspond aux boutons de zoom qui se trouvent en haut à gauche du graphique
			rangeSelector : {
			buttons: [
			//Ici, nous définissons les boutons, et la taille de leur zoom
			//type: On définie s’il faut compter en jour, mois ou année
			//count: Le nombre de jours, mois, ou années à afficher
			//text: Le texte à afficher dans le bouton
								{type: 'day',count: 1,text: '1j'},
								{type: 'day',count: 3,text: '3j'},
								{type: 'day',count: 7,text: '7j'},
								{type: 'month',count: 1,text: '1m'},
								{type: 'year',count: 1,text: '1a'},
								{type: 'all',text: 'Tout'}],
			//selected : 5 = Par défaut, nous sélectionnons le cinquième bouton "Tout".
			//Pour compter les boutons, il faut partir de 0, et non de 1
				selected : 5
			},
			legend:
			//Legend permet d'afficher la légende sous le graphique.
			//La légende affiche, le nom de la courbe, ainsi que sa couleur
			{
			//verticalAlign: Nous affichons la légende en haut du graphique
				verticalAlign: 'top',
				floating : false,
				//y: Nous décalons la légende de 25 par rapport au haut du graphique
				//afin que le titre et la légende ne se chevauchent pas
				y: 25,
				//enabled: false pour désactiver et true pour activer
				enabled: true
			},
            yAxis: {
                title: {
				//Ce texte s'affiche à la verticale sur le coté gauche du graphique.
				//Nous affichons ici le titre et l'unité de mesure récupérés dans l'URL
                    text: '<?php echo $title; ?> (<?php echo $suffix; ?>)'
                }
            },
            chart: {
                zoomType: 'x',
                spacingRight: 20
            },
            tooltip: {
                shared: true,
				//Ajout d'une unité de mesure lors du survole d'un point du graphique
				//L'unité de mesure provient de l'URL
				valueSuffix: ' <?php echo $suffix; ?>'
            },
//            plotOptions: {
//				spline: {
//					enableMouseTracking: true,
//					cropThreshold: 200,
//				}
//        	},
			title : {
			//Titre du graphique
			//Le titre provient de l'URL
				text : '<?php echo $title; ?>'
			},

series: [<?php
//Connexion à la base de données
				mysql_select_db($database, $Conn);
				//Pour chaque sonde trouvée dans l'URL, nous exécutons le code suivant
				foreach ($a as $key =>  $valeur) {
//Requête SQL permettant de récupérer l'heure, et la valeur correspondante
$query_info = "SELECT ftimestamp, fvalue FROM `graph_tbl` WHERE  `ffeed` LIKE  '".$valeur."' and ftimestamp> \"$startdate\" ORDER BY ftimestamp ASC";
$info = mysql_query($query_info, $Conn);
$row_info = mysql_fetch_assoc($info);
$totalRows_info = mysql_num_rows($info);
?>
{
                name: '<?php echo $b[$key] ?>',
				//Formatage de la date sous la forme: Année, Mois, Jour, Heure, minute,
                data: [<?php do { ?>
[Date.UTC(<?php echo date("Y", strtotime("".$row_info['ftimestamp'])).", ".(date("m", strtotime("".$row_info['ftimestamp'])) - 1).", ".date("d, H, i", strtotime("".$row_info['ftimestamp'])); ?>), <?php echo $row_info['fvalue']; ?>],
<?php } while ($row_info = mysql_fetch_assoc($info)); ?>],
				type : 'spline',
				threshold : null,
				tooltip : {
					valueDecimals : 2
				},
// 				fillColor : {
// 					linearGradient : {
// 						x1: 0, 
// 						y1: 0, 
// 						x2: 0, 
// 						y2: 1
// 					},
// 					stops : [[0, 'rgba(255, 255, 255, 1)'], [1, 'rgba(0,0,0,0)']]
// 				}
            },
			<?php	
//Fermeture de la boucle			
  }

?>]
		});

});

		</script>
</head>

<body>
    <p></p>
	<p>
<!-- Affichage du graphique -->
<div id="container" style="width:100%; height:<?php echo $height ?>px;"></div><div align="center">
</p>
<div align="center">
    <p><a href="http://www.falaf.net">Un tr&egrave;s grand MERCI &agrave; Falaf.net</a></p>
	</div>
</body>
</html>
Il faut ensuite aller récupérer sur le site de Highcharts le dossier highstock, et mettre le dossier "/js" (qui se trouve dans "code") au même endroit que votre fichier php.

On appelle le fichier php (monograph4.php dans mon cas) de la façon suivante :
http://ip_serveur/monograph4.php?height=450&suffix=degC&title=MonGraphe&startdate=2018-07-16&feeds[T_ext]=Temperature%20Exterieure&feeds[T_salon]=Temperature%20Salon
Vous pouvez empiler les flux en les ajoutant les uns derrière les autres (dans mon exemple : T_ext est le nom du flux stocké dans la BDD, et il s'affichera avec le nom "Temperature Exterieure").

EDIT : il semble qu'avec la version la plus récente de Hicharts ça ne fonctionne pas... je poste ma version qui est plus ancienne (mais qui fonctionne) du dossier /js
js.7z
(361.09 Kio) Téléchargé 23 fois
Dernière édition par Theduck38 le 12 sept. 2018, 21:41, édité 2 fois.
-- TD38 --
Helper Officiel Jeedom
Zimeteo sur Jeedom : http://www.meteo.lecoin.info
Jeedom Stable sur serveur custom
Le risque électrique - Afficheur leds RGB - Tablette Murale - Thermostat connecté

djo074
Timide
Messages : 50
Inscription : 19 janv. 2018, 14:59

Re: Script sauvegarde capteurs sur BDD externe

Message par djo074 » 12 sept. 2018, 17:09

Salut, merci pour la combine.
Je sais pas comment depuis ton code php tu gère la connexion a la base, mais j'ai rajouté ceci:

Code : Tout sélectionner

//Connexion à la base de données
$conn = mysql_connect('localhost', 'user', 'xxxx');
if (!$conn) {
   die('Impossible de se connecter : ' . mysql_error());
}
mysql_select_db('jeedomDB', $Conn);
mais à la requete j'obtiens cela:
Image
En claire, il accede pas à la base...

Bonne journée.

Joël.

Avatar de l’utilisateur
Theduck38
Helper
Messages : 2714
Inscription : 22 févr. 2015, 17:32
Localisation : Près de Grenoble
Contact :

Re: Script sauvegarde capteurs sur BDD externe

Message par Theduck38 » 12 sept. 2018, 21:40

Oh, toutes mes excuses, j'avais oublié un bout...
J'ai remis à jour dans le post précédent.
Il faut modifier $database, $username, $password dans le début du code.
-- TD38 --
Helper Officiel Jeedom
Zimeteo sur Jeedom : http://www.meteo.lecoin.info
Jeedom Stable sur serveur custom
Le risque électrique - Afficheur leds RGB - Tablette Murale - Thermostat connecté

djo074
Timide
Messages : 50
Inscription : 19 janv. 2018, 14:59

Re: Script sauvegarde capteurs sur BDD externe

Message par djo074 » 13 sept. 2018, 09:44

Salut,

Impec, merci!

Bonne journée.

Joël.

Avatar de l’utilisateur
Theduck38
Helper
Messages : 2714
Inscription : 22 févr. 2015, 17:32
Localisation : Près de Grenoble
Contact :

Re: Script sauvegarde capteurs sur BDD externe

Message par Theduck38 » 15 août 2019, 10:01

Post pour maintient du sujet...
-- TD38 --
Helper Officiel Jeedom
Zimeteo sur Jeedom : http://www.meteo.lecoin.info
Jeedom Stable sur serveur custom
Le risque électrique - Afficheur leds RGB - Tablette Murale - Thermostat connecté

Répondre

Revenir vers « Utilisation »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 9 invités