Compteur virtuel pour CM180i

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
matteocfr
Messages : 3
Inscription : 17 janv. 2017, 21:57

Compteur virtuel pour CM180i

Message par matteocfr »

Bonjour à tous,

Mon installation est la suivante:
1 raspberry, domoticz dessus (dernière maj effectuée), rfxcom branché (dernier firmware) avec comme périphérique plusieurs sondes oregons et 1 émetteur CM180i d'OWL avec 3 pinces ampèremétriques (il permet d'envoyer 3 valeurs de façon séparé).

Après plusieurs heures de recherche et étant newbie en script LUA, j'ai un problème insoluble (pour moi je relativise!!!):
Mon émetteur CM180i est bien vu par Domoticz, détecté par un type Current/energy, lorsque je regarde le graphe de celui-ci je peux voir 3 courbes correspond au 3 pinces. J'aimerais avoir 3 compteurs (virtuel?) séparés correspondants aux 3 pinces avec les fonctions instantannée et totaliseur.
Comment faire?

Émetteur détecté:
Image

Voici le graphe en question:
Image

Je me doute que la solution a déjà été traitée mais j'ai pas réussi à l'attraper.

Merci par avance
matteocfr
Messages : 3
Inscription : 17 janv. 2017, 21:57

Re: Compteur virtuel pour CM180i

Message par matteocfr »

Salut à tous,

après avoir continué à chercher, je suis arriver à un script qui me convient.
Voici ma solution pour d'autres "galériens".

Il faut créer:
- 3 compteurs virtuels de type "instantanée et compteur" et récupérer leurs IDX en mode graphique via Domoticz
- 3 variables utilisateurs de type "entier" (pour moi totalP1, totalP2 et totalP3) en mode graphique via Domoticz
- 1 variable utilisateur de type "chaîne" (pour moi lastupdate) en mode graphique via Domoticz
- créer un fichier de nom script_device_VOTRENOM.lua
- y coller le code suivant (en modifiant pour vos données, IDX,...)

Code : Tout sélectionner

--script permettant des lires des donnees de sonde OWL et de remplir des compteurs virtuels (instantannée et total)
-- Initialisation des variables locales
local totalP1 = uservariables['totalP1']
local totalP2 = uservariables['totalP2']
local totalP3 = uservariables['totalP3']
local lastupdate = uservariables['lastupdate']

commandArray = {}

if devicechanged['Sondes - OWL'] then
    
	function timedifference (s)
		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
	
	--on recupere la date d'execution du script
		update = (otherdevices_lastupdate['Sondes - OWL'])
		--print(update)
	
	--on calcule l'intervalle de temps en secondes entre deux executions du script
		intervalle = timedifference(lastupdate)
		--print(intervalle)
	
    --on recupere les valeurs en Amperes des sondes OWL
		l1, l2, l3 = string.match(otherdevices_svalues['Sondes - OWL'], "(%d+.%d*);(%d+.%d*);(%d+.%d*)")
		--print(l1)
		--print(l2)
		--print(l3)
	--on les transforme en Watt
		p1 = l1 * 230
		--print(p1)
		p2 = l2 * 230
		--print(p2)
		p3 = l3 * 230
		--print(p3)
	
	--on calcule le delta (entier) en Wh a aujouter au compteur total
		deltaP1 = math.floor(p1/3600*intervalle)
		--print(deltaP1)
		deltaP2 = math.floor(p2/3600*intervalle)
		--print(deltaP2)
		deltaP3 = math.floor(p3/3600*intervalle)
		--print(deltaP3)
	
	--on incremente les compteurs totaux
		totalP1 = deltaP1 + totalP1
		totalP2 = deltaP2 + totalP2
		totalP3 = deltaP3 + totalP3
		--print(totalP1)
		--print(totalP2)
		--print(totalP3)
		
	--mise a jour variablees locales
		commandArray['Variable:totalP1'] = tostring(totalP1)
		commandArray['Variable:totalP2'] = tostring(totalP2)
		commandArray['Variable:totalP3'] = tostring(totalP3)
		commandArray['Variable:lastupdate'] = tostring(update)
	
	--on exporte les donnees P et totalP vers les compteurs virtuels
		p1 = tonumber(p1)
		totalP1 = tonumber(totalP1)
		commandArray[1]={['UpdateDevice']= 50 .. "|0|" .. p1 .. ';' .. totalP1 }
		
		p2 = tonumber(p2)
		totalP2 = tonumber(totalP2)
		commandArray[2]={['UpdateDevice']= 55 .. "|0|" .. p2 .. ';' .. totalP2 }
		
		p3 = tonumber(p3)
		totalP3 = tonumber(totalP3)
		commandArray[3]={['UpdateDevice']= 56 .. "|0|" .. p3 .. ';' .. totalP3 }
		
end
return commandArray
Si vous voyez des améliorations, faites signe.
naerleth
Messages : 38
Inscription : 14 déc. 2016, 14:25

Re: Compteur virtuel pour CM180i

Message par naerleth »

Hello !

Moi, ça m’intéresse carrément, j'installe la même chose dans 15 jours :)

Quelques questions peut-être un peu naïves :
- 50/55/56 ce sont tes IDX ?
- Un p'tit screenshot pour voir le rendu ?
- Le but est d'avoir un compteur par phase, c'est ça ? Tu as une logique derrière pour détecter un déséquilibre dans tes phases ? Ou un délestage par phase ?
- Et donc, ton CM180i permet grâce à l'achat de 2 pinces en plus, de suivre du triphasé, c'est bien ça ? Ce sont ces pinces là ? https://www.amazon.fr/dp/B003QJTS3W/

Merci :)
matteocfr
Messages : 3
Inscription : 17 janv. 2017, 21:57

Re: Compteur virtuel pour CM180i

Message par matteocfr »

Salut,

- 50/55/56 sont bien mes IDX

- voici le rendu
Image

- mon but est "d'isoler" la consommation de différents départs de mon installation électrique. Donc pour affiner encore plus je suis en train de modifier mon script afin de remplir 3 compteurs électriques intelligents virtuels.

- j'ai acheter un module CM180i (reference site web:TSE200-001) et 3 pinces OWL (reference site web:TSE000-001) sur pla****-domo*****.com.
Le site est le 1° lien sur google pour la recherche TSE200-001. Le matériel est reconnu par un RFXcom 433 ou 433E sans problème.
aleph0
Messages : 328
Inscription : 27 avr. 2016, 08:06
Localisation : Hérault (34)

Re: Compteur virtuel pour CM180i

Message par aleph0 »

Bonjour,

Je me suis penché sur ce problème, avec le même matériel. La solution que tu propose à un point faible : elle ignore tout ce qui se passe entre deux réception de l'ampérage. Pour être sûr de ne rien perdre, il ne faut pas lire sur l'ampérage mais sur la puissance consommée. Celle là est mise à jour par l'owl et, si on perds une trame, l'information ratée sera contenue dans la trame suivante.

La difficulté avec le 180i, c'est qu'on ne connaît la puissance consommée que pour le total des 3 phases, on ne l'a pas par phase. On ne peut donc pas avoir 3 compteurs rigoureusement exact, seulement des estimations. Une façon plus fiable de faire ces estimations est de lire la puissance totale et de la répartir ensuite sur les 3 phases selon les proportions lues sur les ampérages par phases... On aura une petite erreur sur les compteurs individuels mais au moins le total des trois sera exact

Ensuite, si on veut pouvoir remonter aux coûts par phases en tenant compte du tarif de nuit, il faut utiliser des P1 Smart counter au lieu des compteurs simples

C'était mes 2 centimes ;-)
VinceR67
Messages : 1
Inscription : 19 oct. 2017, 08:16

Re: Compteur virtuel pour CM180i

Message par VinceR67 »

Merci matteocfr pour ce post, j'ai exactement le même matériel :D
J'ai tenu compte des remarques de aleph0, notamment la répartition des 3 phases en fonction de l'ampérage, et je propose le script suivant.
Une différence cependant est que je ne calcule pas l'énergie avec le temps écoulé depuis le dernier script, mais simplement avec la valeur du dernier script, qui nécessite donc une uservariable supplémentaire, soit 4 en tout.

Code : Tout sélectionner

-- scripts/lua/script_device_sondes_owl.lua

commandArray = {}

local THIS_DEVICE_NAME = 'Sondes OWL' -- device name with type 'Current/Energy' and subtype 'CM180i'

if devicechanged[THIS_DEVICE_NAME] then

  -- define the custom values
  local ENERGY_DEVICE_NAME = 'Total OWL'  -- device name with type 'Energy' and subtype 'CM180'
  local ENERGY_VARIABLE = 'OwlEnergy'     -- user variable as float
  local ENERGY_VARIABLE_1 = 'OwlEnergy1'  -- user variable as float
  local ENERGY_VARIABLE_2 = 'OwlEnergy2'  -- user variable as float
  local ENERGY_VARIABLE_3 = 'OwlEnergy3'  -- user variable as float
  local ELECTRIC_SENSOR_INDEX_1 = 17      -- Maison
  local ELECTRIC_SENSOR_INDEX_2 = 16      -- Voiture
  local ELECTRIC_SENSOR_INDEX_3 = 15      -- Piscine

  -- get rate (a float from 0 to 1) of given current
  local function GetCurrentRate(current)
    return current / (current1 + current2 + current3)
  end

  -- get energy offset (Wh) from this script value and the previous one
  local function GetEnergyOffset()
    return energy - uservariables[ENERGY_VARIABLE]
  end

  -- set energy user variable with rated energy (Wh)
  local function SetEnergyVariable(name, current)
    commandArray['Variable:' .. name] = tostring(GetCurrentRate(current) * GetEnergyOffset() + uservariables[name])
    return
  end

  -- update electric virtual sensor with rated power (W) and energy (Wh)
  local function UpdateElectricDevice(idx, current, energy)
    commandArray[idx] = { ['UpdateDevice'] = idx .. "|0|" .. GetCurrentRate(current) * power .. ";" .. energy }
    return
  end

  -- get values from devices
  current1, current2, current3, energy = devicechanged[THIS_DEVICE_NAME]:match("([^;]+);([^;]+);([^;]+);([^;]+)")
  power = otherdevices_svalues[ENERGY_DEVICE_NAME]:match("([^;]+);([^;]+)") -- second captured value unused

  -- set computed values to device 1
  SetEnergyVariable(ENERGY_VARIABLE_1, current1)
  UpdateElectricDevice(ELECTRIC_SENSOR_INDEX_1, current1, uservariables[ENERGY_VARIABLE_1])

  -- set computed values to device 2
  SetEnergyVariable(ENERGY_VARIABLE_2, current2)
  UpdateElectricDevice(ELECTRIC_SENSOR_INDEX_2, current2, uservariables[ENERGY_VARIABLE_2])

  -- set computed values to device 3
  SetEnergyVariable(ENERGY_VARIABLE_3, current3)
  UpdateElectricDevice(ELECTRIC_SENSOR_INDEX_3, current3, uservariables[ENERGY_VARIABLE_3])

  -- reset energy user variable with this script value (Wh)
  commandArray['Variable:' .. ENERGY_VARIABLE] = energy

end

return commandArray
sunix
Messages : 12
Inscription : 26 déc. 2017, 15:31

Re: Compteur virtuel pour CM180i

Message par sunix »

Bonjour
as tu pu tester ta solution ?
car elle m interesse
merci
darkseb28
Messages : 21
Inscription : 12 juin 2017, 17:53

Re: Compteur virtuel pour CM180i

Message par darkseb28 »

Bonjour je viens de recevoir le materiel cm180 et la je suis tombé sur votre discutions , mais pour moi vous parler chinois pouvez vous m aidez !
les démarches a suivre détailler pour avoir les 3 consommations séparées.


merci d avance
pilou
Messages : 30
Inscription : 26 janv. 2018, 18:05

Re: Compteur virtuel pour CM180i

Message par pilou »

Bonjour,
Après avoir installé les pinces ampèremétriques et l’émetteur 3 canaux CM180i, tu dois avoir dans Domoticz 2 dispositifs :
- Current/Energy pour le CM180i avec les puissances instantanées des 3 canaux et le total
- Energy pour le CM180 avec la puissance totale des 3 canaux

Sur le CM180i tu as la consommation de chaque canal et du Total (2898 Watt, 0 Watt, 0 Watt, Total : 765.450 Kwh)
darkseb28
Messages : 21
Inscription : 12 juin 2017, 17:53

Re: Compteur virtuel pour CM180i

Message par darkseb28 »

oui c est bien ca , maintenant j aimerai récupéré la consommation de chaque pince
Répondre