[GELÖST]
Hallo ich benutze folgenden Python-Code um mir eine 30sec. lange Audio-Aufnahme zu erstellen.
Die Aufnahme wird immer dann gestartet, wenn das Dummy-Gerät "RecordingSound" in den State ON wechselt.
siehe RecordingSoundON.jpg
import pyaudio
import wave
import datetime
import fhem
form_1 = pyaudio.paInt32 # 16-bit resolution
chans = 1 # 1 channel
samp_rate = 44100 # 44.1kHz sampling rate
chunk = 4096 # 2^12 samples for buffer
record_secs = 30 # seconds to record
dev_index = 1 # device index found by p.get_device_info_by_index(ii)
wav_output_filename = '/home/pi/Desktop/AudioRecordings/{date:%Y-%m-%d_%H:%M:%S}.wav'.format( date=datetime.datetime.now() ) # name of .wav file
audio = pyaudio.PyAudio() # create pyaudio instantiation
#for ii in range(audio.get_device_count()):
# print(audio.get_device_info_by_index(ii).get('name'))
# create pyaudio stream
stream = audio.open(format = form_1,rate = samp_rate,channels = chans, \
input_device_index = dev_index,input = True, \
frames_per_buffer=chunk)
print("recording")
frames = []
# loop through stream and append audio chunks to frame array
for ii in range(0,int((samp_rate/chunk)*record_secs)):
data = stream.read(chunk)
frames.append(data)
print("finished recording")
# stop the stream, close it, and terminate the pyaudio instantiation
stream.stop_stream()
stream.close()
audio.terminate()
# save the audio frames as .wav file
wavefile = wave.open(wav_output_filename,'wb')
wavefile.setnchannels(chans)
wavefile.setsampwidth(audio.get_sample_size(form_1))
wavefile.setframerate(samp_rate)
wavefile.writeframes(b''.join(frames))
wavefile.close()
_FHEM = fhem.Fhem(server="localhost",port=8083,protocol="http",password="xxxxxxx",username="pi",csrf=False)
_FHEM.connect()
if _FHEM.connected():
print("connected as fuck")
_FHEM.send_cmd("set RecordingSound off")
else:
print("Couldn't connect")
_FHEM.close()
Momentan setze ich das Dummy Gerät mittels eines Notify-Events auf ON
In dem Event wird geprüft ob das "Soundlevel" meines pt8005 Gerätes größer als 50 ist und falls das zutrifft, wird das Dummy Gerät auf ON gestellt
siehe SoundLevelOver50.JPG
sowie das Dummy Gerät auf ON wechselt wird das python-skript folgendendermaßen aufgerufen:
siehe ActOnRecording.JPG
jetzt blockiert jedoch der FHEM-Server solange, bis das Skript abgearbeitet ist.
Also mindestens 30 Sekunden lang.
Meine Frage ist jetzt wo ich wie eingreifen muss, damit das System das skript quasi in seinem eigenen thread abarbeitet.
Muss ich das im python-skript selbst machen oder stimmt vlt. etwas mit meinen notify-events nicht?
Bitte KEINE ScreenShots!
Besser copy paste von list-Ausgaben...
system("Befehl") blockiert...
...außer du packst ein & ans Ende -> schickt den Aufruf in den Hintergrund...
"Befehl" blockiert nicht...
https://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html
Hat das Otto noch nicht im anderen Thread erzählt? ;)
Gruß, Joachim
Otto hat mich im letzten Thread darauf hingewiesen dass das blockiert.
Das dann aber ein & ans ende hin muss wusste ich nicht
Ich dachte dass hatte dann etwas mit meiner anzahl an ; zu tun :)
wenn das schon alles war, dann werd ich das gleich mal ausprobieren und gegebenenfalls den thread schließen.
dankeschön
Zitat von: TheMonumental am 10 Juli 2021, 23:14:33
wenn das schon alles war, dann werd ich das gleich mal ausprobieren und gegebenenfalls den thread schließen.
Nicht schließen!
Nur als gelöst "markieren": vor den ersten Post ein [gelöst] o.ä. "pappen"...
Viel Erfolg, Joachim
Jawoll, es funktioniert jetzt wunderbar.
Herrlich. Vielen Dank.
Ok, dann werd ich das mal als gelöst markieren
Zitat von: TheMonumental am 10 Juli 2021, 23:30:16
Jawoll, es funktioniert jetzt wunderbar.
Herrlich. Vielen Dank.
Ok, dann werd ich das mal als gelöst markieren
Naja eher war gemeint im Titel des ersten Posts ;)
Gruß, Joachim
Moin,
Du hast den anderen Thread geschlossen, aber die Meldung an FHEM aus python heraus ist doch noch offen?
mMn arbeitet das Modul über Telnet (Port 7072) und Du hast Telnet in FHEM gar nicht definiert?
Kann sein das spielt auch keine Rolle, ich war nur der Meinung die Fertigmeldung sollte ev. synchron zur Audioerzeugung sein. So ist ja jetzt die Dateierzeugung nicht blockierend, aber die Fertigmeldung ist davon abgekoppelt.
Gruß Otto
Zitat von: Otto123 am 11 Juli 2021, 11:49:28
Moin,
Du hast den anderen Thread geschlossen, aber die Meldung an FHEM aus python heraus ist doch noch offen?
mMn arbeitet das Modul über Telnet (Port 7072) und Du hast Telnet in FHEM gar nicht definiert?
Kann sein das spielt auch keine Rolle, ich war nur der Meinung die Fertigmeldung sollte ev. synchron zur Audioerzeugung sein. So ist ja jetzt die Dateierzeugung nicht blockierend, aber die Fertigmeldung ist davon abgekoppelt.
Gruß Otto
Das mit Telnet habe ich mir auch gedacht (anhand des Porst ;) ), wollte aber nicht "dazwischen pfuschen" ;)
Aber er kann ja den Thread wieder aufmachen (oder?), sollte doch noch was fehlen...
Gruß, Joachim
Moin,
Den Thread hab ich geschlossen da meine ursprüngliche Frage ja beantwortet war. "Wie führe ich ein Python Script aus".
Von Bug-Reporting, Supporttickets und Stackoverflow her kenne ich, dass man das so in der Regel macht.
Ich wollte "[Gelöst]" auch in den Titel schreiben, da hat nur der Platz nicht mehr gereicht und den Titel anpassen wollte ich auch nicht, da meiner Meinung nach,
die Fragestellung für Neulinge oder nicht technisch versierte Leute sonst nicht aussagekräftig genug wäre.
Das Telnet Protocol konnte ich aushebeln indem ich der FHEM()-Funktion den protocol-parameter mit "http" übergeben habe und den Port konnte ich so auch anpassen.
Seit Version 5.8 von FHEM wird bei Anfragen über http ein zusätzliches csfr-Token verlangt.
Das kann man zwar deaktivieren allerdings hat man dann eine Sicherheitslücke.
Da das Gerät allerdings nur bei mir daheim läuft ist das für mich nicht großartig relevant.
Wichtiger war mir erst einmal die Audio-Aufnahmen hinzubekommen, dass ich das Thema abschließen kann.
Momentan funktioniert alles genau so wie ich es mir vorgestellt habe.
Ich konnte das ganze bereits unter Extrem-Bedingungen testen.
Da es gestern hier geregnet hat, hat mein Schallpegelmessgerät ganz oft über 50db ausgeschlagen und ich hab heute früh ca. 1.3GB an Audio Dateien aufgenommen.
Zitat von: TheMonumental am 11 Juli 2021, 12:20:22
Ich wollte "[Gelöst]" auch in den Titel schreiben, da hat nur der Platz nicht mehr gereicht und den Titel anpassen wollte ich auch nicht, da meiner Meinung nach,
die Fragestellung für Neulinge oder nicht technisch versierte Leute sonst nicht aussagekräftig genug wäre.
Wäre verm. trotzdem besser gewesen, weil dann bei Suchergebnissen schon zu ersehen ist, dass es gelöst ist... :)
Zitat von: TheMonumental am 11 Juli 2021, 12:20:22
Das kann man zwar deaktivieren allerdings hat man dann eine Sicherheitslücke.
Da das Gerät allerdings nur bei mir daheim läuft ist das für mich nicht großartig relevant.
Wichtiger war mir erst einmal die Audio-Aufnahmen hinzubekommen, dass ich das Thema abschließen kann.
Die Sicherheitslücke bleibt!!!
Egal, ob du es nur bei dir nutzt!
Wenn du so argumentierst, dann hast du csrf NICHT verstanden...
Aber es ist und bleibt ja deine Lücke...
Ausser: du hast wenigstens einen "fixen Token" gesetzt.
Zitat von: TheMonumental am 11 Juli 2021, 12:20:22
Momentan funktioniert alles genau so wie ich es mir vorgestellt habe.
Ich konnte das ganze bereits unter Extrem-Bedingungen testen.
Da es gestern hier geregnet hat, hat mein Schallpegelmessgerät ganz oft über 50db ausgeschlagen und ich hab heute früh ca. 1.3GB an Audio Dateien aufgenommen.
Na dann viel Spaß damit! :)
Gruß, Joachim
ok, dann ist ja alles gut :)
Zum csrf Token hatte ich mal diesen Artikel gemacht https://wiki.fhem.de/wiki/CsrfToken-HowTo
Du kannst für Anwendungen die dafür nicht vorbereitet sind (was eigentlich "arm" ist) ein extra abgesichertes Web definieren.
Im Wiki ist auch ein Stück python Code enthalten, der csrf berücksichtigt - hab ich gestern nicht dran gedacht. ;)
Man kann auch einfach Telnet definieren und absichern ;)
Die Annahme hier: "Da das Gerät allerdings nur bei mir daheim läuft ist das für mich nicht großartig relevant." Ist allerdings mMn ein Irrglaube. So wie ich die Sache verstanden hab: bist "Du" das Problem, an deinem normalen PC, während Du im Browser die ganzen Fenster in Deinem Netzwerk offen hast.
Gruß Otto
Zitat von: Otto123 am 11 Juli 2021, 12:30:42
Die Annahme hier: "Da das Gerät allerdings nur bei mir daheim läuft ist das für mich nicht großartig relevant." Ist allerdings mMn ein Irrglaube. So wie ich die Sache verstanden hab: bist "Du" das Problem, an deinem normalen PC, während Du im Browser die ganzen Fenster in Deinem Netzwerk offen hast.
EXAKT :)
Gruß, Joachim
Ich gebe euch natürlich recht bezüglich csrf.
Ich hätte besser sagen sollen, dass es nicht so zeitkritisch relevant ist wie die Messung zum laufen zu bringen.
jetzt da die laufen kann ich mich entsprannter dem thema widmen.
telnet hab ich schon installiert bei meinem raspi. das werd ich auch nochmal versuchen. Im python modul von
fhem oder auf der git-seite steht aber drin dass es "deprecated" ist.
Du brauchst (verm.) kein Telnet auf dem System sondern Telnet "in" fhem.
Wurde irgendwann aus der Standard-Konfig rausgenommen...
Musst du eben "definieren"...
Gruß, Joachim