Page 1 sur 3
Recherche scipt
Publié : 20 août 2019, 23:21
par banditos
Bonjour,
je suis à la recherche d'un petit scrip qui permet de copier la valeur d'une sonde de T° pour l'écrire dans une sonde de T° virtuelle, pour éviter les grosses manipes suite aux changements de piles des sondes orégon.
Merci
Re: Recherche scipt
Publié : 20 août 2019, 23:50
par balajol
Bonsoir,
Tu dois Pouvoir t'inspirer de ceci:
Code : Tout sélectionner
--Ce sript récupère la T° d'un dispositif TEMP/HUM pour renségner un dummy T° Utiliser ce script si les sondes se transforment en T° H°
--993 est le numero idx du dispositif virtuel Affichant la Temperature Seule: "T°-Ballon_ECS_Chaudiere" ; 1002 celui de "Temp_Retour_Radiateurs"
function arrondir(num, dec)
if num == 0 then
return 0
else
local mult = 10^(dec or 0)
return math.floor(num * mult + 0.5) / mult
end
end
commandArray = {}
if (devicechanged['T°-Ballon_ECS_Chaudiere-50L']) then
resultat = arrondir(tostring(otherdevices_temperature['T°-Ballon_ECS_Chaudiere-50L']),1)
commandArray['UpdateDevice'] = 993 .. '|0|'.. resultat
end
if (devicechanged['Temp_Retour_Radiateurs-']) then
resultat2 = arrondir(tostring(otherdevices_temperature['Temp_Retour_Radiateurs-']),1)
commandArray['UpdateDevice'] = 1002 .. '|0|'.. resultat2
end
if (devicechanged['Sonde-1-Univ-1-Bas-Ballon-1000L']) then
resultat3 = arrondir(tostring(otherdevices_temperature['Sonde-1-Univ-1-Bas-Ballon-1000L']),1)
commandArray['UpdateDevice'] = 1311 .. '|0|'.. resultat3-- 1311 DUMMY Virtuel 1456F 1 Sonde_1_Bas_Stock
end
if (devicechanged['Sonde-2-Univ-1-Ballon-1000L']) then
resultat4 = arrondir(tostring(otherdevices_temperature['Sonde-2-Univ-1-Ballon-1000L']),1)
commandArray['UpdateDevice'] = 1312 .. '|0|'.. resultat4-- 1312 DUMMY Virtuel 14570 1 Sonde_2_Stock
end
if (devicechanged['Sonde-3-Univ-1-Ballon-1000L']) then
resultat5 = arrondir(tostring(otherdevices_temperature['Sonde-3-Univ-1-Ballon-1000L']),1)
commandArray['UpdateDevice'] = 1313 .. '|0|'.. resultat5-- 1313 DUMMY Virtuel 14571 1 Sonde_3_Stock
end
if (devicechanged['Sonde-4-Univ-1-H-Bal.1000L']) then
resultat6 = arrondir(tostring(otherdevices_temperature['Sonde-4-Univ-1-H-Bal.1000L']),1)
commandArray['UpdateDevice'] = 1314 .. '|0|'.. resultat6-- 1314 DUMMY Virtuel 14572 1 Sonde_4_Stock_Haut
end
if (devicechanged['Temp_Ballon_ECS_80L_solaire-']) then
resultat7 = arrondir(tostring(otherdevices_temperature['Temp_Ballon_ECS_80L_solaire-']),1)
commandArray['UpdateDevice'] = 1322 .. '|0|'.. resultat7-- 1322 DUMMY Virtuel 1457A 1 Temp_Ballon_ECS_80L_solaire
end
Pour les sondes Oregon regarde ici:
viewtopic.php?t=7910
Cdt
Bertrand
Re: Recherche scipt
Publié : 21 août 2019, 05:02
par denis_brasseur
J'utilise le même principe que le code de Bertrand.
Le code devient vite un peu lourd quand tu enchaîne les sondes et les virtuel device à mettre à jour.
Un tableau dans lequel je stocke les idx source et destination :
Code : Tout sélectionner
ArraySonde[#ArraySonde + 1] = {sonde = 2643, idx = 3007}
ArraySonde[#ArraySonde + 1] = {sonde = 2644, idx = 3008}
--ArraySonde[#ArraySonde + 1] = {sonde = 2645, idx = 3009}
--sonde est le numero idx du dispositif affichant la Temperature
--idx est le numero idx du dispositif virtuel à mettre à jour
et ensuite une boucle dans laquelle je capte les changement d'état et je met à jour les virtuel device
Code : Tout sélectionner
--Parcours le Tableau
for key, valeur in pairs(ArraySonde) do
if (devicechanged[GetDeviceNameByIdx(valeur.sonde)]) then
--print(GetDeviceNameByIdx(valeur.sonde)..'-'..getTempIdx(valeur.sonde))
commandArray[#commandArray+1]={['UpdateDevice'] = valeur.idx..'|0|'..getTempIdx(valeur.sonde)}
end
end
Mes 3 fonctions sont placé dans un fichier module.lua, mais le code doit etre exploitable dans l'état, ne reste qu'a personnaliser les ArraySonde[#ArraySonde + 1], on peux en placer/supprimer/mettre en commentaire autant que l'on souhaite sans avoir à réécrire le code
Code : Tout sélectionner
-- arrondire
function round(num, dec)
if num == 0 then return 0
else local mult = 10^(dec or 2)
return math.floor(num * mult + 0.5) / mult
end
end
-- température
function getTempIdx(idx)
return round(tonumber(otherdevices_temperature[GetDeviceNameByIdx(idx)]),1)
end
-- humidité
function getHum(device)
return round(tonumber(otherdevices_humidity[GetDeviceNameByIdx(idx)]),1)
end
-- retourne le nom du switch selon son IDX
function GetDeviceNameByIdx(deviceIDX)
for i, v in pairs(otherdevices_idx) do
if v == deviceIDX then
return i
end
end
return 0
end
commandArray = {}
local ArraySonde = {}
--sonde est le numero idx du dispositif affichant la Temperature
--idx est le numero idx du dispositif virtuel à mettre à jour
ArraySonde[#ArraySonde + 1] = {sonde = 2643, idx = 3007}
ArraySonde[#ArraySonde + 1] = {sonde = 2644, idx = 3008}
--ArraySonde[#ArraySonde + 1] = {sonde = 2645, idx = 3009}
--Parcours le Tableau
for key, valeur in pairs(ArraySonde) do
if (devicechanged[GetDeviceNameByIdx(valeur.sonde)]) then
--print(GetDeviceNameByIdx(valeur.sonde)..'-'..getTempIdx(valeur.sonde))
commandArray[#commandArray+1]={['UpdateDevice'] = valeur.idx..'|0|'..getTempIdx(valeur.sonde)}
end
end
return commandArray
Ne reste plus qu'a modifier l'idx sonde en cas de changement de pile et après recréation du device associé.
Re: Recherche scipt
Publié : 21 août 2019, 08:17
par banditos
Merci beaucoup pour vos réponses.
je regarde ça.
Re: Recherche scipt
Publié : 21 août 2019, 09:25
par Datawolf
banditos a écrit : 20 août 2019, 23:21
[....] pour éviter les grosses manipes suite aux changements de piles des sondes orégon.
Salut,
Avant de se demander comment je vais demander pourquoi: lors d'un changement de pile un nouveau dispositif est créé et il suffit d'aller sur l'ancien et cliquer sur "Remplacer par", non ?
@+
Datawolf
Re: Recherche scipt
Publié : 21 août 2019, 09:35
par Doudy
Datawolf a écrit : 21 août 2019, 09:25
Salut,
Avant de se demander comment je vais demander pourquoi: lors d'un changement de pile un nouveau dispositif est créé et il suffit d'aller sur l'ancien et cliquer sur "Remplacer par", non ?
@+
Datawolf
Oui effectivement, mais il me semble qu'il prend le nouvel IDX et ne garde pas l'ancien...

Re: Recherche scipt
Publié : 21 août 2019, 12:32
par banditos
C'est ça !
Re: Recherche scipt
Publié : 23 août 2019, 12:21
par banditos
Bonjour,
j'ai créé un dummy virtuel T°/H evec un idx de 789, ma sonde physique T°/H a 733 d'idx, j'ai modifié le script, je l'ai placé dans le fichier lua de Domoticz comme à chaque fois et pourtant ma sonde virtuelle n'est pas mise à jour, si quelqu'un a une idée.
Merci
Code : Tout sélectionner
-- arrondire
function round(num, dec)
if num == 0 then return 0
else local mult = 10^(dec or 2)
return math.floor(num * mult + 0.5) / mult
end
end
-- température
function getTempIdx(idx)
return round(tonumber(otherdevices_temperature[GetDeviceNameByIdx(idx)]),1)
end
-- humidité
function getHum(device)
return round(tonumber(otherdevices_humidity[GetDeviceNameByIdx(idx)]),1)
end
-- retourne le nom du switch selon son IDX
function GetDeviceNameByIdx(deviceIDX)
for i, v in pairs(otherdevices_idx) do
if v == deviceIDX then
return i
end
end
return 0
end
commandArray = {}
local ArraySonde = {}
--sonde est le numero idx du dispositif affichant la Temperature
--idx est le numero idx du dispositif virtuel à mettre à jour
ArraySonde[#ArraySonde + 1] = {sonde = 733, idx = 789}
--Parcours le Tableau
for key, valeur in pairs(ArraySonde) do
if (devicechanged[GetDeviceNameByIdx(valeur.sonde)]) then
--print(GetDeviceNameByIdx(valeur.sonde)..'-'..getTempIdx(valeur.sonde))
commandArray[#commandArray+1]={['UpdateDevice'] = valeur.idx..'|0|'..getTempIdx(valeur.sonde)}
end
end
return commandArray
Re: Recherche scipt
Publié : 23 août 2019, 12:31
par cyberbob
Pour que je comprenne : Si on fait "remplacer par" lors du changement des piles, l'idx change, mais pas le nom de la sonde, et dans tous les scripts, si la sonde est reprise par son nom, le changement de pile devient transparent pour tous ces sripts, non ?
Re: Recherche scipt
Publié : 23 août 2019, 13:34
par vil1driver
Oui
A l'origine, la nouvelle doit être nommée différemment, (le nom doit être unique)
Une fois les données dupliquées,
Tu supprimes l'ancienne et renommes la nouvelle comme l'ancienne.
Les idx ne sont pratiquement jamais utiles et au pire un peut les obtenir à la volée dans les scripts au besoin..