[RESOLU]ecrire dans une BDD distante depuis mon PI

Paramétrer le Raspberry Pi B/B+ pour se connecter via Ethernet ou une clé WiFi USB

Modérateurs : Francois, maxty01

estelle
Raspinaute
Messages : 154
Enregistré le : jeu. 24 déc. 2015 17:14

Re: ecrire dans une BDD distante depuis mon PI

Message par estelle » mar. 6 déc. 2016 09:52

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+

destroyedlolo
Raspinaute
Messages : 1583
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: ecrire dans une BDD distante depuis mon PI

Message par destroyedlolo » mar. 6 déc. 2016 10:00

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+
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

estelle
Raspinaute
Messages : 154
Enregistré le : jeu. 24 déc. 2015 17:14

Re: ecrire dans une BDD distante depuis mon PI

Message par estelle » mar. 6 déc. 2016 10:12

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+

destroyedlolo
Raspinaute
Messages : 1583
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

Re: ecrire dans une BDD distante depuis mon PI

Message par destroyedlolo » mar. 6 déc. 2016 11:34

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+
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: ecrire dans une BDD distante depuis mon PI

Message par Bud Spencer » mar. 6 déc. 2016 20:33

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.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

estelle
Raspinaute
Messages : 154
Enregistré le : jeu. 24 déc. 2015 17:14

Re: ecrire dans une BDD distante depuis mon PI

Message par estelle » mer. 7 déc. 2016 09:08

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

estelle
Raspinaute
Messages : 154
Enregistré le : jeu. 24 déc. 2015 17:14

Re: ecrire dans une BDD distante depuis mon PI

Message par estelle » mer. 7 déc. 2016 11:03

ok j'ai compris le fonctionnement
cela fonctionne
Merci c'est sympa

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: ecrire dans une BDD distante depuis mon PI

Message par Bud Spencer » mer. 7 déc. 2016 11:44

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'];
}
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

estelle
Raspinaute
Messages : 154
Enregistré le : jeu. 24 déc. 2015 17:14

Re: ecrire dans une BDD distante depuis mon PI

Message par estelle » mer. 7 déc. 2016 14:38

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+

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: ecrire dans une BDD distante depuis mon PI

Message par Bud Spencer » mer. 7 déc. 2016 15:33

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.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Répondre

Retourner vers « Le réseau sur le Raspberry Pï »