MongoDb : Corriger l'erreur Unexpected shutdown

Rédigé par marmous Aucun commentaire
Il arrive parfois, suite à une coupure de courant et que vous n'avez pas d'onduleur ou quand votre ordinateur s'arrête pas proprement, que MongoDb ne veuille plus démarrer et affiche le message d'erreur "".

Pour éviter que cela ne produise vous pouvez modifier le fichier /etc/init.d/mongodb et ajouter ceci :
# Recover Data after an Unexpected Shutdown     
if [ -f /var/lib/mongodb/mongod.lock ] ; then
rm /var/lib/mongodb/mongod.lock
mongod --dbpath /var/lib/mongodb --repair
chown -R mongodb:nogroup /var/lib/mongodb
fi
dans le bloc start_server() juste avant de démarrer le processus (à la ligne 115 dans mon cas)


Comment j'ai amélioré ma chaudière

Rédigé par marmous Aucun commentaire
Aujourd'hui, je vais vous raconter comment j'ai hacké ma chaudière afin d'améliorer notre confort et de faire des économies. Ce projet est fonctionnel et en production depuis un peu plus de 6 mois. Le code source est disponible ici : http://git.marmous.net/marmous/ethion

Le situation initiale

La maison est équipée du chaudière à fioul Viessmann modèle Vitola Biferal. C'est une bonne chaudière, seulement voilà : elle est équipée uniquement d'une sonde extérieure. Son cycle de chauffe ne tient pas compte de la température intérieure de la maison. Cela pose des problèmes de confort et de consommation excessive.
En effet, en hiver, lorsqu'il fait très froid elle a tendance à surchauffer et dès que l'atmosphère se réchauffe elle ne chauffe pas assez. Cela se traduit par des nuits à fort gel où on se retrouve à plus de 20°C et des périodes de mi saison où il fait une dizaine de degré à l'extérieur et 15 à l'intérieur.
Cette situation nous forçait à constamment baisser ou augmenter la chaudière, malgré son système de régulation (soleil/lune - mode complet/mode réduit). Il n'est possible que de programmer une plage soleil et une plage lune par jour. C'est très restrictif.

Le projet

Après avoir passé trop de nuit en sueur en plein hiver, j'ai décidé de trouver une solution viable. Pour cela il fallait que je puisse récupérer la température intérieure pour l'envoyer à la chaudière. J'ai commencé à regarder ce que Viessmann proposait : une commande à distance avec thermostat. Le hic, c'est filaire et donc il aurait fallut faire un trou dans le mur et le carrelage tous deux tout neuf, sans compter un coût de plusieurs centaines d'euros pour l'appareil et toujours la limite du nombre de plage horaire.
J'ai opté pour une solution créée de toute pièce à base de Raspberry Pi.
Cela se compose d'un Raspberry Pi utilisé en tant que sonde de température et d'un second Raspberry Pi agissant en tant que régulation de la chaudière.
Voici un schéma basique du fonctionnement :



La sonde de température envoie la température relevée à la régulation toutes les minutes.
Le régulation démarre de la chaudière en fonction de la température souhaitée et de la température reçue. L'algorithme de déclenchement et de maintient de la chaleur est un peu plus complexe. Je le détaillerai plus loin.

La sonde de température

J'ai installé une Raspbian sur le Raspberry Pi téléchargée ici et installée en suivant ce tutoriel.
J'ai choisi d'utiliser un composant ds18b20 pour sonde de température pour sa simplicité de mise en œuvre avec un Raspberry Pi.
J'ai suivi ce tutoriel.
Pour envoyer la température relevée à la régulation, j'ai écrit un script qui
  • relève la température
  • calibre la température relevée
  • l'envoie à la régulation

La régulation

Là aussi je me suis basé sur une Raspbian. Mon Raspberry Pi est équipé d'une carte extension PiFace me permettant de déclencher un relais (ouvrir ou fermer un circuit à la demande).
La régulation est composée d'une application web (framework python Pyramid) en guise d'interface utilisateur, d'un script python chargé de contrôler la chaudière et d'une base de donnée MongoDb.
Il est possible d'installer la base de données sur le Raspberry Pi en suivant ce tutoriel. Les performances n'étant pas au rendez-vous sur mon Raspberry Pi B, je l'ai installé ailleurs. Il faudrait tester avec un Raspberry Pi 2.
Un tutoriel d'installation complet existe ici.

Le branchement matériel

J'ai rencontré une grande difficulté à trouver un point d'entrée sur la chaudière pour démarrer/arrêter le brûleur. Je pensais naïvement qu'il devait y avoir un relais quelque part pour faire ça.
Au final et surtout grâce à ce forum allemand, j'ai simulé une commande à distance via quelques résistances.
Voici le schéma de la réalisation :



L'algorithme de régulation

J'ai amélioré cet algorithme depuis la mise en production et je pense qu'il peut encore l'être.
Je ne suis pas un expert en maths, ça doit se sentir un peu ;-)
La difficulté est que la température de l'eau chauffée est inconnue. Sur une régulation classique, il y a des réglages prédéfinis en fonction de la température de l'eau chauffée. J'ai donc dû faire autrement et je pense avoir trouvé le bon réglage pour ma maison.

Les paramètres de l'algorithme sont les suivants :
  • la température courante de l'habitat (currentTemp)
  • la température désirée (desiredTemp)
  • un delta de température (tempDelta) utilisé pour savoir si il y a un gros écart de température à rattraper
  • le temps de repos entre deux chauffes (restTime)
  • le temps de déclenchement du brûleur pour un maintient de température (holdHeatTime)
  • le temps de déclenchement du brûleur pour une petite chauffe (minHeatTime)
  • le temps de déclenchement du brûleur pour une grosse chauffe (maxHeatTime)
  • le nombre maximum de grosse chauffe (nbMaxHeat)
Il est relativement simple. C'est une boucle infinie qui pour chaque itération :
  • Récupère tous les paramètres
  • if (0 < desiredTemp-currentTemp <= tempDelta)|(nbHeat>=nbMaxHeat)
SI la différence de température entre la température désirée et la température courante est comprise entre 0 et le delta de température
OU SI le nombre maximum de grosse chauffe est atteint
ALORS le brûleur est démarré pour une durée minHeatTime, on attend le temps de repos restTime et le nombre de grosse chauffe nbHeat est initialisé à 0.
  • if (desiredTemp-currentTemp > tempDelta) & (nbHeat<nbMaxHeat)
SI la différence de température entre la température désirée et la température courante est supérieure au delta de température
ET SI le nombre maximum de grosse chauffe n'est pas atteint
ALORS le brûleur est démarré pour une durée maxHeatTime, on attend le temps de repos restTime et le nombre de grosse chauffe nbHeat est augmenté de 1.
  • else if lastRelayStart <= (now + datetime.timedelta(minutes = -60))
Dans les autres cas, SI le relais n'a pas été démarré dans les 60 dernières minutes
ALORS le brûleur est démarré pour une une chauffe de maintient holdHeatTime et on attend le temps de repos restTime.
  • Attente d'une minute
Un fait intéressant qui m'a fait rajouté le maintient est que même si la température de la pièce est chaude, nous avons une sensation de froid si les radiateur le sont.
Donc la sensation de chaud ou de froid n'est pas directement liée (et l'est quand même un peu forcément) à la température de la pièce mais à la température des radiateurs. D'où la nécessité de rajouter une fonction de maintient de chaleur.

Conclusion


Ce projet a été un vrai challenge, surtout pour trouver le point d'entrée de la chaudière. Si vous voulez tenter l'expérience, vous trouverez tous les fichiers ici sous licence libre. Si vous voulez plus d'info ou de l'aide pour mettre en place un tel projet, écrivez moi : ycalamai (chez) gmail.com

Quelques Photos

La régulation

Des schémas et des notes






L'interface web


L'écran de paramétrage

Fil RSS des articles de ce mot clé