RaspFR :: Forum

Version complète : [résolu] Gpio et crontab
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour,

Mon installation :

Un RPi + une ligne I2C + un mcp23017 pilotant un LCD 20x4 + un mcp23017 pilotant une carte 8 relais.

voici un script python qui récupère des données dans le fichier piscine.txt pour :
1- afficher du texte sur l'afficheur via le mpc avec comme adresse 0x24
2- commander le relais via le mpc avec comme adresse 0x22

Quand j’exécute ce script avec la console 'putty' le fonctionnement est parfait.

Mon but est de faire exécuter ce script à intervalle régulier grâce à la crontab du Rpi

Quand la crontab exécute ce script les relais du mpc 0x22 fonctionnent selon le script mais l'afficheur LCD piloté par le mpc 0x24 écrit des caractères bizarres un peu partout sur l’écran.

Quelle différence peut-il y avoir entre la console et la crontab ?
Je sèche complètement...... J'ai besoin d'aide

MERCI

Code :
[== Indéfini ==]
#!/usr/bin/python2.7
#-*- coding: utf-8 -*-

import os
import time
from datetime import datetime, timedelta

import Adafruit_GPIO as GPIO
import Adafruit_GPIO.MCP230xx as MCP
import Adafruit_CharLCD as LCD

gpioPIS = MCP.MCP23017(0x22);
gpioLCD  = MCP.MCP23017(0x24);

gpio = MCP.MCP23017(0x24);
lcd = LCD.Adafruit_CharLCD(15,13,12,11,10,9,20,4,14,gpio=gpioLCD)
lcd.set_backlight(1)
lcd.clear()



class Piscine:
    def __init__(self):
        self.OnOff = 0
        self.tab = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
Piscine = Piscine()

def Initialisation():
    gpioPIS.setup(0,GPIO.OUT)
    
# Fonction lecture fichier piscine
def lirePiscine():
    FichierPiscine = open("/var/www/piscine.txt", "r")
    Piscine.OnOff = int(float(FichierPiscine.readline()))    # On/Off
    i=1
    while i<= 23:
        Piscine.tab[i]=int(float(FichierPiscine.readline()))
        i=i+1
    FichierPiscine.close
    return
    
Initialisation()
maintenant = datetime.now()
lirePiscine()


if len(str(maintenant.hour))==1 :
    lcd.message("0")
    lcd.message(str(maintenant.hour))
else :
    lcd.message(str(maintenant.hour))
lcd.message(":")
if len(str(maintenant.minute))==1 :
    lcd.message("0")
    lcd.message(str(maintenant.minute))
else :
    lcd.message(str(maintenant.minute))


lcd.set_cursor(6,0)
lcd.message("Piscine : ")
if Piscine.OnOff == 1 :
    lcd.message("Auto")
    i=0
    while i <= 22:
        if maintenant.hour == i:
            if Piscine.tab[i+1]==1:
                gpioPIS.output(0,1)
                lcd.set_cursor(0,1)
                lcd.message("Filtration ON")
            else :
                gpioPIS.output(0,0)
                lcd.set_cursor(0,1)
                lcd.message("Filtration OFF")
        i=i+1
else :
    lcd.message("Manu")
Bonsoir,
passemoilaclede12 a écrit :... Quelle différence peut-il y avoir entre la console et la crontab ? ...
Tout simplement parce que sans doute (et sûrement ;-), l'environnement d'exécution d'un crontab est minimaliste...

Cf. Recherche crontab
Peut être devrais tu essayer un script basique genre qui affiche l'heure toutes les secondes et ajouter progressivement tes fonctions pour trouver laquelle a besoin d'une initialisation d'environnement. Car comme le dit Claudius, souvent l'erreur est de croire que via crontab c'est comme en ligne de commande sauf qu'il n'y a pas de session, donc pas d'initialisation de variables genre PATH, TTY etc.
Bonsoir,

Effectivement, c'est une piste de recherche du pourquoi du comment...

Une autre piste plus radicale consiste à exécuter la ligne dudit crontab en chargeant au préalable l'environnement souhaité comme celui qui permet d'exécuter correctement le(s)dit(s) script(s).

Cf. How can I run a cron command with existing environmental variables?; ici c'est (à adapter ;-):
Code :
0 5 * * * . $HOME/.profile; /path/to/command/to/run
hello passemoilaclede12

Quand tu veux executer un script avec crontab, tu dois donner pour les commandes, les lib le chemin absolu.

pour accéder à la lib "Adafruit_GPIO" le script doit avoir le chemin complet ex: /root/Adafruit_GPIO
sinon il ne la trouve pas.

@+
La solution : une histoire de LANG !!!!!

voici la ligne de commande dans la crontab :

* * * * * export LANG=fr_FR.utf8 /usr/bin/python2.7 /var/www/scriptpython/ScriptPiscine.py

Merci