Aller au contenu
Lazer

Graph De Température, Humidité, Consommation...sur Nas

Recommended Posts

1 toutes les heure.

 

bon j'ai dupliqué les tables température day and month (plus simple de repartir de cela) et j'ai modifié trends.php en csq

A voir demain :-)

 

j'ai pas compris le coup du get data, car la structure de la table gaz et la meme que température. pourquoi j'ai du copié/collé la partie water? 

Modifié par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

Je ne sais plus te dire de mémoire, mais water est géré différemment de temperature (et humidity, etc), donc j'avais été obligé de créer des requêtes spécifiques pour water dans data_get.php

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Mais du coup j ai peut être pas Bien fait de dupliquer les tables temp_day et month pour gaz_day et month ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Je t'avoue que je suis perdu dans toutes les modifs que tu as faites.

J'espère que tu as bien noté tout ça et que tu feras un récapitulatif (et même un mini tuto pour les possesseurs de ce module de comptage de gaz), ça sera utile.

Partager ce message


Lien à poster
Partager sur d’autres sites

oué j'attends un peu pour voir que si tout marche :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

bon alors petit retour sur la partie gaz_day

 

j'ai bien les données dans la table gaz_day (2 données) mais la somme est ok

par contre sur l'affichage j'ai un page blanche - j'ai pas le please wait, mais juste le titre, gaz en ordonnée et une ligne en abscisse mais pas mes données

 

grave docteur ?

Partager ce message


Lien à poster
Partager sur d’autres sites

mmmmmmmmmmm je pense qu'il faut faire la même manip que tu as déjà fait dans le data_get.php mais pour le gaz_day.

Partager ce message


Lien à poster
Partager sur d’autres sites

oué c'est la ou je comprends plus; cf discussion d'hier

 

j'avais deja ca dans le get data.php

//*** Get data
	if ( isset($_GET['query']) && $_GET['query']=='dataserie' ) {
		$type   = filter_input(INPUT_GET, 'type',   FILTER_SANITIZE_STRING);
		$device = filter_input(INPUT_GET, 'device', FILTER_SANITIZE_NUMBER_INT);
		if (substr($type, -4) == '_day') {
			if ( $type == 'gaz_day' )
				$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, sum_value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
			if ( $type == 'water_day' )
				$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, sum_value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
			

mais ca marche pas

 

 

la console JS

 

Load data from type : gaz_day
graph.js:176 Load data from device : 0 7999,Gaz Jardin,
graph.js:34 Courbe Gaz Jardin: type = line
graph.js:57 Chart loaded
graph.js:141 display chart
192.168.0.91/:1 Error in event handler for (unknown): TypeError: Cannot read property 'database' of undefined
    at chrome-extension://dbpclfjlnaeaejebnjdeadlafkmkldgl/contentscript.bin.js:500:33

 

Modifié par Sakkhho

Partager ce message


Lien à poster
Partager sur d’autres sites

à priori ça semble OK

sauf le dernier message de la console Javascript, mais je ne suis pas certain que ça soit en lien avec ton graph.

Partager ce message


Lien à poster
Partager sur d’autres sites

Toujours un truc que j ai du mal à comprendre.
Il t a semblé hier que je voulais affiché gaz_day mais ç était gaz
J ai quand même fait la modif dans le get data et ç était ok.
Donc j ai du mal à saisir.

Partager ce message


Lien à poster
Partager sur d’autres sites

moi aussi j'ai du mal à saisir, car je te guide un peu en aveugle, sans regarder le code, et je ne sais pas quelles sont les modules que tu as faites !!!

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello

 

J'ai une Erreur "Assertion Failed" avec les Devices. Donc je n'ai aucun devices qui s'affichent dans Graph.

Quelqu'un peut m'aider?

 

Salutations

 

Speedoxx007

 

Error_Device.PNG

Partager ce message


Lien à poster
Partager sur d’autres sites

A tout hasard, aurais-tu une station Netatmo ? Auquel cas il faut que tu fasses les modifs des boutons Sensors et Devices qui sont documentées quelque part dans les dernières pages.

 

Sinon, active debug = true et regarde ce que ça raconte en détail.

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello

 

Oui j'ai une station Netatmo. debug = true déjà activé. Je n'ai rien de plus. Je vais chercher dans ces pages la modif. pour netatmo.

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

 

A l'étape 3.2 Base de données SQL

 

lorsque je lance la commande : 

  • http://192.168.0.20/graph/install.php

J'ai le message 500 Une erreur s'est produite lors du traitement de cette demande. 192.168.0.20 étant mon serveur Synology.

 

Vous auriez une idée de ce que j'ai manqué ?

Partager ce message


Lien à poster
Partager sur d’autres sites

@speedoxx007 le patch trouvé par Steven va corriger ton problème avec la station netatmo

 

@MAM78 alors là je ne sais pas, tu a surement raté une étape précédente du tuto, mais là comme ça je ne peux pas te dire.

Partager ce message


Lien à poster
Partager sur d’autres sites
Le ‎24‎.‎05‎.‎2016 à 15:31, Steven a dit :

J'ai juste ajouté 


id = tonumber(id)

à  la ligne 213 juste avant


local deviceName = fibaro:getName(id)
local roomID = fibaro:getRoomID(id)

 

Trouvé est ça fonctionne. Super cet outil.

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai copié le dossier graph (sous mac avec le finder) à la racine du partage /web de mon serveur Synology. soit /web/graph

 

Est-ce bien ici qu'il faut le copier ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Super ca marche :13:

 

J'ai eu également le problème sur l'erreur sur le bouton Device (j'ai également une Netatmo Weather Station) :

line 213: Assertion failed

Corrigé avec l'insertion de la commande ci-dessous sur le ligne qui précède l'erreur :

 

"id = tonumber(id)"

 

Mes données remontent bien dans DomoCharts. Vous être impressionnant :74:

 

Au passage, j'ai constaté que mes batteries sur mes détecteurs de fumées Figaro sont quasi à 50% alors qu'ils n'ont qu'une semaine. Achetés sur le site d'Orange.

A suivre dans la durée pour voir s'ils étaient déjà déchargés à l'achat ou s'ils se vident à vitesse grand V.

Partager ce message


Lien à poster
Partager sur d’autres sites

Tant mieux si ça fonctionne :)

 

Oui le problème des batteries des modules achetés chez Orange est bien connu, ils ont acheté un stock monumental à Fibaro, et ils le vident au moment des soldes, donc 2 fois par an, le reste du temps ils ne doivent pas en vendre des masses... donc les piles s'usent, et on ne connait pas les conditions de stockage (froid, chaud, etc)

 

En plus de ça, le détecteur de fumée Fibaro, comme d'autres modules (détecteur d'ouverture, détecteur de mouvement, ...) ont une très mauvaise gestion de la capacité de la batterie.

Tu verras sur les graphs que la décroissance n'est pas du tout linéaire, et que parfois le module s'arrête de fonctionner alors que la pile était encore entre 30 à 50% de capacité estimée. Donc pas fiable.

Partager ce message


Lien à poster
Partager sur d’autres sites

@LazerMerci pour tes infos. Ca tombe bien, j'ai justement acheté pour le moment exactement les types de modules que tu cites. A suivre.

Partager ce message


Lien à poster
Partager sur d’autres sites

bon j'ai regardé un peu partout je comprends pas pourquoi j'arrive pas à affiche le graph_day

 

comment je vois ce qu'il va chercher;

car est ce qu'il tenterait de prendre le graph_month ?

 

c'était ta remarque de l'autre jour quand j'avais une erreur dans la console 

tu disais, tu tente d'afficher le graph-day alors que c'était le celui du jour

donc si ici je tente de plotter gprah_month, ca expliquerai qu'il y a rien car j'ai pas de values dans la table ...

Partager ce message


Lien à poster
Partager sur d’autres sites

Faudrait que tu commences ton tuto avec toutes tes modifications, ça me permettrait de comprendre ce que tu as fait et de t'aiguiller sur la solution.

Partager ce message


Lien à poster
Partager sur d’autres sites

voici les étapes que j'ai suivi pour  avoir le révélé de gaz du NorthQ dans Domocharts

 

1/

Via phpadmin, Dupliquer les tables Water, water_day, water_month, en  gaz, gaz_day, gaz_month

Passer la donnée value en décimale 5,2 et modifier les entrées de la table day et month de facon à avoir cela 

 

table gaz

615736Sanstitre2.png

 

table gaz_day

757375Sanstitre2.png

 

 

2/

Modification index.php en rajoutant les lignes suivantes

			<option value="gaz">Gaz [m3] </option> -->
			<option value="gaz_day">Gaz [m3] (moyenne journalière)</option> -->
			<option value="gaz_month">Gaz [m3] (moyenne mensuelle)</option> -->

3/

Modification config.js en rajoutant

	{type:'gaz', title: "Consommation de gaz", yaxis: 'Gaz (m3)', tooltip: 'm3', min: 0},
	{type:'gaz_day', title: "Historique de consommation de gaz (total journalier)", yaxis: 'Gaz (m3)', tooltip: 'm3', min: 0},
	{type:'gaz_month', title: "Historique de consommation de gaz (total mensuel)", yaxis: 'Gaz (m3)', tooltip: 'm3', min: 0},

4/

VD bouton device, rajouter 

local variables = {
    {
        ["type"] = "gaz",
        ["id"]   = 7999,
        ["name"] = "Gaz",
        ["room"] = 11 -- Jardin
    }
}

"id" = un numero qui ne rentrera pas en conflit avec vos autres devices

"room" = un id d'une piece de votre HC2

 

 

Ajouter dans le VD un nouveau bouton "Gaz" avec le code suivant

--------------------------------------------------
-- Button  : 7 => Gaz :
-- Author  : Lazer
-- Version : 5.0
-- Date    : Feb 2017
--------------------------------------------------

-- User Global Variables
local variables = {
    {
        ["type"] = "gaz",
        ["id"]   = 7999,
        ["name"] = "gasHour"
    }
}

-- System variables
local debug = false
local selfID = fibaro:getSelfId()
local ip = fibaro:get(selfID, 'IPAddress')
local port = fibaro:get(selfID, 'TCPPort')
local NAS = Net.FHttp(ip, tonumber(port))
local erreur = 0
local sensors = {}

-- Send data to NAS (SQL DB)
function SendDataNAS (datas)
	if debug then
		fibaro:debug(json.encode(datas))
	end
	if #datas > 0 then
		local payload = "/graph/data_post.php"
		local response, status, errorCode = NAS:POST(payload, json.encode(datas))
		if tonumber(errorCode) == 0 and tonumber(status) == 200 and response ~= nil and response ~= "" then
			jsonTable = json.decode(response);
			if jsonTable.success ~= true then
				erreur = erreur + 1
				fibaro:debug('<span style="display:inline;color:red;">Error '..(jsonTable.error and jsonTable.error.code or "???")..' : '..(jsonTable.error and jsonTable.error.message or "???")..'</span>')
			elseif debug then
				fibaro:debug('<span style="display:inline;color:green;">OK : '..(jsonTable.rowcount or "???")..' lines inserted in DB</span>')
			end
		else
			erreur = erreur + 1
			fibaro:debug('<span style="display:inline;color:red;">Error : Can not connect to NAS, errorCode='..errorCode..', status='..status..', payload='..payload..', response='..(response or "")..'</span>')
		end
	end
end

-- Get HC2 software version
local HC2 = Net.FHttp("127.0.0.1", 11111)
payload = "/api/settings/info"
response, status, errorCode = HC2:GET(payload)
if tonumber(errorCode) == 0 and tonumber(status) == 200 and response ~= nil and response ~= "" then
	jsonTable = json.decode(response)
	if tonumber(jsonTable.softVersion) >= 4 then
		version = 4
	else
		version = 3
	end
	if debug then
		fibaro:debug("v"..version)
	end
end

-- Get User Variable list (updated from FHEM through API)
datas = nil
local datas = {}
for i = 1, #variables do
	payload = "/graph/data_post_" .. variables[i].type .. ".php?id=" .. variables[i].id .. "&value=" .. fibaro:getGlobalValue(variables[i].name)
	datas[#datas+1] = {}
	datas[#datas].id = variables[i].id
	datas[#datas].timestamp = 'NULL'
	datas[#datas].type = variables[i].type
	datas[#datas].value = fibaro:getGlobalValue(variables[i].name)
end
-- Send data to NAS
SendDataNAS(datas)

if erreur > 0 then
	fibaro:log("Erreur")
else
	fibaro:log("Gas uploaded")
end

5/

Ensuite il faut modifier la scene graph en modifiant la partie suivante

	-- Actions to perform every new hour
	local newhour = os.date('%H')
	if newhour ~= hour then
		fibaro:debug('New hour')
    	fibaro:call(VirtualDeviceID, "pressButton", "7"); -- Gaz

 

6/

data_post.php, rajouter

 

				case 'gaz':
				if ($timestamp) {
					$SQLqueries[$type] = 'INSERT IGNORE INTO domotique_'.$type.' (time, device_id, value) VALUES ';
					$SQLvalues[$type]['timestamp'.$key] = $timestamp;
					$SQLvalues[$type]['id'       .$key] = $id;
					$SQLrows[$type][] = '(FROM_UNIXTIME(:timestamp'.$key.'),:id'.$key.',:value'.$key.')';
				}
				elseif ($date) {
					//$SQLqueries[$type] = 'INSERT INTO domotique_'.$type.'_day (date, device_id, value) VALUES ';
					$SQLqueries[$type] = 'INSERT IGNORE INTO domotique_'.$type.'_day (date, device_id, sum_value) VALUES ';
					$SQLvalues[$type]['date'.$key] = $date;
					$SQLvalues[$type]['id'  .$key] = $id;
					$SQLrows[$type][] = '(:date'.$key.',:id'.$key.',:value'.$key.')';
				}
				else
					throw new Exception('No date value for gaz data type', 7);
				if ( isset($row->value) && is_numeric($row->value) )
					$SQLvalues[$type]['value'.$key] = $row->value;
				else
					throw new Exception('Invalid JSON data', 5);
				break;
	

 

7/

Data_get.php rajouter dans la partie "day"

	elseif ( $type == 'gaz_day' )
			$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, sum_value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
		

et dans la partie "month"

	elseif ( $type == 'gaz_month' )
		$query = "SELECT UNIX_TIMESTAMP(CONCAT(year,'-',month,'-01 00:00:00'))*1000 AS time, sum_value FROM domotique_".$type.' WHERE device_id = :device ORDER BY time';
		

8/

et enfin dans le generate_trends.php rajouter

	//*** Gaz
	$bdd->prepare("
		INSERT INTO domotique_gaz_day (date, device_id, min_value, sum_value, max_value)
		SELECT
			DATE(time) AS date,
			device_id as device_id,
			MIN(value) AS min_value,
			SUM(value) AS sum_value,
			MAX(value) AS max_value
		FROM
			domotique_gaz
		WHERE
			DATE(time) > ( SELECT COALESCE(MAX(`date`), '0001-01-01') FROM domotique_gaz_day )
			AND DATE(time) < CURDATE()
		GROUP BY
			date,
			device_id
	")->execute();
	$bdd->prepare("DELETE FROM domotique_gaz WHERE DATE(time) < SUBDATE(CURDATE(), 21)")->execute();
	$bdd->prepare("OPTIMIZE TABLE domotique_gaz")->execute();
	$bdd->prepare("
		INSERT INTO domotique_gaz_month (year, month, device_id, min_value, min_day_value, sum_value, max_day_value, max_value)
		SELECT
			YEAR(DATE),
			MONTH(date),
			device_id,
			MIN(min_value),
			MIN(avg_value),
			SUM(avg_value),
			MAX(avg_value),
			MAX(max_value)
		FROM
			domotique_gaz_day
		WHERE
			date > (SELECT COALESCE(MAX(LAST_DAY(STR_TO_DATE(CONCAT(year,',',month,',',1),'%Y,%m,%d'))), '0001-01-01') FROM domotique_gaz_month)
			AND date < DATE_FORMAT(CURRENT_DATE, '%Y/%m/01')
		GROUP BY
			YEAR(DATE),
			MONTH(date),
			device_id
	")->execute();	

 

9/

Importer le VD ci dessous (credit JOOMBA sur le fofo officiel) que j'ai modifié/simplifié à ma sauce

suffit de mettre l'ID du northQ dedans, et le champ IP de la HC2 "127.0.0.1"

 

10/

Enfin GEA ...

    GEA.add(true , 60, "",{{"VirtualDevice", id["CONSOMMATION_GAZ"], 5},{"Repeat"}}) -- Remontée Conso Gaz

 

 

Merci à Lazer.

 

 

VD :

Consommation_Gaz.vfib

585b1c38e1966_ENERGYMETER.png.05ae3fa36bafff1aa9887a44b3917f62.png.82e0b7d40c322619c4ea014242d76059.png

Modifié par Sakkhho
  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci c'est super clair.

 

J'ai eu du mal à comprendre l'erreur, mais je crois que j'ai trouvé.

Dans data_get.php, ce n'est pas un if, mais un elseif qu'il faut utiliser, comme ceci (bloc '_day' complet pour une meilleure compréhension de la condition dans le bloc) :

 

		if (substr($type, -4) == '_day') {
			if ( $type == 'water_day' )
				$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, sum_value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
			elseif ( $type == 'rain_day' )
				$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, sum_value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
			elseif ( $type == 'energy_day' )
				$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, hc_value+hp_value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
			elseif ( $type == 'battery_day' )
				$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
			elseif ( $type == 'gaz_day' )
				$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, sum_value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
			else
				$query = 'SELECT UNIX_TIMESTAMP(date)*1000 AS time, avg_value FROM domotique_'.$type.' WHERE device_id = :device ORDER BY time';
			$data['device'] = $device;
		}

 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×