Alles anzeigenHallo,
Pssst: Da fehlt der Aufruf der 'main'-Funktion. (*ganz klein laut*)
'os' wurde durch 'pathlib' ersetzt, das steht auch in der Dokumentation. Dann kann man damit gleich die Pfadangabe des Musik-Ordners als Konstante 'PLAYLIST_PATH' definieren.
Ob ein Sensor eine Konstante ist, ist vielleicht auch Geschmackssache, ich persönlich hätte den Pin als Konstante definiert und den Sensor dann in der 'main' an einen Namen gebunden.
Strings bastelt man nicht mit '+' zusammen, das kann man mit f-Strings machen oder in dem Fall gleich das importierte 'pathlib' nutzen.
Die zufällige Auswahl fand ich mit 'os' zwar schöner, aber vielleicht habe ich die richtige Funktion von 'pathlib' nur nicht gefunden.
Hier meine Version, ungetestet:
Python Alles anzeigen#!/usr/bin/env python3 import schedule from random import choice from pathlib import Path from time import sleep from ffpyplayer.player import MediaPlayer from gpiozero import MotionSensor MOTION_PIN = 7 PLAYLIST_PATH = Path('/home/pi/Music/') def play_song(): playlist = [] for song in PLAYLIST_PATH.iterdir(): playlist.append(song) choosen_song = random.choice(playlist) print (f'\nNow playing: {choosen_song.name}') player = MediaPlayer(choosen_song) def bewegung_erkennen_einschalten(motion_sensor): motion_sensor.when_motion = play_song def bewegung_erkennen_ausschalten(motion_sensor): motion_sensor.when_motion = None def main(): motion_sensor = MotionSensor(MOTION_PIN) schedule.every().day.at("08:00").do(bewegung_erkennen_einschalten, motion_sensor = motion_sensor) schedule.every().day.at("22:00").do(bewegung_erkennen_ausschalten, motion_sensor = motion_sensor) while True: schedule.run_pending() sleep(1) if __name__ == '__main__': main()
Am Laptop bestimmt wesentlich einfach, als am Handy, dort hätte ich nicht den Nerv dazu gehabt
Grüße
Dennis
Danke für eure Antworten und die Mühe, den ein oder anderen Code zu schreiben (egal ob übers Handy oder Laptop )
Dennis89 dein Code ist sehr viel sauberer als meiner, daher hab ich ihn einfach mal übernommen und getestet. Einiges hat schon geklappt, ich bin aber noch nicht am Ziel.
- Das gpiozero Interface ist installiert und arbeitet wie ich es beurteilen kann korrekt (Habe mir einen Trigger über eine Print-Ausgabe in der Main ausgeben lassen)
- Auch die schedule library ist installiert und funktioniert
Nun zu meinen Problemen:
- Ein Trigger wird zwar erkannt und ausgegeben, es wird jedoch kein Song abgespielt (hier weiß ich nicht, ob es an der Übergabe der Methoden scheitert, oder die play_song() Methode selbst probleme bereitet).
- Über die schedule Funktion ist es mir bislang nicht gelungen, eine dauerhafte Triggerabfrage zu coden. Innerhalb der definierten Zeit (08-22 Uhr) funktioniert der Trigger also nur einmal, anstatt - wie in meinem alten Code - nach jedem abgespielten Song (+180s Delay) einen neuen Trigger zu erwarten.
Habt ihr Ideen zu verbesserung? Unten wie immer der Code, mit dem ich aktuell arbeite. Danke euch!
import schedule
from random import choice
from pathlib import Path
from time import sleep
from ffpyplayer.player import MediaPlayer
from gpiozero import MotionSensor
pirPin = MotionSensor(7)
PLAYLIST_PATH = Path('/home/pi/Music/')
def play_song():
playlist = []
for song in PLAYLIST_PATH.iterdir():
playlist.append(song)
choosen_song = random.choice(playlist)
print (f'\nNow playing: {choosen_song.name}')
player = MediaPlayer(choosen_song)
def bewegung_erkennen_einschalten(motion_sensor):
motion_sensor.when_motion = play_song
print("bewegung_erkennen_einschalten_working")
def bewegung_erkennen_ausschalten(motion_sensor):
motion_sensor.when_motion = None
def main():
motion_sensor = pirPin
pirPin.wait_for_motion()
print("Motion detected!")
schedule.every().day.at("08:00").do(bewegung_erkennen_einschalten, motion_sensor = motion_sensor)
schedule.every().day.at("23:45").do(bewegung_erkennen_ausschalten, motion_sensor = motion_sensor)
while True:
schedule.run_pending()
sleep(1)
if __name__ == '__main__':
main()
Alles anzeigen