MyGreenHousse (serre connectée)

Vous avez réalisé ou vous voulez réaliser un truc impensable avec votre Raspberry Pi ? Cet endroit est pour vous...

Modérateur : Francois

Répondre
Data
Messages : 26
Enregistré le : lun. 23 juil. 2018 16:17
Contact :

MyGreenHousse (serre connectée)

Message par Data » mar. 14 août 2018 20:41

Bonjour,
pour l'instant tout est en labo sur mon bureau organisé d'une manière sublimissime (joyeux bordel) :twisted:
Je lance mon projet de serre connectée, permaculture, aquaponie et autonome en électricité.
Tout doit être piloté par le RasPi 3B, pour certains trucs je dois utiliser Arduino uno R3 là je coince avec PHPça fonctionne avec l'IDE.
Je gère ça pour le moment avec RPI+lighttpd+Python+PHP(c'est lourd et gourmand). J'ai découvert e langage NodeJs (tu vois Bud Spencer, je me lance :mrgreen: ) Serveur web et gestion des sondes et autres joyeusetés avec moins de lignes de code et moins gourmand.

Je dois gérer a température et l'humidité via un DHT22 (le DHT11 ne suporte pas les températures négatives) J'y arrive en Python et php :D
Je fais "haaaahaaaaa" sur le capteur pour l'humidité.
Si la température atteint 45° ouverture des tabatières pour ventiler par 2 moteurs pas à pas + crémaillère et déroulement de voile d'occultation; fermeture à 35°. (en préparation) à 25° le voile remonte. Fermeture si le vent atteint 50Km/H d'ou ajout d'un anémomètre . :x

Gestion de la température de l'eau de l'étang Sonde DS18B20 modèle câblé et étanche (ça fonctionne en Python et PHP) Je mets le capteur en bouche et regarde la température monter. :D

Gestion du PH de l'étang via sonde Atlas Scientific (Programme Python OK; merde c'est pas NodeJs) ;( vu le prix de l'engin je ne testerai en eau que le jour J.

Nourrissage des poissons: granules délivrées via système de vis sans fin à heure donnée. (fait en Bash, ben non y a pas que python dans la vie).

Surveillance du niveau de l'eau là je ne sais pas si je le fait via camera visant un repère visuel apparent quand le niveau est bas qui déclenche le remplissage ou via un floteur style chasse d'eau (sans RPI dans ce cas) :oops: .

Gestion d'arrosage en pleine terre avec sonde "soil moisture" YL-69 (ça aussi ça fonctionne en P-PHP) pfffff. J'ai acheté un bananier chez l'IDL et mis ma sonde dans le pot il avait soif je l'ai arrosé à la main. :mrgreen:

Pour l'alimentation du raspi au départ j'utiliserai une allonge multiprise 220V :!: :!: :?: :?: Je me tâte encore pour la batterie et les panneaux solaires qui par la suite seront couplés à une alimentation éolienne. J'ai un redresseur 12V-220V mais trop faiblard.

Voilà les grandes lignes de mon projet. J'allais oublier; j'ai la serre en pièces détachées dans le jardin; ma femme s'étant blessée en la démontant chez le vendeur je cherche une application même une apk qui me la monterait. :lol:

Merci d'avance pour vos idées et suggestions sachant que ni Yana-server, ni jeedom ni domotics ne me conviennent. Je prèfére me donner un peut de mal avec de l'aide que ces solutions tout en un où il manque toujours quelque chose. J'ai trouvé Cayenne mais pour avoir l'état de sante de mon RasPi je préfère mieux le datalogger de Bud Spencer (merci à lui) :geek:

J'ai créé un répertoire Mygreenhousse dans lequel tous mes fichiers .js se trouveront; toutes les installation via la commande npm se feront à partir de ce dossier!
Modifié en dernier par Data le lun. 20 août 2018 20:39, modifié 2 fois.
Data RasPi 3
Rasbian / Debian GNU/Linux
Code en PHP, HTML
Partager la connaissance est la véritable liberté!

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

Re: MyGreenHousse (serre connectée)

Message par Bud Spencer » jeu. 16 août 2018 12:15

Moi je dis que c’est une bonne idée.

Autant de possibilités sinon plus, de bien meilleures performances avec beaucoup moins de code et beaucoup moins de ressources monopolisées, c’est à se demander pourquoi NodeJs est si peu utilisé par les usagers de ce forum. Peut etre que l’approche JavaScrip fait peur aux débutants ou tout simplement que l’embulbage qui vend python comme le meilleur langage du monde et comme la seule alternative pour le PI fonctionne très bien :lol:

Perso, je n’ai jamais essayé les sondes que tu cites avec NodeJS (DHT22, DS18B20, YL-69 ect …), mais tout ça me semble assez simple à mettre en œuvre. On m’a soumis un projet de mesure d’humidité dans un local de stockage pour piloter et superviser une ventilation donc je vais peut etre essayé ça.

Il faut aussi savoir que tout le hardware que tu interfaces avec du python, en bash en c ou en n’importe quoi d’autre, tu peux aussi l’interfacer avec NodeJS quel que soit le type de liaison (I2c, 1Wire, Serial, xxp/IP ect …). Comme je te l’ais indiqué sur la page du tuto, tu peux aussi dans un premier temps garder tes scripts et programmes d’accès à ces composants et récupérer les valeurs depuis ton programme principale NodeJS.

Concernant les trucs comme Domoticz, Jeedom et tout le reste, ce sont de beaux programmes, mais ça ne donnera jamais la satisfaction et l’exactitude de réponse en termes de besoin qu’un projet que l’on a développé soit meme avec ses propres idées. Après, tout ça est aussi une question de compétences et de temps, mais ça, c’est une autre histoire.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Data
Messages : 26
Enregistré le : lun. 23 juil. 2018 16:17
Contact :

Re: MyGreenHousse (serre connectée)

Message par Data » sam. 18 août 2018 20:05

DS18B20 Étanche:

https://public.joomeo.com/files/5b5ef3fb5e148

j'ai fait une tite recherche dur DS18B20 et j'ai trouvé ça:
https://github.com/talltom/PiThermServer
Ne pas oublier de mettre e N° de votre sonde. Pour ce faire, faites:
ls /sys/bus/w1/devices/
ce quiq commence par 28-.... est le N° de vortre sonde; ce numéro est unique pour chaque sonde.

Un petit soucis d'install sqlite3 donc faire ceci:
npm install https://github.com/mapbox/node-sqlite3/tarball/master
Voici le code ds18b20.js:

Code : Tout sélectionner

// server.js - NodeJS server for the PiThermServer project.

/* 

Parses data from DS18B20 temperature sensor and serves as a JSON object.
Uses node-static module to serve a plot of current temperature (uses highcharts).

Tom Holderness 03/01/2013
Ref: www.cl.cam.ac.uk/freshers/raspberrypi/tutorials/temperature/
*/

// Load node modules
var fs = require('fs');
var sys = require('sys');
var http = require('http');
var sqlite3 = require('sqlite3');

// Use node-static module to server chart for client-side dynamic graph
var nodestatic = require('node-static');

// Setup static server for current directory
var staticServer = new nodestatic.Server(".");

// Setup database connection for logging
var db = new sqlite3.Database('./piTemps.db');

// Write a single temperature record in JSON format to database table.
function insertTemp(data){
   // data is a javascript object   
   var statement = db.prepare("INSERT INTO temperature_records VALUES (?, ?)");
   // Insert values into prepared statement
   statement.run(data.temperature_record[0].unix_time, data.temperature_record[0].celsius);
   // Execute the statement
   statement.finalize();
}

// Read current temperature from sensor
function readTemp(callback){
   fs.readFile('/sys/bus/w1/devices/28-011317007732/w1_slave', function(err, buffer)
	{
      if (err){
         console.error(err);
         process.exit(1);
      }

      // Read data from file (using fast node ASCII encoding).
      var data = buffer.toString('ascii').split(" "); // Split by space

      // Extract temperature from string and divide by 1000 to give celsius
      var temp  = parseFloat(data[data.length-1].split("=")[1])/1000.0;

      // Round to one decimal place
      temp = Math.round(temp * 10) / 10;

      // Add date/time to temperature
   	var data = {
            temperature_record:[{
            unix_time: Date.now(),
            celsius: temp
            }]};

      // Execute call back with data
      callback(data);
   });
};

// Create a wrapper function which we'll use specifically for logging
function logTemp(interval){
      // Call the readTemp function with the insertTemp function as output to get initial reading
      readTemp(insertTemp);
      // Set the repeat interval (milliseconds). Third argument is passed as callback function to first (i.e. readTemp(insertTemp)).
      setInterval(readTemp, interval, insertTemp);
};

// Get temperature records from database
function selectTemp(num_records, start_date, callback){
   // - Num records is an SQL filter from latest record back trough time series, 
   // - start_date is the first date in the time-series required, 
   // - callback is the output function
   var current_temp = db.all("SELECT * FROM (SELECT * FROM temperature_records WHERE unix_time > (strftime('%s',?)*1000) ORDER BY unix_time DESC LIMIT ?) ORDER BY unix_time;", start_date, num_records,
      function(err, rows){
         if (err){
			   response.writeHead(500, { "Content-type": "text/html" });
			   response.end(err + "\n");
			   console.log('Error serving querying database. ' + err);
			   return;
				      }
         data = {temperature_record:[rows]}
         callback(data);
   });
};

// Setup node http server
var server = http.createServer(
	// Our main server function
	function(request, response)
	{
		// Grab the URL requested by the client and parse any query options
		var url = require('url').parse(request.url, true);
		var pathfile = url.pathname;
      var query = url.query;

		// Test to see if it's a database query
		if (pathfile == '/temperature_query.json'){
         // Test to see if number of observations was specified as url query
         if (query.num_obs){
            var num_obs = parseInt(query.num_obs);
         }
         else{
         // If not specified default to 20. Note use -1 in query string to get all.
            var num_obs = -1;
         }
         if (query.start_date){
            var start_date = query.start_date;
         }
         else{
            var start_date = '1970-01-01T00:00';
         }   
         // Send a message to console log
         console.log('Database query request from '+ request.connection.remoteAddress +' for ' + num_obs + ' records from ' + start_date+'.');
         // call selectTemp function to get data from database
         selectTemp(num_obs, start_date, function(data){
            response.writeHead(200, { "Content-type": "application/json" });	
	         response.end(JSON.stringify(data), "ascii");
         });
      return;
      }
      
      // Test to see if it's a request for current temperature   
      if (pathfile == '/temperature_now.json'){
            readTemp(function(data){
			      response.writeHead(200, { "Content-type": "application/json" });		
			      response.end(JSON.stringify(data), "ascii");
               });
      return;
      }
      
      // Handler for favicon.ico requests
		if (pathfile == '/favicon.ico'){
			response.writeHead(200, {'Content-Type': 'image/x-icon'});
			response.end();

			// Optionally log favicon requests.
			//console.log('favicon requested');
			return;
		}


		else {
			// Print requested file to terminal
			console.log('Request from '+ request.connection.remoteAddress +' for: ' + pathfile);

			// Serve file using node-static			
			staticServer.serve(request, response, function (err, result) {
					if (err){
						// Log the error
						sys.error("Error serving " + request.url + " - " + err.message);
						
						// Respond to the client
						response.writeHead(err.status, err.headers);
						response.end('Error 404 - file not found');
						return;
						}
					return;	
					})
		}
});

// Start temperature logging (every 5 min).
var msecs = (60 * 5) * 1000; // log interval duration in milliseconds
logTemp(msecs);
// Send a message to console
console.log('Server is logging to database at '+msecs+'ms intervals');
// Enable server
server.listen(8000);
// Log message
console.log('Server running at http://localhost:8000');
la commande a exécuter est :
node ds18b20.js
démarrez firefox et entrez l'adresse: http://localhost:8000/temperature_log.htm et http://localhost:8000/temperature_plot.htm
ça fonctionne :D
https://public.joomeo.com/files/5b796885af5f7
https://public.joomeo.com/files/5b7968ce1d88d
Modifié en dernier par Data le dim. 19 août 2018 18:23, modifié 3 fois.
Data RasPi 3
Rasbian / Debian GNU/Linux
Code en PHP, HTML
Partager la connaissance est la véritable liberté!

Data
Messages : 26
Enregistré le : lun. 23 juil. 2018 16:17
Contact :

Re: MyGreenHousse (serre connectée)

Message par Data » dim. 19 août 2018 17:20

DHT-22

Comme ma sonde précédante fonctionne je m'attaque à la DHT-22 Température et humidité ambiante; J'utilise la DTH-11 mais le but est d'obtenir la DHT-22 un de ces jours. La différence entre les deux est que la DHT-11 ne prend pas les températures négatives.

voici le nécessaire:
https://public.joomeo.com/files/5b7995e0d8385
https://github.com/momenso/node-dht-sensor
Pré-requis:
npm install node-dht-sensor
http://www.airspayce.com/mikem/bcm2835/
BMC2835 doit être installé

le code dht-11.js fonctionne en console:

Code : Tout sélectionner

var sensorLib = require('node-dht-sensor');
// Setup sensor, exit if failed
var sensorType = 11; // 11 pour DHT11, 22 pour DHT22 and AM2302
var sensorPin  = 17;  // Le numéro de pin du GPIO pour le signal de la sonde
if (!sensorLib.initialize(sensorType, sensorPin)) {
    console.warn('Failed to initialize sensor');
    process.exit(1);
}
// Les valeurs de la sondes sont affichees toutes les 2 secondes
setInterval(function() {
    var readout = sensorLib.read();

    console.log('Temperature:', readout.temperature.toFixed(1) + 'C');
    console.log('Humidity:   ', readout.humidity.toFixed(1)    + '%');
}, 2000);
La commande a exécuter est:
sudo node dht-11.js
On peut également ajouter la température en degrès Fahrenheit, la formule est la suivante:
(°Celsius * 1.8) + 32 = °Fahrenneit

La source de ces trouvailles archéoligiques est : https://www.hackster.io/vshymanskyy/ras ... offset=295
Modifié en dernier par Data le mar. 21 août 2018 18:37, modifié 1 fois.
Data RasPi 3
Rasbian / Debian GNU/Linux
Code en PHP, HTML
Partager la connaissance est la véritable liberté!

Data
Messages : 26
Enregistré le : lun. 23 juil. 2018 16:17
Contact :

Re: MyGreenHousse (serre connectée)

Message par Data » lun. 20 août 2018 15:08

YL-69 SOIL MOISTURE
Sonde de détection d'humidité du sol
J'ai trouvé un code nodejs qui envoi un mail quand la plante a soif :( a remplacer par ouverture de l'électrovanne qui contrôle l'arrosage
ça fonctionne ce qui veut dire que mon câblage sur ma planche à pain (heu tablette d'expérimentation pardon) fonctionne.
voici donc ma planche à pain:
https://public.joomeo.com/files/5b7abcf26cafd
Modifié en dernier par Data le mar. 21 août 2018 18:42, modifié 1 fois.
Data RasPi 3
Rasbian / Debian GNU/Linux
Code en PHP, HTML
Partager la connaissance est la véritable liberté!

Data
Messages : 26
Enregistré le : lun. 23 juil. 2018 16:17
Contact :

Re: MyGreenHousse (serre connectée)

Message par Data » mar. 21 août 2018 14:04

Data RasPi 3
Rasbian / Debian GNU/Linux
Code en PHP, HTML
Partager la connaissance est la véritable liberté!

jmvdb
Messages : 5
Enregistré le : sam. 10 nov. 2018 18:47

Re: MyGreenHousse (serre connectée)

Message par jmvdb » dim. 11 nov. 2018 15:44

Ton projet et tes expérimentations m'intéressent
tu en es ou ?

Répondre

Retourner vers « Utilisateurs avancés »