Je me bats avec ce code depuis des jours pour qu'il affiche des notifications sur un bureau Raspbian Jessie. J'ai essayé Notify, notify2, et notify-send et ils travaillent tous à partir de IDLE mais pas à partir de la ligne de commande. Notifier planté le code python, notifier-envoyer (appelé via subprocess.Popen) n'a rien fait (fonctionne très bien lorsqu'il est appelé directement depuis le terminal), notify2 a travaillé pendant un certain temps depuis la ligne de commande après avoir exécuté IDLE mais cesse de fournir des notifications. Aucune erreur n'est jamais donnée. J'utilise le système de notification car le système peut mettre plus de 10 secondes à démarrer le flux de la caméra rtsp une fois le bouton poussé et je veux que l'utilisateur sache que son entrée a été reçue. S'il y a une autre façon d'afficher une notification rapide à partir de Python, je suis ouvert aux idées (tkinter?).Notify2 fonctionne à partir de Python3 IDLE mais pas toujours dans le terminal
codeest appelé à partir d'un script bash appelé LXDE-pi/Autostart:
#!/bin/sh
# launcher.sh
cd/
cd home/pi/py_switch
while true; do
python3.4 buttons.py
echo -----------------------RESTARTING CODE------------
done
cd/
Voici buttons.py:
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
import schedule
import subprocess
import os
from subprocess import call
import notify2
import sys; print(sys.executable)
print(os.getcwd())
notify2.init("Buttons")
os.environ.setdefault('XAUTHORITY', '/home/user/.Xauthority')
os.environ.setdefault('DISPLAY', ':0.0')
GPIO.setmode(GPIO.BCM)
GPIO.setup(26, GPIO.IN, pull_up_down=GPIO.PUD_UP) #*
GPIO.setup(19, GPIO.IN, pull_up_down=GPIO.PUD_UP) #MIC
GPIO.setup(13, GPIO.IN, pull_up_down=GPIO.PUD_UP) #CAM
GPIO.setup(6, GPIO.IN, pull_up_down=GPIO.PUD_UP) #BRIGHTNESS
GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) #POWER
input_state1 = GPIO.input(26)
input_state2 = GPIO.input(19)
input_state3 = GPIO.input(13)
input_state4 = GPIO.input(6)
input_state5 = GPIO.input(5)
print(time.asctime(time.localtime(time.time())))
print('Button State: ', input_state1, input_state2, input_state3, input_state4, input_state5)
cam_state=False
n = notify2.Notification("Buttons!", "Waiting for you to push something.")
n.show()
brightness = str(subprocess.check_output(["ddcutil", "getvcp", "10"]))
brightness = brightness[brightness.find('=',4):brightness.find(',')]
brightness = brightness[1:].strip(' ')
if brightness == '0':
disp_state=1
print('Startup brightness is 0%')
elif brightness == '1':
disp_state=0
print('Display is off')
else:
disp_state=2
print('Startup brightness is >0%')
def job():
rc = subprocess.call(["/home/pi/py_switch/cams.sh", "repair"])
print('Checking for down cameras')
def night():
rc = subprocess.call(["ddcutil", "setvcp", "10", "1"])
rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "04"])
disp_state=0
print('Starting night mode')
def day():
rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "01"])
rc = subprocess.call(["ddcutil", "setvcp", "10", "100"])
disp_state=2
print('Starting day mode')
schedule.every().day.at("23:30").do(night)
schedule.every().day.at("06:00").do(day)
schedule.every().wednesday.at("07:15").do(night)
schedule.every().thursday.at("07:15").do(night)
while True:
input_state1 = GPIO.input(26) #*
input_state2 = GPIO.input(19) #MIC
input_state3 = GPIO.input(13) #CAM
input_state4 = GPIO.input(6) #BRIGHTNESS
input_state5 = GPIO.input(5) #POWER
if input_state3 == False:
print('Camera Button Pressed')
time.sleep(0.2)
if cam_state == False:
n = notify2.Notification("Starting Cameras", "May take up to 10 seconds...", "camera-video")
rc = subprocess.call(["/home/pi/py_switch/cams.sh", "repair"]) #repair like start but won't double start if running
cam_state=True
schedule.every(3).minutes.do(job).tag('repair-cams')
else:
n = notify2.Notification("Stopping Cameras", "Standby...", "camera-video")
rc = subprocess.call(["/home/pi/py_switch/cams.sh", "stop"])
cam_state=False
schedule.clear('repair-cams')
if input_state4 == False:
print('Brightness button Pressed')
# rc = subprocess.Popen('DISPLAY=:0 notify-send "Changing Brightness..." "100% -> 0% -> Off ->" -i dialog-information', shell=True)
n = notify2.Notification("Changing brightness", "100% -> 0% -> Off ->", "dialog-information")
time.sleep(0.2)
if disp_state == 3:
rc = subprocess.call(["ddcutil", "setvcp", "10", "50"])
disp_state=2
elif disp_state == 2:
rc = subprocess.call(["ddcutil", "setvcp", "10", "0"])
disp_state=1
elif disp_state == 1:
rc = subprocess.call(["ddcutil", "setvcp", "10", "1"])
rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "04"])
disp_state=0
elif disp_state == 0:
rc = subprocess.call(["ddcutil", "setvcp", "0xd6", "01"])
rc = subprocess.call(["ddcutil", "setvcp", "10", "100"])
disp_state=2 #changed to 2 to from 3 to bypass 50% brighness
if input_state5 == False:
print('Power button Pressed')
start = time.time()
time.sleep(0.2)
# rc = subprocess.Popen('DISPLAY=:0 notify-send "Hold for 5s to shutdown." -i system-shutdown', shell=True)
n = notify2.Notification("Shutdown?", "Hold for 5s to shutdown.", "system-shutdown")
while input_state5 == False:
time.sleep(0.1)
print('Holding down 3')
end = time.time()
press_time = end-start
# print(press_time)
input_state5 = GPIO.input(5)
if press_time > 5:
print('Shutting down?')
os.system('sudo shutdown -h now')
if input_state2 == False:
print('Microphone button Pressed')
time.sleep(0.2)
#rc = subprocess.call(["ddcutil", "setvcp", "10", "100"])
if input_state1 == False:
print('Star button Pressed')
time.sleep(0.2)
time.sleep(0.1)
schedule.run_pending()
Est-ce que je dois faire quelque chose de spécial pour maintenir la notification démon en cours d'exécution? Je notification-daemon, informez-osd et sur tous les autres paquets recherches Google suggéré installer:
(zcat $(ls -tr /var/log/apt/history.log*.gz); cat /var/log/apt/history.log) 2>/dev/null |
egrep '^(Start-Date:|Commandline:)' |
grep -v aptdaemon |
egrep -B1 '^Commandline:'
Commandline: apt-get install notification-daemon
Commandline: apt-get install python-notify
Commandline: apt-get install python-dev python-rpi.gpio
Commandline: apt-get install python-gobject libnotify-bin libnotify-dev
Commandline: apt-get install xorg-dev libglu1-mesa-dev
Commandline: apt-get install libudev-dev
Commandline: apt-get install libusb-dev
Commandline: apt-get install libusb-1.0.0-dev
Commandline: apt-get install screen
Commandline: apt-get install xosd-bin
Commandline: apt-get install libgtk2.0-dev libglib2.0-dev libnotify-dev
Commandline: apt-get install libnotify-cil-dev
Commandline: apt-get install notify-osd
Commandline: apt-get install unclutter
Commandline: apt-get install python3-notify2