Recherche scipt

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 <\>.
banditos
Messages : 126
Inscription : 30 nov. 2016, 09:55

Recherche scipt

Message 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
Raspberry pi 3/Rasbian-Jessie/Domoticz/RFXtrx433 USB 433.92MHz/SSD 32gb
balajol
Messages : 864
Inscription : 13 nov. 2015, 18:54
Localisation : 62

Re: Recherche scipt

Message 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
2024.6 PC Windows10 ; 2ème DEBIAN 10;DANFOSS LC13, Topp; Senseurs univ FIBARO FGBS001, Flood Sensor, ZMNHBD1 Flush 2 Relays ; FIBARO FGS222-FGS212;RFXCOM-RFXtrx433 USB 433.92MHz , Prises Phénix, Prises et Eclairage DI-O, SOMFY RTS,Sonoff ..
denis_brasseur
Messages : 898
Inscription : 24 déc. 2018, 17:05
Localisation : (26)

Re: Recherche scipt

Message 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é.
Pi3 + DD PiDrive - RFXtrx433 - AEON Labs ZW090
banditos
Messages : 126
Inscription : 30 nov. 2016, 09:55

Re: Recherche scipt

Message par banditos »

Merci beaucoup pour vos réponses.

je regarde ça.
Raspberry pi 3/Rasbian-Jessie/Domoticz/RFXtrx433 USB 433.92MHz/SSD 32gb
Datawolf
Messages : 273
Inscription : 03 avr. 2018, 13:51

Re: Recherche scipt

Message 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
Doudy
Messages : 457
Inscription : 07 mai 2016, 17:23

Re: Recherche scipt

Message 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... ;)
RaspberryPi - RFLink - Zwave - WH2600
Domoticz : 2020.2 | Dashticz : V3.12 Master | dzvents : 3.0.2 | Python : 3.7.3
banditos
Messages : 126
Inscription : 30 nov. 2016, 09:55

Re: Recherche scipt

Message par banditos »

C'est ça !
Raspberry pi 3/Rasbian-Jessie/Domoticz/RFXtrx433 USB 433.92MHz/SSD 32gb
banditos
Messages : 126
Inscription : 30 nov. 2016, 09:55

Re: Recherche scipt

Message 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	
Raspberry pi 3/Rasbian-Jessie/Domoticz/RFXtrx433 USB 433.92MHz/SSD 32gb
cyberbob
Messages : 511
Inscription : 28 nov. 2016, 19:43
Localisation : Belgique

Re: Recherche scipt

Message 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 ?
Domoticz Stable V4.9700 sur Synology DSM 6.2 / 2 x RFlink V48.4 - 433.92MHz(Dio/Chacon) & 433.42MHz(RTS) / Script en LUA & Blocky
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Recherche scipt

Message 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..

Code : Tout sélectionner

idx_lampe=otherdevices_idx['lampe'] 
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Répondre