Page 1 sur 2

[LUA] Gestion conso et stock pellets

Publié : 30 nov. 2016, 22:17
par Snorky
Bonjour,

Disposant d'un poêle à pellets, je souhaitais :
- Suivre ma consommation
- Suivre mes dépenses de pellets
- Suivre mon stock
- Etre alerté en cas de stock trop bas

Création des variables utilisateurs

Image

- stockPellet1 (Entier) : stock de pellet en cours de consommation
- stockPellet2 (Entier) : stock de pellet de réserve, servira en cas de modification de tarif
- prixSac1 (Décimal) : prix du sac de pellet du stock en cours de consommation
- prixSac2 (Décimal) : prix du sac de pellet du stock de réserve

Si je dois racheter des sacs en cours de saison et si les prix ont varié, cela me permet de suivre précisément mes dépenses.

Création des Virtual device

- ConsoPellet : Counter
- DepensePellet : Counter
- AjoutSac : Switch, Mettre le délai d'extinction à au moins une seconde pour que l'interrupteur repasse automatiquement à Off
- Alerte

Image

Image

Création des scripts LUA

script_device_pellet.lua

Code : Tout sélectionner

-- Version : 20161006_01
-- Author : Snorky
-- Update conso, stock et depense pellet

--------------------------------
-- Variable a editer -----------
--------------------------------
local ajoutSacName = 'AjoutSac' -- Nom virtual device switch pour ajouter un sac
local consoIdx = 27 -- IDX virtual device de consommation de pellets
local consoName = 'ConsoPellet' -- Nom virtual device de consommation de pellets
local stock1Name = 'stockPellet1' -- Nom user variable du stock de pellets en cours de consommation
local depenseIdx = 28 -- IDX virtual device de depense de pellets
local depenseName = 'DepensePellet' -- Nom virtual device de depense de pellets
local prix1Name = 'prixSac1' -- Nom user variable du prix du stock en cours de consommation
--------------------------------
-- Fin des variables a editer --
--------------------------------

--------------------------------
-- Fonctions                  --
--------------------------------

-- TimeDifference
function timedifference(d)
	s = otherdevices_lastupdate[d]
	year = string.sub(s, 1, 4)
	month = string.sub(s, 6, 7)
	day = string.sub(s, 9, 10)
	hour = string.sub(s, 12, 13)
	minutes = string.sub(s, 15, 16)
	seconds = string.sub(s, 18, 19)
	t1 = os.time()
	t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
	difference = os.difftime (t1, t2)
	return difference
end


commandArray = {}

if (devicechanged[ajoutSacName] and otherdevices[ajoutSacName] == 'On') then     -- Si interrupteur AjoutSac = On
	 
	timedifference(consoName)

	if (difference > 600) then    -- On attend 10 minutes avant ajout nouveau sac
	
		-- Update conso --
		consoNew = tonumber(otherdevices_svalues[consoName]) + 1
		commandArray[1] = {['UpdateDevice'] = consoIdx.. '|0|' .. tostring(consoNew)}
		print('Consommation totale : '..consoNew)

		-- Update depense --
		depenseNew = tonumber(otherdevices_svalues[depenseName]) + tonumber(uservariables[prix1Name])
		commandArray[2] = {['UpdateDevice'] = depenseIdx .. '|0|' .. tostring(depenseNew)}
		print('Depense pellet : '..depenseNew..' euros')

		-- Update stock --
		stockNew = tonumber(uservariables[stock1Name]) - 1
		commandArray[3] = {['Variable:'..stock1Name] = tostring(stockNew)}
		print('Nouveau stock de pellet : '..stockNew)


	else
		differencemin = math.floor(difference / 60)
		print('Dernier update de la consommation de pellet il y a moins de 10 minutes ('..differencemin..' min).')
	end

end

return commandArray	
script_variable_stock_pellet.lua

Code : Tout sélectionner

-- Version : 20161006_01
-- Author : Snorky
-- Gestion du stock de pellet

--------------------------------
-- Variable a editer -----------
--------------------------------
local stock1Name = 'stockPellet1' -- Nom user variable du stock de pellets en cours de consommation
local stock2Name = 'stockPellet2' -- Nom user variable du stock de pellets de reserve
local prix1Name = 'prixSac1' -- Nom user variable du prix du stock en cours de consommation
local prix2Name = 'prixSac2' -- Nom user variable du prix du stock de reserve
--------------------------------
-- Fin des variables a editer --
--------------------------------

commandArray = {}

if (uservariablechanged[stock1Name]) then
	-- Gestion du stock --
	if (tonumber(uservariables[stock1Name])==0) then
		stockReserve = tostring(uservariables[stock2Name])
		commandArray[1] = {['Variable:'..stock1Name] = stockReserve}
		commandArray[2] = {['Variable:'..stock2Name] = '0'}
		commandArray[3] = {['Variable:'..prix1Name] = tostring(uservariables[prix2Name]}
		print('Nouveau stock de pellet : '..stockReserve..' sacs')
	end
end

return commandArray	
Création de l'alerte
Alerte sous forme de blocky
Image

Code : Tout sélectionner

<IP:Port>/json.htm?type=command&param=udevice&idx=12&nvalue=4&svalue=AlertePellet
<IP:Port>/json.htm?type=command&param=udevice&idx=12&nvalue=2&svalue=AlertePellet
<IP:Port>/json.htm?type=command&param=udevice&idx=12&nvalue=1&svalue=AlertePellet
<IP:Port>/json.htm?type=command&param=udevice&idx=12&nvalue=0&svalue=AlertePellet
IDX=12 correspond à mon device Alerte

Conclusion
Ce script est largement améliorable.
On peut par exemple ajouter une variable "debug = true/false" pour afficher ou non les messages dans la log.
Le code en lui même est certainement optimisable.

Il répond à mon besoin mais probablement pas au votre.

Mon interrupteur est actionnable depuis l'interface Domoticz (forcément... :D ), de la custom page (merci Vil1Driver 8-) ) et de mon Amazon Dash Bouton quand je ne veux pas allumer la tablette.

N'hésitez pas à me faire vos retours (c'est mon premier tuto, soyez indulgent) :? .

Re: Gestion conso et stock pellets

Publié : 05 déc. 2016, 08:47
par rombeau54
Bonjour,

Quelle est la marque de ton poêle à pellets ?

Merci !

Re: Gestion conso et stock pellets

Publié : 05 déc. 2016, 19:26
par Snorky
c'est un CMG

Re: Gestion conso et stock pellets

Publié : 22 déc. 2016, 23:03
par sylvain
Bonjour

Un grand Merci.

Ça fonctionne impect.

Je regarde demain pour ajouter un virtual divice avec le stock total pour avec un vision dans mon Dashboard ...

Merci
Sylvain

Re: Gestion conso et stock pellets

Publié : 07 janv. 2017, 13:21
par baboun2807
Bonjour
Chez moi cela ne fonctionne pas..... :(

Le log me renvoie :

EventSystem: in /home/pi/domoticz/scripts/lua/script_device_pellet.lua: /home/pi/domoticz/scripts/lua/script_device_pellet.lua:55: attempt to perform arithmetic on a nil value

Ma ligne 55:
depenseNew = tonumber(otherdevices_svalues[depenseName]) + tonumber(uservariables[prix1Name])

Je pense que le pb se situe au niveau de depenseName qui est le nom du virtuel device pour comptabiliser la dépense en pellet. Au départ ce compteur est bien à zéro, ce qui est logique. Mais je ne vois pas comment résoudre cela. Any ideas?

Re: Gestion conso et stock pellets

Publié : 07 janv. 2017, 14:48
par Snorky
Ton device dépense existe bien chez toi ?
Idem pour la variable utilisateur du prix ?

si tu essaies de logger ces valeurs, ça te renvoie quoi ?

Re: Gestion conso et stock pellets

Publié : 11 janv. 2017, 23:01
par mickaelr30
est-ce-que le device depense pellet compte immédiatement ou bien il se met à jour au bout de plusieurs actions car je viens de compter un sac mais le montant est toujours à 0 ?

Re: Gestion conso et stock pellets

Publié : 12 janv. 2017, 07:11
par Snorky
Méfie toi il y a un décalage entre la console jour et la consommation totale dans les devises compteur.

Tu devrais le voir maintenant.

Re: Gestion conso et stock pellets

Publié : 18 janv. 2017, 16:25
par Nibeck
Bonjour,

J'ai un petit soucis avec le compteur DepensePellet, mon prix du sac et de 4.60, et le compteur prend une valeur de 5, cela fausse complètement le résultat du coup.
Auriez vous une idée ?

Re: Gestion conso et stock pellets

Publié : 18 janv. 2017, 16:34
par Snorky
C'est juste un problème d'affichage des décimales.
Les décimales sont bien prises en compte (j'ai le même phénomène).

Quand tu auras consommé 2 sacs, il affichera 9€ mais en base c'est bien 9,20€ qui sera stocké.