Page 5 sur 7

Re: ecrire dans une BDD distante depuis mon PI

Posté : mar. 6 déc. 2016 09:52
par estelle
Pour l'instant et pour avancer un peu le PI écrit dans un fichier text
Dans la page index je lis le fichier que je rafraîchis périodiquement
Solution provisoire compte tenu que le rafraichissement de la page compléte n'est pas ok sur avec les pages graphiques
Je vais vois comment utiliser "setInterval" afin de ne rafraîchir que le message

Code : Tout sélectionner

	<header><!-- header -->
		<div id="headerlogo"><img src="images/abeille1.png" alt="" /></div>
		<h1>Rucher Montminois</h1>
		
    <?php
    $monfichier = fopen('messages.txt', 'r+');
    $date = fgets($monfichier); // On lit la première ligne
    $alarme = fgets($monfichier);
    $num_ruche = fgets($monfichier);
    $pt = fgets($monfichier);
    fseek($monfichier, 0); // On remet le curseur au début du fichier
    fclose($monfichier);
    $pt_ar=round($pt,2);
    if ($alarme=='Essaimage'){ $message ="Alerte : $date $alarme Ruche: $num_ruche perte: $pt_ar kg"; }
    else { $message ="Alerte : $date $alarme : $pt_ar V"; }
    
    ?>
    
    <h2><?php echo $message ?></h2>
	</header><!-- end of header -->
Si vous avez des idées
A+

Re: ecrire dans une BDD distante depuis mon PI

Posté : mar. 6 déc. 2016 10:00
par destroyedlolo
estelle a écrit :Pour l'instant et pour avancer un peu le PI écrit dans un fichier text
Dans la page index je lis le fichier que je rafraîchis périodiquement
Pourquoi passer par un fichier et ne pas utiliser directement une query SQL dans la table ?
estelle a écrit :Solution provisoire compte tenu que le rafraichissement de la page compléte n'est pas ok sur avec les pages graphiques
D'où l'Ajax.
J'ai ce genre de code mais pour un framework JS maintenant obsolete ... et je suis en déplacement pour le reste de la semaine.
Je fais donc aussi l'impasse. Cependant, il y a pleins de tuto sur le sujet sur le web ;)
estelle a écrit :Je vais vois comment utiliser "setInterval" afin de ne rafraîchir que le message
Regarde du coté des iFrame : c'est viello et pas très beau, mais ca fera ce que tu cherche a faire pour une solution rapide avant d'implémenter l'Ajax.

A+

Re: ecrire dans une BDD distante depuis mon PI

Posté : mar. 6 déc. 2016 10:12
par estelle
J'ai écris ce petit bout de prg

Code : Tout sélectionner

<script>
interv() {
    $monfichier = fopen('messages.txt', 'r+');
    $date = fgets($monfichier); // On lit la première ligne
    $alarme = fgets($monfichier);
    $num_ruche = fgets($monfichier);
    $pt = fgets($monfichier);
    fseek($monfichier, 0); // On remet le curseur au début du fichier
    fclose($monfichier);
    $pt_ar=round($pt,2);
    if ($alarme=='Essaimage'){ $message ="Alerte : $date $alarme Ruche: $num_ruche perte: $pt_ar kg"; }
    else { $message ="Alerte : $date $alarme : $pt_ar V"; }
}

intervalId = setInterval(interv, 30000);
</script>
Je n'arrive pas encore à comprendre correctement le fonctionnement de la scrutation
Je suis automaticienne et j'ai l'habitude du séquentiel ! lol
Lorsque l'on écrit un script, il est séquentiel ou bien il n'est lu qu'une fois ?
Merci de m'éclairer
Je fais de l'autoformation et c'est pas facile de comprendre le fonctionnement
A+

Re: ecrire dans une BDD distante depuis mon PI

Posté : mar. 6 déc. 2016 11:34
par destroyedlolo
estelle a écrit : Lorsque l'on écrit un script, il est séquentiel ou bien il n'est lu qu'une fois ?
Si je comprend bien la question, oui, le script PHP n'est lue qu'une seule fois, à la génération de la page.

De plus, dans le code que tu présente, le fseek() ne sert à rien vu que tu ferme le fichier juste derriere.

A+

Re: ecrire dans une BDD distante depuis mon PI

Posté : mar. 6 déc. 2016 20:33
par Bud Spencer
Allez, vite fait à l'arrache (ca ne gère pas toutes les erreurs possible ni la sécu, c'est juste un exemple).

Tu écris un fichier tension.php et tu mets ca dedans

Code : Tout sélectionner


<?php                
        $cnx = mysqli_connect('ton_db_host','ton_db_user','ton_db_password','ton_db_dbname') 
        or die('erreur cnx !');

        $qry = "SELECT champsquicontiendlatension FROM tatable ORDER BY champsdordre DESC LIMIT 0, 1";
        $tension = mysqli_fetch_assoc(mysqli_query($cnx,$qry))['champsquicontiendlatension'];
        mysqli_close($cnx);

        echo $tension;
?>
    
A adapter avec tes paramètres et suivant si tu utilises mysql_ ou mysqli_. Quoi qu'il en soit, Quand tu vas appeler cette page ca doit te retourner juste la dernière tension enregistrée dans ta table.



Un exemple de liaison coté client (à tester telle quelle dans une page xxx.php puis à intégrer dans ta page d'index)

Code : Tout sélectionner

<html>
<head>   
</head>
<body>

    <p><b>Ma super page d'waibe que ja fais moi tout seul</b></p>
   
    <p>Tension batterie : <span id="domTension"></span></p>

    <script = "text/javascript">
       
    function getTension() {    
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (this.status == 200 && this.readyState == 4) {
                document.getElementById("domTension").innerHTML = this.responseText;
            }
        };
        xhr.open("GET", "tension.php", true);
        xhr.send();
    }
    
    setInterval(function()
    {
        getTension();
    }, 60000); 

    getTension(); 
	</script>

</body>
</html>


Comment ca marche :
C'est simple, ta page d'index est chargée une seule fois, mais ton navigateur exécute le javascript qui est dedans.
Ce script appel la fonction getTension() toutes les 60000 milliseconde (1 minutes) sans recharger la page.
La fonction getTension() appelle la page tension.php (qui elle, retourne la valeur de la dernière tension) et met a jour l'objet DOM 'domTension'

Si tu veux afficher autres chose que la tension (alerte, couleur, barre graphe ...) , tu peux le coder aussi bien coté serveur que client.

Re: ecrire dans une BDD distante depuis mon PI

Posté : mer. 7 déc. 2016 09:08
par estelle
Bud Spencer a écrit :Allez, vite fait à l'arrache (ca ne gère pas toutes les erreurs possible ni la sécu, c'est juste un exemple).
Merci, oui cela fonctionne bien sauf que j'ai 4 champs à récupérer de la base !!

date, objet, num, tension

Comment insérer ces nouveaux champs ?
Il n'y a peut être pas grand chose à faire mais le java je ne me suis pas encore former !

A+
Estelle

Re: ecrire dans une BDD distante depuis mon PI

Posté : mer. 7 déc. 2016 11:03
par estelle
ok j'ai compris le fonctionnement
cela fonctionne
Merci c'est sympa

Re: ecrire dans une BDD distante depuis mon PI

Posté : mer. 7 déc. 2016 11:44
par Bud Spencer
estelle a écrit :Il n'y a peut être pas grand chose à faire mais le java je ne me suis pas encore former !
Attention de ne pas se gourrer. JavaScript et Java sont 2 choses totalement différentes. C'est comme comparer un Clafoutis à un Bœuf Bourguignon

Pour plusieur champs, le mieu c'est d'encoder un tableau json dans le script php

$qry = "SELECT date, objet, num, tension FROM tatable ORDER BY iden DESC LIMIT 0, 1";
$res =mysqli_fetch_assoc(mysqli_query($cnx,$qry));
mysqli_close($cnx);
echo json_encode($res);

et coté client tu ajoutes une var qui va stocker le tableau json de réponse et tu mets à jour les objets DOM correspondant
if (this.status == 200 && this.readyState == 4)
{
var resjson = JSON.parse(this.responseText);
        document.getElementById("domTension").innerHTML = resjson['tension'];
document.getElementById("domDate").innerHTML = resjson['date'];
document.getElementById("domNum").innerHTML = resjson['num'];
document.getElementById("domObjet").innerHTML = resjson['objet'];
}

Re: ecrire dans une BDD distante depuis mon PI

Posté : mer. 7 déc. 2016 14:38
par estelle
j'ai fait plus simple
dans le fichier tension.php, j'ai rajouté plusieurs "echo" avec du texte

Code : Tout sélectionner

echo $donnees['datealerte'];
echo ' ';
echo $donnees['alerte'];
echo ' ';
if ($donnees['alerte']=='Essaimage'){ 
echo 'ruche: ';
echo $donnees['ruche'] ;
echo ' =>';
}
echo round($donnees['poidstension'],2);
if ($donnees['alerte']=='Essaimage'){ 
echo ' kg'; }
else {
echo ' V';}
Cela fonctionne super bien
Reste plus qu'à rajouter un petit Beep à l'activation d'un message différent et ce serai le top
il y a les bornes <audio> et j'ai un petit prg qui fonctionne avec un bouton

Code : Tout sélectionner

<audio autoplay="false" id="beep" src='1025.mp3'>
  </audio>
  <input type="button" value="Cliquer pour un beep" onclick="JouerSon()" />
  <script>
    function JouerSon() {
            var sound = document.getElementById("beep");
            sound.play();
        }
  </script>[code]
[/code]
Reste à l'intégrer
A+

Re: ecrire dans une BDD distante depuis mon PI

Posté : mer. 7 déc. 2016 15:33
par Bud Spencer
estelle a écrit :j'ai fait plus simple
dans le fichier tension.php, j'ai rajouté plusieurs "echo" avec du texte

Code : Tout sélectionner

echo $donnees['datealerte'];
echo ' ';
echo $donnees['alerte'];
echo ' ';
if ($donnees['alerte']=='Essaimage'){ 
echo 'ruche: ';
echo $donnees['ruche'] ;
echo ' =>';
}
echo round($donnees['poidstension'],2);
if ($donnees['alerte']=='Essaimage'){ 
echo ' kg'; }
else {
echo ' V';}

Ha ? ....
Perso je trouve plus simple de faire juste un : echo json_encode($res); et coté client ca devient enfantin.
Ta solution fonctionne, mais à temps perdu, jettes quand même un coup d'zieux sur celle que je t'ais donnée.
JSon est un format incontournable quand tu fais du JavaScript et cela simplifie énormément le traitement de données ou d'objets. En plus c'est un format très facile à utiliser avec python

Pour le son, je te fais juste une suggestion (disons que c'est une idée).
Tu viens de voir que ta page web était tout à fait capable de dialoguer avec l'extérieur et aussi qu'elle est capable de mettre à jour l'interface graphique sans avoir besoin d'être rechargée.
Tu pourrais donc tout à fait piloter des sorties GPIO en cas d'alerte (voyant physiques, sirène ...) ou déclencher des traitements (envois de mail, de sms ...) en fonction d'évènement dans la page.

Si tu ne l'as pas fait, jette un coup d'œil la dessus -> viewtopic.php?f=44&t=3033
Ce tuto donne un aperçu des possibilités d'interaction depuis ou vers une page web.