Comment créer une alerte de perte de capteurs ou de sonde ?

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 <\>.
ziaziung
Messages : 183
Inscription : 13 févr. 2015, 14:04

Comment créer une alerte de perte de capteurs ou de sonde ?

Message par ziaziung »

Bonjour à toutes et à tous. J'ai un souci : il m'arrive parfois de «perdre» des capteurs ( des contacts, des détecteurs de mouvements, des sondes de température) pour diverses raisons ( piles HS, protocole plus reconnu....).
Je voudrai donc créer des alertes qui me préviennentlors ce que tel ou tel n'a pas envoyé d'information depuis plus de 4 h, par exemple.
Pouvez vous mettez à réaliser cela ?
Raspi B+ et 2. RfxcomE. Volets Somfy. Sondes de température "AliExpress". Domoticz version 4.10761
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par vil1driver »

Salut,

Si c'est un périphérique qui envoie des infos régulièrement il suffit via un script lua de regarder depuis combien de temps on a pas reçu de valeur.
Et d'envoyer une notification si ça dépasse une certaine durée.

Tu peux t'inspirer du script_time_demo.lua du dossier lua
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
jackslayter
Messages : 1040
Inscription : 30 sept. 2014, 14:40
Localisation : Isère (38)

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par jackslayter »

j'ai ça :
d'abords créer une uservariable de type chaine
ensuite dans cette variable entrer (dans mon ex) les IDX des 3 sondes à vérifier et à la fin ajouter 0

Code : Tout sélectionner

125 256 30 0
créer un script bash

Code : Tout sélectionner

#/bin/sh

ido=$(curl "http://MONIP:MONPORT/json.htm?type=command&param=getuservariable&idx=IDXDELAVARIABLE" | sed -e 's/[{},:]/''/g' | sed -e 's/"/''/g' )
id=$(echo $ido | sed -e 's/Value /\n/g' | sed -e 's/ idx/\n/g' | sed -e '1d' | sed -e '2d')

idsonde1=`echo $id | awk '{print $1}'`
idsonde2=`echo $id | awk '{print $2}'`
idsonde3=`echo $id | awk '{print $3}'`
exe=`echo $id | awk '{print $4}'`
prob=$(echo '1')

if [ $exe = 0 ] ; then
sonde1=$(curl "http://MONIP:MONPORT/json.htm?type=devices&rid="$idsonde1"" | sed -e 's/[{}]/''/g' | grep '"HaveTimeout" :' | sed 's/:/ /1' | sed 's/,/ /1' | awk -F" " '{ print $2 }')
sonde2=$(curl "http://MONIP:MONPORT/json.htm?type=devices&rid="$idsonde2"" | sed -e 's/[{}]/''/g' | grep '"HaveTimeout" :' | sed 's/:/ /1' | sed 's/,/ /1' | awk -F" " '{ print $2 }')
sonde3=$(curl "http://MONIP:MONPORT/json.htm?type=devices&rid="$idsonde3"" | sed -e 's/[{}]/''/g' | grep '"HaveTimeout" :' | sed 's/:/ /1' | sed 's/,/ /1' | awk -F" " '{ print $2 }')
if [ $sonde1= "true" ] ; then
echo "subject: probleme sonde" > /var/tmp/mail.txt
echo >> /var/tmp/mail.txt
curl --url "smtps://smtp.gmail.com :465" --ssl-reqd --mail-from "xxxxx1" --mail-rcpt "xxxxx" --upload-file /var/tmp/mail.txt --user "xxxxx1:motdepasse"
curl "http://192.168.10.28:8082/json.htm?type=command&param=updateuservariable&idx=IDXDELAVARIABLE&vname=NOMDELAVARIABLE&vtype=2&vvalue="$idsonde1"%20"$idsonde2"%20"$idsonde3"%20"$prob""
elif [ $sonde2= "true" ] ; then
echo "subject: probleme sonde" > /var/tmp/mail.txt
echo >> /var/tmp/mail.txt
curl --url "smtps://smtp.gmail.com :465" --ssl-reqd --mail-from "xxxxx1" --mail-rcpt "xxxxx" --upload-file /var/tmp/mail.txt --user "xxxxx1:motdepasse"
curl "http://192.168.10.28:8082/json.htm?type=command&param=updateuservariable&idx=IDXDELAVARIABLE&vname=NOMDELAVARIABLE&vtype=2&vvalue="$idsonde1"%20"$idsonde2"%20"$idsonde3"%20"$prob""
elif [ $sonde3= "true" ] ; then
echo "subject: probleme sonde" > /var/tmp/mail.txt
echo >> /var/tmp/mail.txt
curl --url "smtps://smtp.gmail.com :465" --ssl-reqd --mail-from "xxxxx1" --mail-rcpt "xxxxx" --upload-file /var/tmp/mail.txt --user "xxxxx1:motdepasse"
curl "http://192.168.10.28:8082/json.htm?type=command&param=updateuservariable&idx=IDXDELAVARIABLE&vname=NOMDELAVARIABLE&vtype=2&vvalue="$idsonde1"%20"$idsonde2"%20"$idsonde3"%20"$prob""
fi
fi
si une sonde ne réponds pas un email est envoyé et la variable passe à 1 au lieu de 0 pour éviter de spammer, une fois le problème résolu repasser à 0

exécuter le script dans crontab
Raspberry Pi + RFLink + Domoticz Beta
Oregon - 3x Thgr122Nx / Chacon - micromodule 200w, télécommande 3b et 16b, 2x module 1000w, détecteur de fumée, contact de porte, 2x prise 3500w / OWL - CM180 / TRC02 v2 RGB 3M / Cheap - PIR, contact de porte
ganq
Messages : 385
Inscription : 01 avr. 2015, 14:20

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par ganq »

Bonjour j'ai crée un dummy Relevé Temp et je teste régulièrement tous les capteurs qui commencent par "Temp "grace à un script time. Si les valeurs sont plus vieille qu'une heure, le dummy se met à ON, un mail est envoyé et une notification NMA. Tant que le dummy n'est pas remis à 0, les alertes sont désactivées.

Code : Tout sélectionner

-- Guillaume Anquetil - 20/06/2015
 -- ce script vérifie les données des capteurs de température (qui commence par 'Temp ')et envoie mail et nma si le capteur n'est pas actualisé
 -- Si un capteur ne fonctionne plus, on peut changer son nom pour éviter un mail toutes les heures
 
commandArray = {}
 
  -- récupération de l'heure actuelle
 heure_actuelle=os.time()

-- si debog différent de 0 ajoute des log et met un écart plus faible
debog=0
if (debog~=0) then	
	delai=100
	print(otherdevices['Relevé Temp'] 
	else
	delai=3600
	end
		
alerte=0		
for i, v in pairs(otherdevices) do 
	if (i:sub(1,5)=='Temp ') then
		if (debog~=0) then print (i,v) end
		i2 = tostring(i)
		s = otherdevices_lastupdate[i2] 
		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)
		t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
		if (debog~=0) then  print (t2) end
		if (debog~=0) then  print (heure_actuelle-t2) end
		
		if (heure_actuelle-t2 > delai) and (otherdevices['Relevé Temp']=='Off')then 
			if (debog~=0) then  print('alerte') end
		--envoyer notification nma 
			cmd = ' /home/pi/domoticz/scripts/nma.sh  Domoticz_'..i..'_erreur capteur température 0'
			os.execute(cmd)
			--envoyer mail
			mail = 'Domoticz Alerte Age Sonde Temperature #Attention aux sondes suivantes : '..i..' # XXX@free.fr'
			commandArray['SendEmail']=mail
			alerte=1		
		end
	end
end	
if alerte==1 then	
	commandArray['Relevé Temp']='On'
end
	

return commandArray
domoticien amateur option bidouille
sebitop
Messages : 20
Inscription : 27 juil. 2015, 13:11

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par sebitop »

le script de guillaume me semble vraiment ideal pour ton cas de figure :)

teste et dis nous !
oula85
Messages : 161
Inscription : 29 avr. 2015, 18:09
Localisation : Challans

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par oula85 »

Script en partie trouvé ici parfait pour la surveillance des sondes de température avec notification individuelle

Code : Tout sélectionner

-- script_time_pile.lua
-- ce script détecte une perte de sonde et coupe le chauffage dans la zone, 
 
--------------------------------
------ Variables à éditer ------
--------------------------------

local sonde = 'Temp Salon' -- Nom de la sonde de température
local sonde2 = 'Temp Cuisine' -- Nom de la sonde de température
local sonde3 = 'Temp Chambre 2' --Nom de la sonde de température
local sonde4 = 'Temp Chambre Capucine' --Nom de la sonde de température
local sonde6 = 'Secours' --Nom de la sonde de température
local sonde5 = 'CM180'  --Nom de la sonde energie

--------------------------------
-- Fin des variables à éditer --
--------------------------------
 
time = os.date("*t")  

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


-- on regarde de quand date la dernière relève de température

local lastSeen = timedifference(sonde)
local lastSeen2 = timedifference(sonde2)
local lastSeen3 = timedifference(sonde3)
local lastSeen4 = timedifference(sonde4)
local lastSeen5 = timedifference(sonde5)
local lastSeen6 = timedifference(sonde6)

commandArray = {}


-- lance une alarme par zone au dessus du seuil 600s si l'alarme est à OFF et la coupe en dessous si l'alarme est à On 

if (lastSeen > 600 ) and (otherdevices['Pile Salon'] == 'Off') then
      commandArray['Pile Salon']='On'
end
if (lastSeen2 > 600 ) and (otherdevices['Pile Cuisine'] == 'Off') then
      commandArray['Pile Cuisine']='On'
end
if (lastSeen3 > 600 ) and (otherdevices['Pile Chambre 2'] == 'Off') then
      commandArray['Pile Chambre 2']='On'
end
if (lastSeen4 > 600  ) and (otherdevices['Pile Chambre Capucine'] == 'Off') then
      commandArray['Pile Chambre Capucine']='On'
end
if (lastSeen5 > 600 ) and (otherdevices['Pile CM180'] == 'Off') then
      commandArray['Pile CM180']='On'
end
if (lastSeen6 > 600 ) and (otherdevices['Pile Secours'] == 'Off') then
      commandArray['Pile Secours']='On'
end

if (lastSeen < 600 ) and (otherdevices['Pile Salon'] == 'On') then
      commandArray['Pile Salon']='Off'
end
if (lastSeen2 < 600 ) and (otherdevices['Pile Cuisine'] == 'On') then
      commandArray['Pile Cuisine']='Off'
end
if (lastSeen3 < 600 ) and (otherdevices['Pile Chambre 2'] == 'On') then
      commandArray['Pile Chambre 2']='Off'
end
if (lastSeen4 < 600  ) and (otherdevices['Pile Chambre Capucine'] == 'On') then
      commandArray['Pile Chambre Capucine']='Off'
end
if (lastSeen5 < 600 ) and (otherdevices['Pile CM180'] == 'On') then
      commandArray['Pile CM180']='Off'
end
if (lastSeen6 < 600 ) and (otherdevices['Pile Secours'] == 'On') then
      commandArray['Pile Secours']='Off'
end
   
    
   
  return commandArray
ziaziung
Messages : 183
Inscription : 13 févr. 2015, 14:04

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par ziaziung »

Merci pour votre aide.
@ganq :
Comment "remet t'on le dummy à zero"?
Doit on créer un switch de type "Relevé de temp" pour cela?
Raspi B+ et 2. RfxcomE. Volets Somfy. Sondes de température "AliExpress". Domoticz version 4.10761
guigui1976
Messages : 17
Inscription : 25 juin 2018, 21:25

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par guigui1976 »

Bonjour, je suis navré de sortir le post du fond du forum mais la solution de Guillaume me plait bien sauf que j'ai un message d'erreur du type:
2018-07-01 22:33:02.203 Error: EventSystem: in Vérification-temp-evenement_2: [string "-- Guillaume Anquetil - 20/06/2015 ..."]:15: ')' expected (to close '(' at line 14) near 'else'

Si vous avez une solution ou une piste, je suis preneur.
Mon équipement:
1 sonoff basic sous ESp EASY avec 6 DS18B20
Domoticz tourne sur un NAS Synology

Je vous remercie
Bonne soirée.

Guigui76
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par vil1driver »

Il manque une parenthèse à la fin de la ligne 14

Code : Tout sélectionner

print(otherdevices['Relevé Temp'] 
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
guigui1976
Messages : 17
Inscription : 25 juin 2018, 21:25

Re: Comment créer une alerte de perte de capteurs ou de sonde ?

Message par guigui1976 »

Bonjour, vil1driver je te remercie pour ton aide.
Bonne journée

Guigui1976
Répondre