Hi,
leider fehlgeschlagen, mein fire tablet hat os 4.5.5.3, das läßt sich nicht updaten.
Hi,
leider fehlgeschlagen, mein fire tablet hat os 4.5.5.3, das läßt sich nicht updaten.
Danke für die Tipps.
Ich habe mal nach Sensoren geguckt und werde mal mit dem Abstandssensor experimentieren. Das sollte besser als mit dem Bewegungsmelder funktionieren.
Will mir einen Sensor-Kit zulegen, weiß noch nicht, welcher am besten ist (tendiere zu Sunfound Sensor kit V2).
Nein, eine Fernbedienung / Konsole / etc. kann mein Sohn nicht bedienen.
Ginge die WLAN Variante nicht auch mit einem zweiten kleinen raspi?
Sorry, aber "ein paar Ampere" wäre heftig, wenn die vom Netz abgenommen würden Aber du hast recht, der Raspi zieht kaum Strom, das probiere ich einfach mal aus. Ansonsten gibt es ja auch Schaltaktoren.
Mit Json habe ich noch nicht gearbeitet, schau ich mir aber an.
Danke für deine Tipps.
Ist es beim raspi nicht so, dass der nur herunterfährt aber nicht vom Stromnetz trennt? Jedenfalls leuchtet die rote LED immer, auch wenn er runtergefahren ist. Trotzdem kann ich die Master-Slave Dose probieren, da kann man ja mit einem Poti den Pegel einstellen, ab dem er schaltet.
Wegen der Schwierigkeiten mit der remote Steuerung will ich nun ein geplantes Projekt vorziehen:
Musik und Video Player ...
cool, Danke, das wird ausprobiert!!
Liebes Forum,
ich habe für meinen behinderten Sohn eine Musikanlage (siehe Foto) gebaut, die Musik von der SD Karte abspielt, einen Ein/Aus Schalter hat und einen Bewegungsmelder zum Weiterschalten des Musikstückes.So kann er das Gerät steuern (Tastendruck, Hand an Bewegungsmelder halten).
Bisheriger Aufbau:
Raspi 3B+ mit Hifiberry DAC+ im Holzgehäuse
Taste für Ein/Aus per python scrypt realisiert
Bewegungsmelder auf dem Gehäusedeckel, durch Nagellack auf einen engen Erfassungskegel reduziert (reagiert leider trotzdem manchmal auch auf entfernte Bewegungen, der Radius lässt sich nur auf minmal 3m verkleinern per Poti)
Aktivlautsprecher 2.1
Ohne Monitor, Tastatur, Maus
Raspbian Strech
Kodi mit addon für Bewegungsmelder (python service script), Kodi startet automatisch im Modus Abspielen einer automatischen playlist von Musiktiteln auf der SD Karte
Remotezugriff per Teamviewer und Yatse
Dies will ich nun ausbauen für Video und suche Erfahrungen, vielleicht sogar Beispiele für das folgende Projekt:
Zusätzlich:
Monitor ca 22 Zoll, Wandbefestigung, Halterung vorhanden
Der Monitor sollte vom Raspi aus automatisch ein/aus geschaltet werden. Der vorhandene Schalter am Monitor muss deaktiviert werden. Alternativ Schalten des raspberry durch Betätigen des vorhandenen Schalters am Monitor.
Der Raspi muß fest montiert werden, am besten unterhalb des Monitors, z.B. an der Wandhalterung. Der Bewegungsmelder kann dann hinter dem Monitor angebracht werden und richtet den Erkennungskegel zur Seite weg.
Dann braucht es einen zweiten Bewegungsmelder und einen zweiten Ein/Aus Schalter, der über Funk / WLAN / Bluetooth mit dem raspi kommuniziert und ebenfalls das Skippen / Schalten ermöglicht. Das braucht mein Sohn, wenn er auf dem Bett sitzt und Musik hören will.
Ein weiterer Bewegungsmelder, der von Musik auf Video schaltet, wenn mein Sohn sich vor den Monitor setzt.Und auf Musik schaltet, wenn er wieder weg geht.
Die Aktivlautsprecher bleiben einfach immer eingeschaltet (vielleicht kann man eine Funksteckdose nehmen, die der raspi ansteuert? Dafür suche ich auch Erfahrungen, Beispiele, ist aber zweitrangig.)
Alle Kabel müssen vor dem Herausziehen gesichert sein, am besten hinter einer Abdeckung.
Lautstärkeregler (kann nur von Helfern bedient werden)
Tastatur und Maus sollen zu Wartungszwecken bei Bedarf anschliessbar sein (Buchsen im Gehäuse oder per Funk).
Musik läuft per Zufallsplaylist von der SD Karte
Video analog, ich lade dazu passende Videos von Youtube etc. runter.
Ich hoffe, es wird einigermassen klar, was ich will und ihr habt Ideen und Beispiele dazu.
LG Ernestopheles
Quellcodes:
import xbmc
import xbmcaddon
import RPi.GPIO as GPIO
import time
class MyPlayer(xbmc.Player):
def __init__ (self):
xbmc.Player.__init__(self)
SENSOR_PIN = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN,pull_up_down=GPIO.PUD_UP)
def mein_callback(channel):
# skip = xbmc.executebuiltin("Player.GetPlayingFile")
xbmc.executebuiltin("PlayerControl(Next)")
GPIO.add_event_detect(SENSOR_PIN , GPIO.FALLING, callback=mein_callback)
fobj_out = open('skipped.txt', 'a')
fobj_out.write('Start am ' + time.strftime("%d.%m.%Y %H:%M:%S") + '\n')
fobj_out.close()
monitor = xbmc.Monitor()
player = MyPlayer()
try:
fobj_out = open('skipped.txt', 'a')
# while not xbmc.Monitor.waitForAbort(monitor):
while True:
if GPIO.event_detected(SENSOR_PIN):
if player.isPlayingAudio():
# text = 'Skipped: ' + str(player.getPlayingFile())
text = 'Skipped: ' + time.strftime("%d.%m.%Y %H:%M:%S") + xbmc.getInfoLabel("player.Title").decode('utf-8','ignore')
# else:
# text = 'not playing audio'
fobj_out.write(text + '\n')
time.sleep(1)
# if xbmc.Monitor.waitForAbort(monitor):
# print("")
# break
except KeyboardInterrupt:
print("Keyboard Interruption issued, Stopping...")
except:
print("Exception")
finally:
#print("finally reached")
#fobj_out.close()
#fobj_out = open('skipped.txt', 'a')
fobj_out.write('Ende am ' + time.strftime("%d.%m.%Y %H:%M:%S") + '\n')
fobj_out.close()
GPIO.cleanup()
Alles anzeigen
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.service.playnext" name="play-next" version="0.0.1" provider-name="ej">
<requires>
<import addon="xbmc.python" version="2.20.0"/>
</requires>
<extension point="xbmc.service" library="pir.py" />
<extension point="xbmc.addon.metadata">
<summary lang="en_GB">Bewegungsmelder script</summary>
<description lang="en_GB">a script to skip playback to the next titel when movement detected</description>
<language></language>
<platform>all</platform>
</extension>
</addon>
Alles anzeigen
#!/usr/bin/python
# shutdown / power on Raspberry Pi with pushbutton
# pushbutton: NO connected to GPIO 3, normally open and shuts at button press
# Button press starts raspberry if off (connecting GPIO 3 to GND) and does nothing if raspberry is already on
import RPi.GPIO as GPIO
from subprocess import call
from datetime import datetime
import time
# pushbutton: NC connected to GPIO 27, normally closed and opens at button press
# we want a shutdown if button is pressed meaning GPIO 27 opens
shutdownPin = 27
# button debounce time in seconds
debounceSeconds = 0.01
GPIO.setmode(GPIO.BCM)
GPIO.setup(shutdownPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
#GPIO.setup(shutdownPin, GPIO.IN)
#GPIO.setup(shutdownPin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
buttonPressedTime = datetime.now()
def buttonStateChanged(pin):
print("button pressed")
global buttonPressedTime
if not (GPIO.input(pin)):
# button is down
print("not GPIO.input(pin)")
# if buttonPressedTime is None:
buttonPressedTime = datetime.now()
else:
print("GPIO.input(pin):")
print(pin)
# button is up
#if buttonPressedTime is not None:
elapsed = (datetime.now() - buttonPressedTime).total_seconds()
buttonPressedTime = datetime.now()
if elapsed >= debounceSeconds:
# button pressed for a shorter time, also shutdown
call(['shutdown', '-h', 'now'], shell=False)
# subscribe to button presses
GPIO.add_event_detect(shutdownPin, GPIO.BOTH, callback=buttonStateChanged)
while True:
# sleep to reduce unnecessary CPU usage
time.sleep(5)
GPIO.cleanup()
Alles anzeigen
Kodi spielt nur Musik ab...
Es ist ein Musicplayer für einen Menschen, der keine Stereoanlage bedienen kann. Von einer automatischen playlist werden songs abgespielt, die Person kann über einen Sensor einen Titel skippen.
Habe es durch weitere Recherche herausgefunden: Teamviewer verwendet zur GUI Darstellung eine Hardware-Komponente die der Teamviewer nicht darstellt. Raspi Forum
Eine andere Lösung habe ich bisher nicht gefunden.
Verwende raspian stretch latest version und kodi desktop latest version, raspi 3B+.
Möchte, da Gerät ohne Monitor und Tastatur eingesetzt ist, per remote Zugriff das Kodi konfigurieren (Bibliothek bzw. Playlist aktualisieren, Addon installieren ,...). Mit Teamviewer gehts also nicht. Remote desktop auch nicht so weit ich mich erinnere. Es wird der desktop angezeigt, ein Kodi Bildschirm nicht.
Hinzu kommt, dass das Gerät an einem enrfernten Ort steht, Vodafone DSL mit Vodafone Router. Der hat glaube ich schon eine dauerhaft feste IP Adresse, allerdings nur IPv6. Bei Ansteuerung über "normale" Clients (SSH, VNC) wird ja die IP Adresse (IPv4) benötigt. Kann vor Ort z.B. mit Yatse ansteuern, aber kein Update der Bibliothek machen.
Habe auch Musikdateien, die Kodi nicht abspielt (Fehler im Log). Allerdings nicht feststellbar, a) welche Datei (Dateiname auf dem Speicher) und b) warum nicht abspielbar. Siehe dazu meinen Forumbeitrag: Fehler init codec
Liebes Forum,
ich greife auf den raspi per Teamviewer zu, leider sehe ich da nicht die GUI des gestarteten Kodi. Kodi startet leider im Vollbildmodus, konnte ich bisher auch nicht ändern auf Fenstermodus.
Nein, es ist nicht der Dateiname 4.mp3, das ist offenbar ein Datenbankeintrag. Der tatsächliche Dateinamen oder Titel muss sich aus dem String ergeben, denke ich. Aber wie?
Liebes Forum,
mein Kodi unter raspberrypi raspbian stretch bringt hin und wieder im [definition=9,2]kodi.[definition='1','0']log[/definition][/definition] das folgende:
0:12:11.798 T:1583829760 ERROR: CAudioDecoder: Error while decoding 120:34:03.099 T:1492120320 ERROR: Init: Error opening file musicdb://songs/4.mp3?xsp=%7b%22order%22%3a%7b%22direction%22%3a%22ascending%22%2c%22ignorefolders%22%3a0%2c%22method%22%3a%22random%22%7d%2c%22rules%22%3a%7b%22and%22%3a%5b%7b%22field%22%3a%22time%22%2c%22operator%22%3a%22lessthan%22%2c%22value%22%3a%5b%2210%3a00%22%5d%7d%5d%7d%2c%22type%22%3a%22songs%22%7d20:34:03.100 T:1492120320 ERROR: CAudioDecoder: Unable to Init Codec while loading file musicdb://songs/4.mp3?xsp=%7b%22order%22%3a%7b%22direction%22%3a%22ascending%22%2c%22ignorefolders%22%3a0%2c%22method%22%3a%22random%22%7d%2c%22rules%22%3a%7b%22and%22%3a%5b%7b%22field%22%3a%22time%22%2c%22operator%22%3a%22lessthan%22%2c%22value%22%3a%5b%2210%3a00%22%5d%7d%5d%7d%2c%22type%22%3a%22songs%22%7d20:34:03.100 T:1492120320 WARNING: PAPlayer::QueueNextFileEx - Failed to create the decoder
Frage: woran liegt es und kann man aus den Angaben die betreffende Musikdatei ermitteln?
Danke für jede Hilfe.
Ernestopheles
cool, das nehmen wir dann doch. Danke für den Tipp.
Fire hat nur einen eigenen playstore, kann nicht auf Googles störe zugreifen. Yatse ist leider nicht dabei.
Moin,
suche eine Fernbedienungs app für kodi auf einem Fire-7 tablet. Gibts sowas?
du solltest bei "waitForAbort" nicht "monitor" übergeben sonder die Zeit die gewartet werden soll.
probier mal sowas
xbmc.Monitor.waitForAbort(1) gab bei mir eine exception, es werde kein integer verlangt, sondern ein object. daher meine Anpassung, die ja funktioniert, wenn auch nicht ohne Nebenwirkungen...
Jetzt ist alles bestens, bis auf die fehlende Abort-Behandlung. Soll Kodi beim Verlassen also weiterhin das script nach 5 Sec killen, macht fast gar nix.
Offen ist auch die Frage, warum häufig audio not playing erkannt wird, das aber nur aus akademischem Interesse.
Dumm ist auch, dass ich 2 Bedingungen für die Bewegungserkennung habe, das kostet unnötige Resourcen, zumal die If-Abfrage ja ständig wiederholt wird.
Ich lass es jetzt erst mal so, verbessern kann ich immer noch, Hauptsache es läuft.
Das ganze Projekt stelle ich später als ganzes vor.
Danke euch allen und liebe Grüße
Habe etwas weiter gearbeitet, diese Lösung funktioniert noch nicht:
1. Wenn die Schleife eine Endebedingung über den Abort (Verlassen des Kodi) hat - entweder über die auskommentierte Whilebedingung oder mittels des break - werden nur die Start- und die Endezeile in die Datei geschrieben.
2. Meistens erhalte ich eine Zeile "not playing audio", obwohl die ganze Zeit über Musik läuft (von einer automatischen Playlist). Das auch dann, wenn ich die Bedingung if GPIO.event_detected(SENSOR_PIN) fortlasse. In wenigen Versuchen erhalte ich tatsächlich eine Ausgabe des Musikstückes, dann allerdings in nicht brauchbarer Form:
Skipped: musicdb://songs/61.mp3?xsp=%7b%22order%22%3a%7b%22direction%22%3a%22ascending%22%2c%22ignorefolders%22%3a0%2c%22method%22%3a%22random%22%7d%2c%22rules%22%3a%7b%22and%22%3a%5b%7b%22field%22%3a%22time%22%2c%22operator%22%3a%22lessthan%22%2c%22value%22%3a%5b%2210%3a00%22%5d%7d%5d%7d%2c%22type%22%3a%22songs%22%7d
Das ist offenbar die Definition der Playlist.
Wenn ich nicht die automatische Playlist laufen habe, sondern Musik so laufen lasse, erhalte ich den Dateinamen in der Datenbank, z.B. 24.m4a, auch nicht wirklich ausagekräftig...
Durch Fortlassen der Abortbedingung erhöht sich die Frequenz der Dateiausgaben erheblich. Damit wird offenbar hinreichend häufig der verklausulierte Dateinamen ausgegeben, sodass das script so belassen werden kann, wenn ich nur den wirklichen Musiktitel nur irgendwie ausgeben könnte.
import xbmc
import xbmcaddon
import RPi.GPIO as GPIO
import time
class MyPlayer(xbmc.Player):
def __init__ (self):
xbmc.Player.__init__(self)
SENSOR_PIN = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN,pull_up_down=GPIO.PUD_UP)
def mein_callback(channel):
# skip = xbmc.executebuiltin("Player.GetPlayingFile")
xbmc.executebuiltin("PlayerControl(Next)")
GPIO.add_event_detect(SENSOR_PIN , GPIO.FALLING, callback=mein_callback)
fobj_out = open('skipped.txt', 'a')
fobj_out.write('Start am ' + time.strftime("%d.%m.%Y %H:%M:%S") + '\n')
fobj_out.close()
monitor = xbmc.Monitor()
player = MyPlayer()
try:
# while not xbmc.Monitor.waitForAbort(monitor):
fobj_out = open('skipped.txt', 'a')
while True:
if GPIO.event_detected(SENSOR_PIN):
if player.isPlayingAudio():
text = 'Skipped: ' + str(player.getPlayingFile())
else:
text = 'not playing audio'
fobj_out.write(text + '\n')
time.sleep(1)
if xbmc.Monitor.waitForAbort(monitor):
print("")
# break
except KeyboardInterrupt:
print("Keyboard Interruption issued, Stopping...")
finally:
print("finally reached")
fobj_out.close()
fobj_out = open('skipped.txt', 'a')
fobj_out.write('Ende am ' + time.strftime("%d.%m.%Y %H:%M:%S") + '\n')
fobj_out.close()
GPIO.cleanup()
Alles anzeigen
Dies ist meine funktionierende Lösung. Leider fehlt die Ausgabe des übersprungenen Musikstücks. Vielleicht hat jemand eine Idee?
Danke euch.
import xbmc
import xbmcaddon
import RPi.GPIO as GPIO
import time
SENSOR_PIN = 23
GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_PIN, GPIO.IN,pull_up_down=GPIO.PUD_UP)
def mein_callback(channel):
# skip = xbmc.executebuiltin("Player.GetPlayingFile")
# skip = xbmc.Player.GetItem()
xbmc.executebuiltin("PlayerControl(Next)")
GPIO.add_event_detect(SENSOR_PIN , GPIO.FALLING, callback=mein_callback)
fobj_out = open('skipped.txt', 'a')
fobj_out.write('Start am ' + time.strftime("%d.%m.%Y %H:%M:%S") + '\n')
fobj_out.close()
monitor = xbmc.Monitor()
try:
while not xbmc.Monitor.waitForAbort(monitor):
time.sleep(1)
except KeyboardInterrupt:
print("Beende...")
fobj_out = open('skipped.txt', 'a')
fobj_out.write('Ende am ' + time.strftime("%d.%m.%Y %H:%M:%S") + '\n')
fobj_out.close()
GPIO.cleanup()
Alles anzeigen
Danke für eure Tipps, habe das Problem lösen können. Die Keyboard Funktion benötigt Admin rechte, daher gings unter kodi nicht. Habe es anders gelöst. Werde es dokumentieren und demnächst den Link hier posten. Danke nochmals.