Page 1 sur 1

[Résolu] Détecteur panne de courant

Publié : 20 juil. 2015, 14:38
par Pyrrhus
Bonjour à tous,
Je possède entre autre un hub harmony et un Rpi2 avec domoticz et je voulais mettre en place un systéme de notification qui m'indique si il y a coupure de courant lorsque je ne suis pas à la maison, si possible sans rien acheter d'autre (c'est pas que je suis radin mais j'habite dans un DOM ou les colis mettent 3 semaines pour arriver... et ou on ne trouve pas grand chose sur place...)
Alors voilà:
-le RPi est sur un onduleur avec la livebox
-le hub n'est pas sur onduleur (inutile vu qu'en cas de coupure la télé, amplis... ne fonctionnent plus)
Je me suis inspiré d'un script qui vérifie la présence d'un téléphone en le pingant régulièrement: http://blog.alexandredubois.com/2014/12 ... telephone/
Je l'ai modifié pour pinger mon hub et ça marche: mon dummy switch est sur on lorsque mon hub harmony est alimenté, et il passe à off lorsque le hub n'est plus alimenté. Voici le code:

Code : Tout sélectionner

-- titre du fichier: script_time_hub.lua
-- Ce script vérifie la présence du hub sur le réseau.
-- La vérification est effectuée une fois par minute tant que le hub n'est à portée,
-- puis une fois toute les 5 minutes quand le hub est connecté.
 
commandArray = {}
 
--Cette fonction calcule la différence de temps (en secondes) entre maintenant
--et la date passée en paramètre.
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
 
--Si le hub n'est pas détecté ou qu'il est présent depuis plus de 5 minutes (300 secondes),
--alors on vérifie à nouveau sa présence
if (otherdevices['hub']=='Off' or (otherdevices['hub']=='On' and timedifference(otherdevices_lastupdate['hub']) > 300)) then
	ping_success_hub=os.execute('ping -c1 192.168.1.34')
	
	if ping_success_hub then
	  commandArray['hub']='On'
	else
	  if otherdevices['hub']=='On' then --On ne passe l'interrupteur virtuel à Off que s'il est sur On.
             commandArray['hub']='Off'
          end
	end
end
 
return commandArray
Bien sûr ce script ne permet pas d'être sûr qu'il y a panne de courant: ça peut être une panne de livebox ou une panne du hub...etc. Mais c'est mieux que rien, et je peux voir ce qui se passe chez moi avec ma webcam branchée aussi sur le Rpi.

OU EST LE PROBLEME ALORS ?
Il s'agit des notifications:
- lorsque mon dummy switch "hub" est sur off, il m'envoie un mail "connectivité hub perdue"
- quand il est sur on, il m'envoie un mail aussi "connectivité rétablie"
J'ai juste utilisé le bouton "notifications" du switch.
Le problème est que, comme le hub est pingé toutes les 5 minutes, une action "on" est envoyé au switch "hub" toutes les 5 minutes et donc... je vous laisse deviner... lorsqu'il y a du courant chez moi je reçois un mail toutes les 5 minutes lol !
Je ne sais pas comment résoudre ce problème
Je voudrais que la notification fonctionne uniquement si le switch "hub" est passé de OFF à ON et non pas s'il était déjà sur ON.
Je ne peux pas jouer avec les intervalles de notifications: si je coche "ignore interval", je reçois le mail toutes les 5 minutes; si je décoche et que je règle un intervalle plus grand dans les paramètres de domoticz, je risque de ne plus être averti à temps si le courant est revenu...
Ces notifications sont importantes pour moi car les coupures peuvent être très longues jusqu'à épuisement de l'onduleur. Je sais combien de temps l'onduleur peut tenir donc ça me permettrait d'éteindre proprement le Rpi à distance si la coupure est trop longue.

Pouvez-vous m'aider ?

Re: Détecteur panne de courant

Publié : 20 juil. 2015, 16:04
par vil1driver
Salut,

Il te suffit dans ton script de ne passer le switch à On que s'il ne l'était pas déjà et de même pour Off..

Ton onduleur ne dispose pas de prise usb ?
Car la plupare sont fait pour renseigner sur le niveau de batterie et le pc s'éteind de lui même avant que la batterie soit vide..

Re: Détecteur panne de courant

Publié : 20 juil. 2015, 16:14
par Pyrrhus
Salut vil1driver !
peux-tu publier le code exact des modifications à apporter ?
En fait je suis débutant sous linux et même si j'ai beaucoup progressé j'ai toujours peur de faire une erreur (j'ai reçu mon raspberry il y a 2 mois et depuis j'apprends tout seul, sous linux je suis parti de rien :D )
En tout cas merci beaucoup !

edit: mon onduleur n'a pas de prise USB. Quand il rendra l'âme je penserai a en acheter un avec prise USB et il faudra que je trouve un tuto pour qu'il renseigne le raspberry...

Re: Détecteur panne de courant

Publié : 20 juil. 2015, 16:49
par vil1driver
Ton code le fait déjà pour Off, c'est même commenté..
Tu as juste à faire de même pour le On..

Je suppose que ce script est de toi, joli travail, ce serait dommage de ne pas aller au bout...
Proposes et je te dirais si c'est bon..
On apprend en faisant ;)

Re: Détecteur panne de courant

Publié : 20 juil. 2015, 17:16
par Pyrrhus
Voilà le code modifié (section "lignes rajoutées")
Je pense qu'il fallait rajouter un "else", par contre je ne sais pas si il faut rajouter un "end" et si ils sont bien à leur place...

Code : Tout sélectionner

-- titre du fichier: script_time_hub.lua
-- Ce script vérifie la présence du hub sur le réseau.
-- La vérification est effectuée une fois par minute tant que le hub n'est à portée,
-- puis une fois toute les 5 minutes quand le hub est connecté.
 
commandArray = {}
 
--Cette fonction calcule la différence de temps (en secondes) entre maintenant
--et la date passée en paramètre.
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
 
--Si le hub n'est pas détecté ou qu'il est présent depuis plus de 5 minutes (300 secondes),
--alors on vérifie à nouveau sa présence
if (otherdevices['hub']=='Off' or (otherdevices['hub']=='On' and timedifference(otherdevices_lastupdate['hub']) > 300)) then
   ping_success_hub=os.execute('ping -c1 192.168.1.34')
   
   if ping_success_hub then
     commandArray['hub']='On'
   else
     if otherdevices['hub']=='On' then --On ne passe l'interrupteur virtuel à Off que s'il est sur On.
             commandArray['hub']='Off'
--lignes rajoutées
   else
      if otherdevices['hub']=='off' then --On ne passe l'interrupteur virtuel à On que s'il est sur Off.
             commandArray['hub']='On'
          end
   end
end
 
return commandArray
Merci pour ton aide et tu as tout à fait raison, on apprend mieux en faisant soi même !

edit: je n'ai fait que modifier le script d'Alexandre Dubois (le lien du blog est sur le premier post). Je n'en suis pas encore à ce niveau !

Re: Détecteur panne de courant

Publié : 20 juil. 2015, 18:20
par vil1driver
Ah d'accord, je pensais que tu avais tout fait..
Pour le coups c'est pire maintenant :D mais de peu, seulement en code peu c'est énorme..

Tu as bien compris ce qu'il manquait mais effectivement tu ne l'as pas mis au bon endroit.

Else qui veut dire si-non ne peux être utilisé qu'une seule fois après if.

Voici la fin corrigée

Code : Tout sélectionner

if ping_success_hub then -- si le ping réussi
     if otherdevices['hub']=='Off' then -- si le hub est à Off
             commandArray['hub']='On' -- on le passe à On
     end
else -- si le ping échoue
     if otherdevices['hub']=='On' then -- si le hub est à On
             commandArray['hub']='Off'  -- on le passe à Off
     end
end
end
 
return commandArray

Re: Détecteur panne de courant

Publié : 20 juil. 2015, 19:20
par Pyrrhus
Merci ça marche super bien maintenant !
et en plus j'ai appris des choses :D
C'est super que tu m'aies aidé je bataillais depuis hier soir
Problème résolu !