[LUA] Gestion conso et stock pellets

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Snorky
Messages : 79
Inscription : 02 oct. 2016, 22:13

[LUA] Gestion conso et stock pellets

Message 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) :? .
DomoticzVersion: V3.8153, CustomPage, GoogleHome
Pi3 Modèle B + RFXCom + Razberry
RFX: Sonde OREGON THGR122, Capteur ouverture Trust AMST-606, Compteur conso OWL Micro+ CM180
ZWave: FGMS001
rombeau54
Messages : 22
Inscription : 04 oct. 2016, 14:53

Re: Gestion conso et stock pellets

Message par rombeau54 »

Bonjour,

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

Merci !
Snorky
Messages : 79
Inscription : 02 oct. 2016, 22:13

Re: Gestion conso et stock pellets

Message par Snorky »

c'est un CMG
DomoticzVersion: V3.8153, CustomPage, GoogleHome
Pi3 Modèle B + RFXCom + Razberry
RFX: Sonde OREGON THGR122, Capteur ouverture Trust AMST-606, Compteur conso OWL Micro+ CM180
ZWave: FGMS001
sylvain

Re: Gestion conso et stock pellets

Message 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
baboun2807
Messages : 40
Inscription : 30 déc. 2015, 23:43

Re: Gestion conso et stock pellets

Message 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?
Domoticz sur Raspberry Pi 2/ ECO DEVICE / compteur d'eau à impulsion / Plusieurs sondes Oregon / Chacon ON/OFF encastrable CH54555 ou CH54755
Snorky
Messages : 79
Inscription : 02 oct. 2016, 22:13

Re: Gestion conso et stock pellets

Message 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 ?
DomoticzVersion: V3.8153, CustomPage, GoogleHome
Pi3 Modèle B + RFXCom + Razberry
RFX: Sonde OREGON THGR122, Capteur ouverture Trust AMST-606, Compteur conso OWL Micro+ CM180
ZWave: FGMS001
mickaelr30
Messages : 210
Inscription : 29 août 2015, 15:57

Re: Gestion conso et stock pellets

Message 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 ?
Domoticz + Imperihome + Mydomoathome
1-wire : 12 DS18b20 + 3 DS2413
Z-Wave : 8 FGR221 + 3 FGS222 + 3 FGSD002
téléinfo : 2 modules ( consommation + production)
Mysensors+2 éclairages ws2812 et WLED
2 caméra IP +1 raspberry piscine + 1 nuc domoticz
Snorky
Messages : 79
Inscription : 02 oct. 2016, 22:13

Re: Gestion conso et stock pellets

Message 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.
DomoticzVersion: V3.8153, CustomPage, GoogleHome
Pi3 Modèle B + RFXCom + Razberry
RFX: Sonde OREGON THGR122, Capteur ouverture Trust AMST-606, Compteur conso OWL Micro+ CM180
ZWave: FGMS001
Nibeck
Messages : 19
Inscription : 01 oct. 2015, 14:01
Localisation : Belgique

Re: Gestion conso et stock pellets

Message 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 ?
- Raspberry Pi 2 - SDCard 16Go - OS Dietpi - Domoticz - RFXCom RFXtrx433E USB - Prises Chacon Dio - Sondes de Temperatures/humiditer - Détecteur de Mouvement IR
Snorky
Messages : 79
Inscription : 02 oct. 2016, 22:13

Re: Gestion conso et stock pellets

Message 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é.
DomoticzVersion: V3.8153, CustomPage, GoogleHome
Pi3 Modèle B + RFXCom + Razberry
RFX: Sonde OREGON THGR122, Capteur ouverture Trust AMST-606, Compteur conso OWL Micro+ CM180
ZWave: FGMS001
Répondre