Aller au contenu

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


Lazer

Messages recommandés

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
Lien vers le commentaire
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.

Lien vers le commentaire
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 ?

Lien vers le commentaire
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
Lien vers le commentaire
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.

Lien vers le commentaire
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é ?

Lien vers le commentaire
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.

Lien vers le commentaire
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
Lien vers le commentaire
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.

Lien vers le commentaire
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.

Lien vers le commentaire
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 ...

Lien vers le commentaire
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
Lien vers le commentaire
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
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...