Hallo,
Ich habe ein Schallpegelmessgerät an meinem Raspi angeschlossen und bekomme alle 5 sekunden eine Info darüber wie laut es gerade ist.
Jetzt will ich zusätzlich dazu eine Audio-Aufnahme machen
jedes mal wenn die Lautstärke > 50 ist und das Gerät nicht im Aufnahme modus ist.
Die Audio-Aufnahme starte ich über ein python-Skript mit pyAudio.
Über das Terminal und über die IDE lassen sich so auch bereits Audio-Dateien erzeugen.
Ich verstehe noch nicht so ganz wie ich jetzt das skript über FHEM ausführe.
(siehe Everything.jpg)
Ich habe mir für die Aufnahme ein Dummy Gerät "RecordingSound" angelegt
und ein notify "ActOnRecording" angelegt.
Wenn ich bei meinem Dummy Gerät auf ON drücke wird "ActOnRecording" ausgeführt.
Das Notify ist folgendermaßen definiert:
RecordingSound:on {system("python3 /home/pi/Desktop/AudioRecordings/Record30Secs.py");;;; fhem "set RecordingSound off"}
Und mein Skript sieht folgendermaßen aus:
import pyaudio
import wave
import datetime
form_1 = pyaudio.paInt16 # 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
# 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()
In der Datei "Logfile.jpg" seht ihr einen Auschnitt von dem was passiert wenn ich auf ON drücke.
Das sind fast diesselben Meldungen die ich auch über das Terminal und über die IDE bekomme wenn ich das Skript ausführe.
nur dass er niemals zu dem
print("recording")
..
print("finished recording")
kommt, die Lampe des Dummy-Geräts geht auch nicht an und eine Audio-Datei wird auch nicht erstelllt.
und ich weiß jetzt nicht mehr weiter.
Falls mir da jemand behilflich sein kann wäre das super.
Hi,
Eine spontane Idee:
Der user fhem ist normalerweise nicht in der Gruppe audio. Hast Du ihn dort hinein getan?
sudo usermod -aG audio fhem
Gruß Otto
Hallo Otto,
Ich hab den Befehl mal ausgeführt, und dann nochmal versucht das Skript über "On" zu starten.
Leider hat sich nichts geändert.
Du bekommst sehrviele fehlermeldungen bezüglich der Sound-Card.
Deshalb: Funktioniert das Script ohne FHEM?
Mit welchem User bisher getestet?
Bzw:
Als Du FHEM in die Gruppe audio aufgenommen hast, hast Du fhem anschließen neu gestartet?
Ah der neustart hat noch gefehlt.
Vielen lieben dank.
Um deine Fragen noch zu beantworten:
Das Script hat ohne FHEM funktioniert.
als user su und als user pi
sowohl im terminal als auch über die IDE.
Jetzt fehlt mir noch noch die Möglichkeit den ON-Wert zu setzen wenn das Soundlevel von meinem Gerät > 50 ist.
Falls der Code aus der DEF ist:
RecordingSound:on {system("python3 /home/pi/Desktop/AudioRecordings/Record30Secs.py");;;; fhem "set RecordingSound off"}
würde ein semikolon reichen :
RecordingSound:on {system("python3 /home/pi/Desktop/AudioRecordings/Record30Secs.py"); fhem "set RecordingSound off"}
Dein Script wird fhem blockieren.
Wenn set RecordingSound am Ende des Scripts erfolgen muss, würde ich den Befehl im Script integrieren und das Script nicht blockierend starten.
Es gibt für python eine FHEM Library um das zu implementieren.
Was Du bei Deiner letzten Frage als Hilfe brauchst erschließt sich mir nicht. Mir fehlen wahrscheinlich Infos.
Gruß Otto
Also ich werd mal versuchen das hinzubekommen.
Falls aber noch jemand was dazu sagen kann wäre ich sehr dankbar.
im Screenshot sieht man die readings des Geräts.
Bisher denke ich dass das Event so definiert werden muss:
define pt8005_SoundLevel_over notify pt8005:soundlevel>50 set RecordingSound on
ich hab aber noch keine konkreten Beispiele gefunden, deswegen weiß ich nicht ob das so korrekt ist.
Du kannst ein notify vom Eventmonitor erzeugen lassen: https://wiki.fhem.de/wiki/Notify
Du kannst keinen Trigger mit größer als machen, aber in dem Wikiartikel ist notify in vielen Situationen erklärt und es sind entsprechende Beispiele (Perl Code) wie es einfach zumachen ist. So in etwa:
define pt8005_SoundLevel_over notify pt8005:soundlevel:.* { if ($EVTPART1 > 50) { fhem("set RecordingSound on") } }
Suchreihenfolge nach Beispielen:
commandref
Wiki
Forum
Internet - Vorsicht! bei den Artikel und Videos aufs Datum achten! FHEM entwickelt sich täglich weiter, was 2017 mal "state of the art" war muss heute nicht mehr stimmen.
Gruß Otto
@Otto
Korrekt dass ist der Code aus der DEF.
Ich hab überall gelesen, dass mit den {}
Perl-Code ausgeführt wird, und dass man dann gewisse zeichen escapen muss.
um ein ; darzustellen, muss man dann ;; schreiben.
ich werde deinen rat befolgen und aus dem skript heraus den schalter wieder auf OFF setzen und les mir mal das Wiki durch.
Hoffentlich krieg ich dass dann hin.
ja das mit den semikolons ist nicht einfach, hier die Doku https://fhem.de/commandref_DE.html#command
Bedeutet:
FHEM Kommando in der FHEM Befehlszeile und im DEF Editor: einfach
Im PerlCode in der FHEM Befehlszeile, in der Raw Definition und der fhem.cfg: doppelt
Bei Verschachtelung dieser beiden Typen wird es dann schwieriger :)
Meist ist es egal: viel hilft nicht viel - aber wird toleriert - z.B. beim FHEM sleep Befehl führt es aber zu anderen/unerwarteten Ergebnissen.
Wie geb ich denn einen Befehl aus Python an FHEM weiter?
Also ich hab jetzt erstmal das hier gemacht.
https://tyrotechsoft.de/post/fhem-python3-fhem-integration/
aber beim ausführen vom skript sagt er mir jetzt:
2021.07.10 16:26:46 3: FHEMWEB WEB CSRF error: csrf_448548653699931 ne csrf_112318195249757 for client WEB_192.168.2.120_53173 / command set RecordingSound off. For details see the csrfToken FHEMWEB attribute.
Traceback (most recent call last):
File "/home/pi/Desktop/AudioRecordings/Record30Secs.py", line 4, in <module>
import fhem
ModuleNotFoundError: No module named 'fhem'
2021.07.10 16:26:47 3: ActOnRecording return value: -1
diese beiden Zeilen hab ich ende meines scripts hinzugefügt:
_FHEM = fhem.Fhem("localhost")
_FHEM.send_cmd("set RecordingSound off")
aus meiner IDE bekomm ich die Meldung:
Zitat
recording
finished recording
Failed to connect to localhost:7072
Failed to send msg, len=22. Not connected.
ZitatNo module named 'fhem'
da ist doch beim setup was schief gegangen?
also mit dem befehl
pip3 list
seh ich das modul.
mit
pip list
jedoch nicht.
also geh ich davon aus, dass fhem eine andere version für python benutzt.
Also ich hab mir mal die geladenen Module ausgeben lassen im skript mit help("modules")
in der IDE:
DEBUG:matplotlib:loaded modules: ['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', 'site', 'os', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', '_bootlocale', '_locale', 'types', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'logilab', 'mpl_toolkits', 'sitecustomize', 'runpy', 'pkgutil', 'weakref', '_weakrefset', 'thonny', 'platform', 're', 'enum', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg', 'subprocess', 'time', 'signal', 'errno', '_posixsubprocess', 'select', 'selectors', 'collections.abc', 'math', 'threading', 'traceback', 'linecache', 'tokenize', 'token', 'logging', 'string', '_string', 'atexit', 'typing', 'typing.io', 'typing.re', 'thonny.plugins', 'thonny.plugins.cpython', 'tkinter', '_tkinter', 'tkinter.constants', 'tkinter.messagebox', 'tkinter.commondialog', 'tkinter.ttk', 'thonny.ui_utils', 'queue', '_queue', 'textwrap', 'tkinter.font', 'tkinter.filedialog', 'tkinter.dialog', 'fnmatch', 'thonny.misc_utils', 'shlex', 'thonny.tktextext', 'thonny.common', 'ast', '_ast', 'thonny.languages', 'gettext', 'locale', 'thonny.running', 'thonny.editors', 'thonny.base_file_browser', 'datetime', '_datetime', 'thonny.codeview', 'thonny.roughparse', 'thonny.workdlg', 'thonny.plugins.backend_config_page', 'thonny.backend', 'pathlib', 'ntpath', 'urllib', 'urllib.parse', 'thonny.config_ui', 'thonny.terminal', 'thonny.plugins.cpython.cpython_backend', 'dis', 'opcode', '_opcode', 'inspect', 'pydoc', 'thonny.jedi_utils', 'encodings.ascii', 'faulthandler', 'thonny.plugins.backend', 'thonny.plugins.backend.birdseye_backend', 'thonny.plugins.backend.dock_user_windows_backend', 'thonny.plugins.backend.flask_backend', 'thonny.plugins.backend.matplotlib_backend', 'thonny.plugins.backend.pgzero_backend', 'pgzero', 'pyaudio', '_portaudio', 'wave', 'audioop', 'struct', '_struct', 'chunk', 'asyncio', 'asyncio.base_events', 'concurrent', 'concurrent.futures', 'concurrent.futures._base', 'socket', '_socket', 'ssl', '_ssl', 'base64', 'binascii', 'asyncio.constants', 'asyncio.coroutines', 'asyncio.base_futures', 'asyncio.format_helpers', 'asyncio.log', 'asyncio.events', 'contextvars', '_contextvars', 'asyncio.base_tasks', '_asyncio', 'asyncio.futures', 'asyncio.protocols', 'asyncio.sslproto', 'asyncio.transports', 'asyncio.tasks', 'asyncio.locks', 'asyncio.runners', 'asyncio.queues', 'asyncio.streams', 'asyncio.subprocess', 'asyncio.unix_events', 'asyncio.base_subprocess', 'asyncio.selector_events', 'ctypes', '_ctypes', 'ctypes._endian', 'curses', '_curses', 'dbm', 'dbm.ndbm', '_dbm', 'distutils', 'distutils.command', 'email', 'email.mime', 'ensurepip', 'glob', 'tempfile', 'shutil', 'zlib', 'bz2', '_compression', '_bz2', 'lzma', '_lzma', 'pwd', 'grp', 'random', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'html', 'html.entities', 'http', 'json', 'json.decoder', 'json.scanner', '_json', 'json.encoder', 'lib2to3', 'lib2to3.fixes', 'lib2to3.pgen2', 'multiprocessing', 'multiprocessing.context', 'multiprocessing.process', 'multiprocessing.reduction', 'pickle', '_compat_pickle', '_pickle', 'array', '__mp_main__', 'multiprocessing.dummy', 'multiprocessing.dummy.connection', 'pydoc_data', 'sqlite3', 'sqlite3.dbapi2', '_sqlite3', 'test', 'test.libregrtest', 'test.libregrtest.cmdline', 'argparse', 'test.support', 'gc', 'logging.handlers', 'nntplib', 'email.header', 'email.quoprimime', 'email.base64mime', 'email.errors', 'email.charset', 'email.encoders', 'quopri', 'sysconfig', 'unittest', 'unittest.result', 'unittest.util', 'unittest.case', 'difflib', 'pprint', 'unittest.suite', 'unittest.loader', 'unittest.main', 'unittest.runner', 'unittest.signals', 'urllib.error', 'urllib.response', 'test.support.testresult', 'xml', 'xml.etree', 'xml.etree.ElementTree', 'xml.etree.ElementPath', 'copy', 'pyexpat.errors', 'pyexpat.model', 'pyexpat', '_elementtree', 'gzip', 'resource', '_sysconfigdata_m_linux_arm-linux-gnueabihf', 'test.libregrtest.main', 'test.libregrtest.runtest', 'test.libregrtest.refleak', 'test.libregrtest.save_env', '_multiprocessing', 'test.libregrtest.setup', 'test.libregrtest.utils', 'venv', 'wsgiref', 'xml.dom', 'xml.dom.domreg', 'xml.parsers', 'xml.sax', 'xml.sax.xmlreader', 'xml.sax.handler', 'xml.sax._exceptions', 'xmlrpc', 'fhem', 'urllib.request', 'http.client', 'email.parser', 'email.feedparser', 'email._policybase', 'email.utils', 'email._parseaddr', 'calendar', 'email.message', 'uu', 'email._encoded_words', 'email.iterators', 'Crypto', 'Crypto.Cipher', 'Crypto.Hash', 'Crypto.Protocol', 'Crypto.PublicKey', 'Crypto.Random', 'Crypto.Random.OSRNG', 'Crypto.Random.OSRNG.posix', 'Crypto.Random.OSRNG.rng_base', 'Crypto.Util', 'Crypto.Util.py3compat', 'Crypto.Random._UserFriendlyRNG', 'Crypto.Random.Fortuna', 'Crypto.Random.Fortuna.FortunaAccumulator', 'Crypto.pct_warnings', 'Crypto.Random.Fortuna.SHAd256', 'Crypto.Hash.SHA256', 'Crypto.Hash.hashalgo', 'Crypto.Random.Fortuna.FortunaGenerator', 'Crypto.Util.number', 'Crypto.PublicKey._fastmath', 'Crypto.Util._number_new', 'Crypto.Util.Counter', 'Crypto.Util._counter', 'Crypto.Cipher.AES', 'Crypto.Cipher.blockalgo', 'Crypto.Cipher._AES', 'Crypto.SelfTest', 'Crypto.SelfTest.Cipher', 'Crypto.SelfTest.Hash', 'Crypto.SelfTest.Protocol', 'Crypto.SelfTest.PublicKey', 'Crypto.SelfTest.Random', 'Crypto.SelfTest.Random.Fortuna', 'Crypto.SelfTest.Random.OSRNG', 'Crypto.SelfTest.Signature', 'Crypto.SelfTest.Util', 'Crypto.Signature', 'IPython', '__future__', 'IPython.core', 'IPython.core.getipython', 'IPython.core.release', 'IPython.core.application', 'traitlets', 'traitlets.traitlets', 'six', 'traitlets.utils', 'traitlets.utils.getargspec', 'traitlets.utils.importstring', 'ipython_genutils', 'ipython_genutils._version', 'ipython_genutils.py3compat', 'ipython_genutils.encoding', 'traitlets.utils.sentinel', 'traitlets.utils.bunch', 'traitlets._version', 'traitlets.config', 'traitlets.config.application', 'decorator', 'traitlets.config.configurable', 'traitlets.config.loader', 'ipython_genutils.path', 'ipython_genutils.text', 'ipython_genutils.importstring', 'IPython.core.crashhandler', 'IPython.core.ultratb', 'IPython.core.debugger', 'bdb', 'IPython.utils', 'IPython.utils.PyColorize', 'IPython.utils.coloransi', 'IPython.utils.ipstruct', 'IPython.utils.py3compat', 'IPython.utils.encoding', 'IPython.utils.colorable', 'pygments', 'pygments.util', 'IPython.utils.ulinecache', 'IPython.utils.openpy', 'IPython.core.excolors', 'IPython.testing', 'IPython.testing.skipdoctest', 'pdb', 'cmd', 'code', 'codeop', 'IPython.core.display_trap', 'IPython.utils.path', 'IPython.utils.process', 'IPython.utils._process_posix', 'pexpect', 'pexpect.exceptions', 'pexpect.utils', 'pexpect.expect', 'pexpect.pty_spawn', 'pty', 'tty', 'termios', 'ptyprocess', 'ptyprocess.ptyprocess', 'fcntl', 'ptyprocess.util', 'pexpect.spawnbase', 'pexpect.run', 'IPython.utils._process_common', 'IPython.utils.decorators', 'IPython.utils.data', 'IPython.utils.terminal', 'IPython.utils.sysinfo', 'IPython.utils._sysinfo', 'IPython.core.profiledir', 'IPython.paths', 'IPython.utils.importstring', 'IPython.terminal', 'IPython.terminal.embed', 'IPython.core.compilerop', 'IPython.core.magic_arguments', 'IPython.core.error', 'IPython.utils.text', 'IPython.core.magic', 'getopt', 'IPython.core.oinspect', 'IPython.core.page', 'IPython.core.display', 'mimetypes', 'IPython.lib', 'IPython.lib.security', 'getpass', 'IPython.lib.pretty', 'IPython.utils.dir2', 'IPython.utils.wildcard', 'IPython.utils.signatures', 'pygments.lexers', 'pygments.lexers._mapping', 'pygments.modeline', 'pygments.plugin', 'pygments.lexers.python', 'pygments.lexer', 'pygments.filter', 'pygments.filters', 'pygments.token', 'pygments.regexopt', 'pygments.unistring', 'pygments.formatters', 'pygments.formatters._mapping', 'pygments.formatters.html', 'pygments.formatter', 'pygments.styles', 'IPython.core.inputsplitter', 'IPython.core.inputtransformer', 'IPython.core.splitinput', 'IPython.utils.tokenize2', 'IPython.utils._tokenize_py3', 'IPython.core.interactiveshell', 'pickleshare', 'IPython.core.prefilter', 'IPython.core.autocall', 'IPython.core.macro', 'IPython.core.shadowns', 'IPython.core.alias', 'IPython.core.builtin_trap', 'IPython.core.events', 'IPython.core.displayhook', 'IPython.core.displaypub', 'IPython.core.extensions', 'IPython.core.formatters', 'IPython.utils.sentinel', 'IPython.core.history', 'IPython.core.logger', 'IPython.core.payload', 'IPython.core.usage', 'IPython.display', 'IPython.lib.display', 'IPython.utils.io', 'IPython.utils.capture', 'IPython.utils.strdispatch', 'IPython.core.hooks', 'IPython.utils.syspathcontext', 'IPython.utils.tempdir', 'IPython.utils.contexts', 'IPython.terminal.interactiveshell', 'prompt_toolkit', 'prompt_toolkit.interface', 'prompt_toolkit.application', 'prompt_toolkit.buffer', 'prompt_toolkit.auto_suggest', 'prompt_toolkit.filters', 'prompt_toolkit.filters.base', 'prompt_toolkit.utils', 'wcwidth', 'wcwidth.wcwidth', 'wcwidth.table_wide', 'wcwidth.table_zero', 'six.moves', 'prompt_toolkit.filters.cli', 'prompt_toolkit.enums', 'prompt_toolkit.key_binding', 'prompt_toolkit.key_binding.vi_state', 'prompt_toolkit.cache', 'prompt_toolkit.filters.types', 'prompt_toolkit.filters.utils', 'prompt_toolkit.clipboard', 'prompt_toolkit.clipboard.base', 'prompt_toolkit.selection', 'prompt_toolkit.clipboard.in_memory', 'prompt_toolkit.completion', 'prompt_toolkit.document', 'prompt_toolkit.history', 'prompt_toolkit.search_state', 'prompt_toolkit.validation', 'prompt_toolkit.buffer_mapping', 'prompt_toolkit.key_binding.bindings', 'prompt_toolkit.key_binding.bindings.basic', 'prompt_toolkit.keys', 'prompt_toolkit.layout', 'prompt_toolkit.layout.containers', 'prompt_toolkit.layout.controls', 'prompt_toolkit.mouse_events', 'prompt_toolkit.token', 'prompt_toolkit.layout.lexers', 'prompt_toolkit.layout.utils', 'prompt_toolkit.layout.processors', 'prompt_toolkit.reactive', 'prompt_toolkit.layout.screen', 'prompt_toolkit.layout.dimension', 'prompt_toolkit.layout.margins', 'prompt_toolkit.renderer', 'prompt_toolkit.layout.mouse_handlers', 'prompt_toolkit.output', 'prompt_toolkit.styles', 'prompt_toolkit.styles.base', 'prompt_toolkit.styles.defaults', 'prompt_toolkit.styles.from_dict', 'prompt_toolkit.styles.utils', 'prompt_toolkit.styles.from_pygments', 'pygments.style', 'pygments.styles.default', 'prompt_toolkit.key_binding.bindings.named_commands', 'prompt_toolkit.key_binding.bindings.completion', 'prompt_toolkit.key_binding.registry', 'prompt_toolkit.key_binding.input_processor', 'prompt_toolkit.key_binding.bindings.emacs', 'prompt_toolkit.key_binding.bindings.scroll', 'prompt_toolkit.key_binding.bindings.vi', 'prompt_toolkit.key_binding.digraphs', 'prompt_toolkit.key_binding.defaults', 'prompt_toolkit.eventloop', 'prompt_toolkit.eventloop.base', 'prompt_toolkit.eventloop.callbacks', 'prompt_toolkit.input', 'prompt_toolkit.terminal', 'prompt_toolkit.terminal.vt100_input', 'prompt_toolkit.shortcuts', 'prompt_toolkit.layout.menus', 'prompt_toolkit.layout.prompt', 'prompt_toolkit.layout.toolbars', 'prompt_toolkit.terminal.vt100_output', 'prompt_toolkit.key_binding.manager', 'IPython.terminal.debugger', 'IPython.core.completer', 'unicodedata', 'IPython.core.latex_symbols', 'IPython.utils.generics', 'simplegeneric', 'IPython.terminal.ptutils', 'IPython.terminal.shortcuts', 'IPython.terminal.magics', 'IPython.lib.clipboard', 'IPython.terminal.pt_inputhooks', 'IPython.terminal.prompts', 'IPython.terminal.ipapp', 'IPython.core.magics', 'IPython.core.magics.auto', 'IPython.core.magics.basic', 'IPython.core.magics.code', 'IPython.core.magics.config', 'IPython.core.magics.display', 'IPython.core.magics.execution', 'timeit', 'cProfile', '_lsprof', 'profile', 'pstats', 'IPython.utils.module_paths', 'imp', 'IPython.utils.timing', 'IPython.core.magics.extension', 'IPython.core.magics.history', 'IPython.core.magics.logging', 'IPython.core.magics.namespace', 'IPython.core.magics.osm', 'IPython.core.magics.pylab', 'IPython.core.pylabtools', 'IPython.core.magics.script', 'IPython.lib.backgroundjobs', 'IPython.core.shellapp', 'IPython.extensions', 'IPython.extensions.storemagic', 'IPython.utils.frame', 'IPython.external', 'IPython.external.decorators', 'numpy', 'numpy._globals', 'numpy.__config__', 'numpy.version', 'numpy._distributor_init', 'numpy.core', 'numpy.core.info', 'numpy.core.multiarray', 'numpy.core.overrides', 'numpy.core._multiarray_umath', 'numpy.compat', 'numpy.compat._inspect', 'numpy.compat.py3k', 'numpy.core.umath', 'numpy.core.numerictypes', 'numbers', 'numpy.core._string_helpers', 'numpy.core._type_aliases', 'numpy.core._dtype', 'numpy.core.numeric', 'numpy.core._internal', 'numpy.core.fromnumeric', 'numpy.core._methods', 'numpy.core.arrayprint', 'numpy.core.defchararray', 'numpy.core.records', 'numpy.core.memmap', 'numpy.core.function_base', 'numpy.core.machar', 'numpy.core.getlimits', 'numpy.core.shape_base', 'numpy.core.einsumfunc', 'numpy.core._add_newdocs', 'numpy.core._multiarray_tests', 'numpy.core._dtype_ctypes', 'numpy._pytesttester', 'numpy.lib', 'numpy.lib.info', 'numpy.lib.type_check', 'numpy.lib.ufunclike', 'numpy.lib.index_tricks', 'numpy.matrixlib', 'numpy.matrixlib.defmatrix', 'numpy.linalg', 'numpy.linalg.info', 'numpy.linalg.linalg', 'numpy.lib.twodim_base', 'numpy.linalg.lapack_lite', 'numpy.linalg._umath_linalg', 'numpy.lib.function_base', 'numpy.lib.utils', 'numpy.lib.histograms', 'numpy.lib.stride_tricks', 'numpy.lib.mixins', 'numpy.lib.nanfunctions', 'numpy.lib.shape_base', 'numpy.lib.scimath', 'numpy.lib.polynomial', 'numpy.lib.arraysetops', 'numpy.lib.npyio', 'numpy.lib.format', 'numpy.lib._datasource', 'numpy.lib._iotools', 'numpy.lib.financial', 'decimal', '_decimal', 'numpy.lib.arrayterator', 'numpy.lib.arraypad', 'numpy.lib._version', 'numpy.fft', 'numpy.fft.info', 'numpy.fft.fftpack', 'numpy.fft.fftpack_lite', 'numpy.fft.helper', 'numpy.polynomial', 'numpy.polynomial.polynomial', 'numpy.polynomial.polyutils', 'numpy.polynomial._polybase', 'numpy.polynomial.chebyshev', 'numpy.polynomial.legendre', 'numpy.polynomial.hermite', 'numpy.polynomial.hermite_e', 'numpy.polynomial.laguerre', 'numpy.random', 'numpy.random.mtrand', 'cython_runtime', 'mtrand', 'numpy.ctypeslib', 'numpy.ma', 'numpy.ma.core', 'numpy.ma.extras', 'numpy.testing', 'numpy.testing._private', 'numpy.testing._private.utils', 'numpy.testing._private.decorators', 'numpy.testing._private.nosetester', 'numpy.testing.decorators', 'doctest', 'IPython.external.decorators._decorators', 'IPython.external.decorators._numpy_testing_utils', 'IPython.kernel', 'IPython.utils.shimmodule', 'IPython.kernel.zmq.session', 'IPython.kernel.zmq', 'IPython.kernel.comm', 'IPython.kernel.inprocess', 'IPython.kernel.ioloop', 'IPython.kernel.blocking', 'ipykernel', 'ipykernel._version', 'ipykernel.connect', 'jupyter_client', 'jupyter_client._version', 'jupyter_client.connect', 'zmq', 'zmq.backend', 'zmq.backend.select', 'zmq.backend.cython', 'zmq.backend.cython.constants', 'zmq.backend.cython.error', '_cython_0_29_2', 'zmq.backend.cython.message', 'zmq.error', 'zmq.backend.cython.context', 'zmq.backend.cython.socket', 'zmq.backend.cython.utils', 'zmq.backend.cython._poll', 'zmq.backend.cython._version', 'zmq.backend.cython._device', 'zmq.sugar', 'zmq.sugar.constants', 'zmq.utils', 'zmq.utils.constant_names', 'zmq.sugar.context', 'zmq.sugar.attrsettr', 'zmq.sugar.socket', 'zmq.sugar.poll', 'zmq.utils.jsonapi', 'zmq.utils.strtypes', 'simplejson', 'simplejson.errors', 'simplejson.raw_json', 'simplejson.decoder', 'simplejson.compat', 'simplejson.scanner', 'simplejson._speedups', 'simplejson.encoder', 'zmq.sugar.frame', 'zmq.sugar.tracker', 'zmq.sugar.version', 'zmq.sugar.stopwatch', 'jupyter_client.localinterfaces', 'jupyter_core', 'jupyter_core.version', 'jupyter_core.paths', 'jupyter_client.launcher', 'traitlets.log', 'jupyter_client.client', 'jupyter_client.channels', 'jupyter_client.channelsabc', 'jupyter_client.clientabc', 'jupyter_client.manager', 'jupyter_client.kernelspec', 'jupyter_client.managerabc', 'jupyter_client.blocking', 'jupyter_client.blocking.client', 'jupyter_client.blocking.channels', 'jupyter_client.multikernelmanager', 'uuid', '_uuid', 'ipykernel.comm', 'ipykernel.comm.manager', 'ipykernel.comm.comm', 'ipykernel.kernelbase', 'jupyter_client.session', 'hmac', 'zmq.eventloop', 'zmq.eventloop.ioloop', 'tornado', 'tornado.log', 'tornado.escape', 'tornado.util', 'tornado.speedups', 'colorama', 'colorama.initialise', 'colorama.ansitowin32', 'colorama.ansi', 'colorama.winterm', 'colorama.win32', 'tornado.ioloop', 'tornado.concurrent', 'tornado.stack_context', 'tornado.platform', 'tornado.platform.auto', 'tornado.platform.posix', 'tornado.platform.common', 'tornado.platform.interface', 'concurrent.futures.thread', 'tornado.platform.asyncio', 'tornado.gen', 'zmq.eventloop.zmqstream', 'jupyter_client.jsonutil', 'dateutil', 'dateutil._version', 'dateutil.parser', 'dateutil.parser._parser', 'dateutil.relativedelta', 'dateutil._common', 'dateutil.tz', 'dateutil.tz.tz', 'dateutil.tz._common', 'dateutil.tz._factories', 'dateutil.parser.isoparser', '_strptime', 'jupyter_client.adapter', 'ipykernel.jsonutil', 'ipykernel.inprocess', 'ipykernel.inprocess.channels', 'ipykernel.inprocess.socket', 'ipykernel.inprocess.client', 'ipykernel.inprocess.manager', 'ipykernel.inprocess.constants', 'ipykernel.inprocess.blocking', 'jupyter_client.ioloop', 'jupyter_client.ioloop.manager', 'jupyter_client.ioloop.restarter', 'jupyter_client.restarter', 'IPython.sphinxext', 'IPython.testing.plugin', 'OpenSSL', 'OpenSSL.crypto', 'cryptography', 'cryptography.__about__', 'cryptography.x509', 'cryptography.x509.certificate_transparency', 'cryptography.x509.base', 'cryptography.utils', 'cryptography.hazmat', 'cryptography.hazmat.primitives', 'cryptography.hazmat.primitives.asymmetric', 'cryptography.hazmat.primitives.asymmetric.dsa', 'cryptography.hazmat.primitives.asymmetric.ec', 'cryptography.hazmat._oid', 'cryptography.hazmat.primitives.asymmetric.rsa', 'cryptography.exceptions', 'cryptography.hazmat.backends', 'cryptography.hazmat.backends.interfaces', 'cryptography.x509.extensions', 'ipaddress', 'asn1crypto', 'asn1crypto.version', 'asn1crypto.keys', 'asn1crypto._elliptic_curve', 'asn1crypto._int', 'asn1crypto.util', 'asn1crypto._errors', 'asn1crypto._iri', 'encodings.idna', 'stringprep', 'asn1crypto._types', 'asn1crypto._ordereddict', 'asn1crypto._ffi', 'asn1crypto._perf', 'asn1crypto._perf._big_num_ctypes', 'ctypes.util', 'asn1crypto.algos', 'asn1crypto.core', 'asn1crypto._teletex_codec', 'asn1crypto.parser', 'cryptography.hazmat.primitives.constant_time', 'cryptography.hazmat.bindings', '_cffi_backend', '_constant_time.lib', '_constant_time', 'cryptography.hazmat.bindings._constant_time', 'cryptography.hazmat.primitives.serialization', 'cryptography.hazmat.primitives.serialization.base', 'cryptography.hazmat.primitives.serialization.ssh', 'cryptography.hazmat.primitives.asymmetric.ed25519', 'cryptography.x509.general_name', 'cryptography.x509.name', 'cryptography.x509.oid', 'cryptography.hazmat.primitives.hashes', 'OpenSSL._util', 'cryptography.hazmat.bindings.openssl', 'cryptography.hazmat.bindings.openssl.binding', '_openssl.lib', '_openssl', 'cryptography.hazmat.bindings._openssl', 'cryptography.hazmat.bindings.openssl._conditional', 'OpenSSL.SSL', 'OpenSSL.version', 'PIL', 'PIL._version', 'PyQt5', 'PyQt5.uic', 'PyQt5.uic.Compiler', 'PyQt5.uic.Compiler.indenter', 'PyQt5.uic.Compiler.compiler', 'PyQt5.uic.properties', 'PyQt5.uic.exceptions', 'PyQt5.uic.icon_cache', 'PyQt5.uic.port_v3', 'PyQt5.uic.port_v3.ascii_upper', 'PyQt5.uic.uiparser', 'PyQt5.uic.objcreator', 'PyQt5.uic.Compiler.qtproxies', 'PyQt5.uic.Compiler.misc', 'PyQt5.uic.port_v3.proxy_base', 'PyQt5.uic.Compiler.proxy_metaclass', 'PyQt5.uic.port_v3.as_string', 'PyQt5.uic.Compiler.qobjectcreator', 'PyQt5.uic.Loader', 'RPi', 'RPi.GPIO', 'RPi._GPIO', 'apt', 'apt_pkg', 'apt.package', 'apt.progress', 'apt.progress.text', 'apt.progress.base', 'apt.cache', 'apt.cdrom', 'aptsources', 'astroid', 'wrapt', 'wrapt.wrappers', 'wrapt._wrappers', 'wrapt.decorators', 'wrapt.importer', 'astroid.__pkginfo__', 'astroid.exceptions', 'astroid.util', 'lazy_object_proxy', 'lazy_object_proxy.utils', 'lazy_object_proxy.cext', 'astroid.nodes', 'astroid.node_classes', 'astroid.as_string', 'astroid.bases', 'astroid.context', 'astroid.manager', 'astroid.interpreter', 'astroid.interpreter._import', 'astroid.interpreter._import.spec', 'astroid.interpreter._import.util', 'pkg_resources', 'zipfile', 'plistlib', 'xml.parsers.expat', 'xml.parsers.expat.model', 'xml.parsers.expat.errors', 'pkg_resources.extern', 'pkg_resources._vendor', 'pkg_resources.extern.six', 'pkg_resources._vendor.six', 'pkg_resources.extern.six.moves', 'pkg_resources._vendor.six.moves', 'pkg_resources.py31compat', 'pkg_resources.extern.appdirs', 'pkg_resources._vendor.packaging.__about__', 'pkg_resources.extern.packaging', 'pkg_resources.extern.packaging.version', 'pkg_resources.extern.packaging._structures', 'pkg_resources.extern.packaging.specifiers', 'pkg_resources.extern.packaging._compat', 'pkg_resources.extern.packaging.requirements', 'pkg_resources.extern.pyparsing', 'pkg_resources.extern.six.moves.urllib', 'pkg_resources.extern.packaging.markers', 'astroid.modutils', 'distutils.sysconfig', 'distutils.errors', 'astroid.transforms', 'astroid.decorators', 'astroid.mixins', 'astroid.scoped_nodes', 'astroid.interpreter.objectmodel', 'astroid.interpreter.dunder_lookup', 'astroid.inference', 'astroid.helpers', 'astroid.raw_building', 'astroid.protocols', 'astroid.arguments', 'astroid.builder', 'astroid._ast', 'typed_ast', 'typed_ast.ast3', 'typed_ast._ast3', 'typed_ast.ast27', 'typed_ast._ast27', 'astroid.rebuilder', 'brain_builtin_inference', 'astroid.objects', 'brain_hashlib', 'brain_curses', 'brain_attrs', 'brain_gi', 'brain_subprocess', 'brain_io', 'brain_six', 'brain_qt', 'brain_threading', 'brain_random', 'brain_nose', 'brain_multiprocessing', 'brain_pytest', 'brain_dateutil', 'brain_namedtuple_enum', 'brain_fstrings', 'brain_numpy', 'brain_uuid', 'brain_argparse', 'brain_mechanize', 'brain_re', 'brain_pkg_resources', 'brain_collections', 'brain_functools', 'brain_ssl', 'brain_typing', 'asttokens', 'asttokens.line_numbers', 'asttokens.asttokens', 'asttokens.util', 'asttokens.mark_tokens', 'automationhat', 'automationhat.ads1015', 'automationhat.pins', 'blinker', 'blinker.base', 'blinker._utilities', 'blinker._saferef', 'bs4', 'bs4.builder', 'bs4.element', 'soupsieve', 'soupsieve.__meta__', 'soupsieve.css_parser', 'soupsieve.util', 'soupsieve.css_match', 'soupsieve.css_types', 'bs4.dammit', 'chardet', 'chardet.compat', 'chardet.universaldetector', 'chardet.charsetgroupprober', 'chardet.enums', 'chardet.charsetprober', 'chardet.escprober', 'chardet.codingstatemachine', 'chardet.escsm', 'chardet.latin1prober', 'chardet.mbcsgroupprober', 'chardet.utf8prober', 'chardet.mbcssm', 'chardet.sjisprober', 'chardet.mbcharsetprober', 'chardet.chardistribution', 'chardet.euctwfreq', 'chardet.euckrfreq', 'chardet.gb2312freq', 'chardet.big5freq', 'chardet.jisfreq', 'chardet.jpcntx', 'chardet.eucjpprober', 'chardet.gb2312prober', 'chardet.euckrprober', 'chardet.cp949prober', 'chardet.big5prober', 'chardet.euctwprober', 'chardet.sbcsgroupprober', 'chardet.sbcharsetprober', 'chardet.langcyrillicmodel', 'chardet.langgreekmodel', 'chardet.langbulgarianmodel', 'chardet.langthaimodel', 'chardet.langhebrewmodel', 'chardet.hebrewprober', 'chardet.langturkishmodel', 'chardet.version', 'bs4.builder._htmlparser', 'html.parser', '_markupbase', 'bs4.builder._html5lib', 'html5lib', 'html5lib.html5parser', 'html5lib._inputstream', 'six.moves.urllib', 'webencodings', 'webencodings.labels', 'encodings.utf_16_le', 'encodings.utf_16_be', 'html5lib.constants', 'html5lib._utils', 'xml.etree.cElementTree', 'html5lib._tokenizer', 'html5lib._trie', 'html5lib._trie.py', 'html5lib._trie._base', 'html5lib.treebuilders', 'html5lib.treebuilders.base', 'html5lib.treewalkers', 'html5lib.serializer', 'xml.sax.saxutils', 'bs4.builder._lxml', 'lxml', 'lxml.etree', '_cython_0_29_6', 'lxml._elementpath', 'bs4.tests', 'buttonshim', 'smbus', 'colorsys', 'cairo', 'cairo._cairo', 'certifi', 'certifi.core', 'chardet.cli', 'click', 'click.core', 'click.types', 'click._compat', 'click.exceptions', 'click.utils', 'click.globals', 'click.termui', 'click.formatting', 'click.parser', 'click._unicodefun', 'click.decorators', 'colorzero', 'colorzero.color', 'colorzero.conversions', 'fractions', 'colorzero.tables', 'colorzero.types', 'colorzero.attr', 'colorzero.deltae', 'colorzero.easings', 'cryptography.hazmat.backends.openssl', 'cryptography.hazmat.backends.openssl.backend', 'cryptography.hazmat.backends.openssl.aead', 'cryptography.hazmat.backends.openssl.ciphers', 'cryptography.hazmat.primitives.ciphers', 'cryptography.hazmat.primitives.ciphers.base', 'cryptography.hazmat.primitives.ciphers.modes', 'cryptography.hazmat.backends.openssl.cmac', 'cryptography.hazmat.primitives.mac', 'cryptography.hazmat.backends.openssl.decode_asn1', 'cryptography.hazmat.backends.openssl.dh', 'cryptography.hazmat.primitives.asymmetric.dh', 'cryptography.hazmat.backends.openssl.dsa', 'cryptography.hazmat.backends.openssl.utils', 'cryptography.hazmat.primitives.asymmetric.utils', 'cryptography.hazmat.backends.openssl.ec', 'cryptography.hazmat.backends.openssl.ed25519', 'cryptography.hazmat.backends.openssl.ed448', 'cryptography.hazmat.primitives.asymmetric.ed448', 'cryptography.hazmat.backends.openssl.encode_asn1', 'cryptography.hazmat.backends.openssl.hashes', 'cryptography.hazmat.backends.openssl.hmac', 'cryptography.hazmat.backends.openssl.ocsp', 'cryptography.hazmat.backends.openssl.x509', 'cryptography.x509.ocsp', 'cryptography.hazmat.backends.openssl.rsa', 'cryptography.hazmat.primitives.asymmetric.padding', 'cryptography.hazmat.backends.openssl.x25519', 'cryptography.hazmat.primitives.asymmetric.x25519', 'cryptography.hazmat.backends.openssl.x448', 'cryptography.hazmat.primitives.asymmetric.x448', 'cryptography.hazmat.primitives.ciphers.algorithms', 'cryptography.hazmat.primitives.kdf', 'cryptography.hazmat.primitives.kdf.scrypt', 'cryptography.hazmat.primitives.twofactor', 'cupshelpers', 'cupshelpers.cupshelpers', 'cups', 'cupshelpers.config', 'cupshelpers.ppds', 'cupshelpers.xmldriverprefs', 'cupshelpers.openprinting', 'requests', 'urllib3', 'urllib3.connectionpool', 'urllib3.exceptions', 'six.moves.http_client', 'urllib3.packages', 'urllib3.packages.ssl_match_hostname', 'urllib3.connection', 'urllib3.util', 'urllib3.util.connection', 'urllib3.util.wait', 'urllib3.contrib', 'urllib3.contrib._appengine_environ', 'urllib3.util.request', 'urllib3.util.response', 'urllib3.util.ssl_', 'urllib3.util.timeout', 'urllib3.util.retry', 'urllib3.util.url', 'urllib3._collections', 'urllib3.request', 'urllib3.filepost', 'urllib3.fields', 'six.moves.urllib.parse', 'urllib3.response', 'urllib3.util.queue', 'urllib3.poolmanager', 'requests.exceptions', 'urllib3.contrib.pyopenssl', 'urllib3.packages.backports', 'urllib3.packages.backports.makefile', 'requests.__version__', 'requests.utils', 'requests.certs', 'requests._internal_utils', 'requests.compat', 'http.cookiejar', 'http.cookies', 'requests.cookies', 'requests.structures', 'requests.packages', 'requests.packages.urllib3', 'requests.packages.urllib3.connectionpool', 'requests.packages.urllib3.exceptions', 'requests.packages.urllib3.packages', 'requests.packages.urllib3.packages.ssl_match_hostname', 'requests.packages.urllib3.connection', 'requests.packages.urllib3.util', 'requests.packages.urllib3.util.connection', 'requests.packages.urllib3.util.wait', 'requests.packages.urllib3.contrib', 'requests.packages.urllib3.contrib._appengine_environ', 'requests.packages.urllib3.util.request', 'requests.packages.urllib3.util.response', 'requests.packages.urllib3.util.ssl_', 'requests.packages.urllib3.util.timeout', 'requests.packages.urllib3.util.retry', 'requests.packages.urllib3.util.url', 'requests.packages.urllib3._collections', 'requests.packages.urllib3.request', 'requests.packages.urllib3.filepost', 'requests.packages.urllib3.fields', 'requests.packages.urllib3.response', 'requests.packages.urllib3.util.queue', 'requests.packages.urllib3.poolmanager', 'requests.packages.urllib3.contrib.pyopenssl', 'requests.packages.urllib3.packages.backports', 'requests.packages.urllib3.packages.backports.makefile', 'idna', 'idna.package_data', 'idna.core', 'idna.idnadata', 'idna.intranges', 'requests.packages.idna', 'requests.packages.idna.package_data', 'requests.packages.idna.core', 'requests.packages.idna.idnadata', 'requests.packages.idna.intranges', 'requests.packages.chardet', 'requests.packages.chardet.compat', 'requests.packages.chardet.universaldetector', 'requests.packages.chardet.charsetgroupprober', 'requests.packages.chardet.enums', 'requests.packages.chardet.charsetprober', 'requests.packages.chardet.escprober', 'requests.packages.chardet.codingstatemachine', 'requests.packages.chardet.escsm', 'requests.packages.chardet.latin1prober', 'requests.packages.chardet.mbcsgroupprober', 'requests.packages.chardet.utf8prober', 'requests.packages.chardet.mbcssm', 'requests.packages.chardet.sjisprober', 'requests.packages.chardet.mbcharsetprober', 'requests.packages.chardet.chardistribution', 'requests.packages.chardet.euctwfreq', 'requests.packages.chardet.euckrfreq', 'requests.packages.chardet.gb2312freq', 'requests.packages.chardet.big5freq', 'requests.packages.chardet.jisfreq', 'requests.packages.chardet.jpcntx', 'requests.packages.chardet.eucjpprober', 'requests.packages.chardet.gb2312prober', 'requests.packages.chardet.euckrprober', 'requests.packages.chardet.cp949prober', 'requests.packages.chardet.big5prober', 'requests.packages.chardet.euctwprober', 'requests.packages.chardet.sbcsgroupprober', 'requests.packages.chardet.sbcharsetprober', 'requests.packages.chardet.langcyrillicmodel', 'requests.packages.chardet.langgreekmodel', 'requests.packages.chardet.langbulgarianmodel', 'requests.packages.chardet.langthaimodel', 'requests.packages.chardet.langhebrewmodel', 'requests.packages.chardet.hebrewprober', 'requests.packages.chardet.langturkishmodel', 'requests.packages.chardet.version', 'requests.packages.chardet.cli', 'requests.models', 'requests.hooks', 'requests.auth', 'requests.status_codes', 'requests.api', 'requests.sessions', 'requests.adapters', 'dateutil.zoneinfo', 'tarfile', 'dbus', 'dbus._compat', 'dbus.exceptions', 'dbus.types', '_dbus_bindings', 'dbus._dbus', 'dbus.bus', 'dbus.connection', 'dbus.lowlevel', 'dbus.proxies', 'dbus._expat_introspect_parser', 'dbus.mainloop', 'docutils', 'docutils.languages', 'docutils.utils', 'docutils.nodes', 'docutils.io', 'docutils._compat', 'docutils.utils.error_reporting', 'docutils.parsers', 'docutils.parsers.rst', 'docutils.statemachine', 'docutils.parsers.rst.states', 'docutils.parsers.rst.directives', 'docutils.parsers.rst.languages', 'docutils.parsers.rst.languages.en', 'docutils.parsers.rst.tableparser', 'docutils.parsers.rst.roles', 'docutils.utils.code_analyzer', 'docutils.utils.punctuation_chars', 'docutils.utils.urischemes', 'roman', 'docutils.frontend', 'configparser', 'optparse', 'docutils.transforms', 'docutils.transforms.universal', 'docutils.utils.smartquotes', 'docutils.readers', 'docutils.utils.math', 'docutils.writers', 'docutils.writers.html4css1', 'docutils.transforms.writer_aux', 'docutils.writers._html_base', 'PIL.Image', 'PIL._util', 'PIL.ImageMode', 'PIL._binary', 'PIL._imaging', 'docutils.utils.math.unichar2tex', 'docutils.utils.math.math2html', 'docutils.utils.math.latex2mathml', 'docutils.utils.math.tex2unichar', 'docutils.utils.math.tex2mathml_extern', 'docutils.writers.html5_polyglot', 'docutils.writers.latex2e', 'docutils.writers.odf_odt', 'xml.dom.minidom', 'xml.dom.minicompat', 'xml.dom.xmlbuilder', 'xml.dom.NodeFilter', 'docutils.readers.standalone', 'docutils.transforms.frontmatter', 'docutils.transforms.references', 'docutils.transforms.misc', 'docutils.writers.odf_odt.pygmentsformatter', 'docutils.writers.pep_html', 'docutils.writers.s5_html', 'docutils.writers.xetex', 'cap1xxx', 'flask', 'werkzeug', 'werkzeug._compat', 'werkzeug.exceptions', 'werkzeug._internal', 'werkzeug.wrappers', 'werkzeug.http', 'werkzeug.datastructures', 'werkzeug.filesystem', 'werkzeug.urls', 'werkzeug.formparser', 'werkzeug.wsgi', 'werkzeug.utils', 'jinja2', 'jinja2.environment', 'jinja2.nodes', 'jinja2.utils', 'jinja2._compat', 'markupsafe', 'markupsafe._compat', 'markupsafe._speedups', 'jinja2.defaults', 'jinja2.filters', 'jinja2.runtime', 'jinja2.exceptions', 'jinja2.tests', 'jinja2.lexer', 'jinja2.parser', 'jinja2.compiler', 'jinja2.visitor', 'jinja2.optimizer', 'jinja2.idtracking', 'jinja2.loaders', 'jinja2.bccache', 'jinja2.asyncsupport', 'jinja2.asyncfilters', 'flask.app', 'werkzeug.routing', 'flask.cli', 'flask._compat', 'flask.globals', 'werkzeug.local', 'flask.helpers', 'flask.signals', 'flask.json', 'itsdangerous', 'flask.config', 'flask.ctx', 'flask.logging', 'flask.sessions', 'flask.json.tag', 'flask.templating', 'flask.wrappers', 'flask.blueprints', 'gi', 'gi._error', 'gi._gi', 'gi._compat', 'gi._gobject', 'gi._gi_cairo', 'glib', 'gobject', 'gio', 'gtk', 'gtk.gdk', 'gi.overrides', 'gi._constants', 'gi.repository', 'gi.importer', 'gi.module', 'gi.types', 'gi.docstring', 'gi._propertyhelper', 'gi._signalhelper', 'gpiozero', 'gpiozero.pins', 'gpiozero.devices', 'gpiozero.threads', 'gpiozero.exc', 'gpiozero.mixins', 'statistics', 'gpiozero.compat', 'cmath', 'gpiozero.pins.data', 'gpiozero.input_devices', 'gpiozero.pins.pigpio', 'pigpio', 'gpiozero.pins.pi', 'spidev', 'gpiozero.spi_devices', 'gpiozero.output_devices', 'gpiozero.tones', 'gpiozero.boards', 'gpiozero.fonts', 'gpiozero.internal_devices', 'gpiozerocli', 'guizero', 'guizero.utilities', 'PIL.ImageTk', 'guizero.alerts', 'guizero.App', 'guizero.base', 'guizero.tkmixins', 'guizero.event', 'guizero.Box', 'guizero.ButtonGroup', 'guizero.RadioButton', 'guizero.CheckBox', 'guizero.Combo', 'guizero.ListBox', 'guizero.MenuBar', 'guizero.Window', 'guizero.Picture', 'guizero.PushButton', 'guizero.Slider', 'guizero.Text', 'guizero.TextBox', 'tkinter.scrolledtext', 'guizero.Waffle', 'html5lib.filters', 'html5lib.treeadapters', 'html5lib.treeadapters.sax', 'ipykernel.gui', 'ipykernel.inprocess.tests', 'ipykernel.pylab', 'ipykernel.tests', 'unittest.mock', 'ipykernel.kernelspec', 'ipython_genutils.testing', 'ipython_genutils.tests', 'isort', 'isort.settings', 'isort.pie_slice', 'isort.isort', 'isort.natural', 'jedi', 'jedi.api', 'parso', 'parso.parser', 'parso.tree', 'parso._compatibility', 'parso.pgen2', 'parso.pgen2.generator', 'parso.pgen2.grammar_parser', 'parso.python', 'parso.python.tokenize', 'parso.python.token', 'parso.utils', 'parso.grammar', 'parso.python.diff', 'parso.python.parser', 'parso.python.tree', 'parso.python.prefix', 'parso.cache', 'parso.python.errors', 'parso.normalizer', 'parso.python.pep8', 'jedi._compatibility', 'jedi.parser_utils', 'jedi.debug', 'jedi.settings', 'jedi.cache', 'jedi.api.classes', 'jedi.evaluate', 'jedi.evaluate.utils', 'jedi.evaluate.imports', 'jedi.evaluate.sys_path', 'jedi.evaluate.cache', 'jedi.evaluate.base_context', 'jedi.common', 'jedi.common.context', 'jedi.evaluate.helpers', 'jedi.common.utils', 'jedi.evaluate.compiled', 'jedi.evaluate.compiled.context', 'jedi.evaluate.filters', 'jedi.evaluate.flow_analysis', 'jedi.evaluate.recursion', 'jedi.evaluate.lazy_context', 'jedi.evaluate.compiled.access', 'jedi.evaluate.compiled.getattr_static', 'jedi.evaluate.compiled.fake', 'jedi.evaluate.analysis', 'jedi.evaluate.context', 'jedi.evaluate.context.module', 'jedi.evaluate.context.klass', 'jedi.evaluate.context.function', 'jedi.evaluate.docstrings', 'jedi.evaluate.pep0484', 'jedi.evaluate.arguments', 'jedi.evaluate.context.iterable', 'jedi.evaluate.param', 'jedi.evaluate.context.asynchronous', 'jedi.evaluate.parser_cache', 'jedi.evaluate.context.instance', 'jedi.evaluate.syntax_tree', 'jedi.evaluate.finder', 'jedi.api.keywords', 'pydoc_data.topics', 'jedi.api.interpreter', 'jedi.evaluate.compiled.mixed', 'jedi.api.helpers', 'jedi.api.completion', 'jedi.api.environment', 'filecmp', 'jedi.evaluate.compiled.subprocess', 'jedi.evaluate.compiled.subprocess.functions', 'jedi.api.exceptions', 'jedi.api.project', 'jedi.evaluate.usages', 'jupyter_client.tests', 'jupyter_core.tests', 'jupyter_core.utils', 'jwt', 'jwt.api_jwt', 'jwt.api_jws', 'jwt.algorithms', 'jwt.compat', 'jwt.exceptions', 'jwt.utils', 'jwt.contrib', 'jwt.contrib.algorithms', 'keyring', 'keyring.core', 'keyring.py27compat', 'keyring.py33compat', 'keyring.backend', 'entrypoints', 'keyring.credentials', 'keyring.errors', 'keyring.util', 'keyring.util.properties', 'keyring.py32compat', 'keyring.util.platform_', 'keyring.backends', 'keyring.backends.fail', 'keyring.backends.kwallet', 'dbus.mainloop.glib', '_dbus_glib_bindings', 'keyring.backends.SecretService', 'secretstorage', 'secretstorage.collection', 'secretstorage.defines', 'secretstorage.exceptions', 'secretstorage.item', 'secretstorage.util', 'secretstorage.dhcrypto', 'keyring.backends.Windows', 'keyring.backends.chainer', 'keyring.backends.OS_X', 'keyrings', 'keyrings.alt', 'keyrings.alt.Gnome', 'keyrings.alt.Google', 'keyrings.alt.keyczar', 'keyrings.alt.Windows', 'keyrings.alt.file_base', 'keyrings.alt.escape', 'keyrings.alt.file', 'keyrings.alt.multi', 'keyrings.alt.pyfs', 'Crypto.Protocol.KDF', 'Crypto.Hash.SHA', 'Crypto.Hash.HMAC', 'Crypto.Util.strxor', 'keyring.tests', 'keyring.tests.backends', 'lxml.html', 'lxml.html.defs', 'lxml.html._setmixin', 'lxml.includes', 'lxml.isoschematron', 'matplotlib', 'distutils.version', 'matplotlib.cbook', 'matplotlib.cbook.deprecation', 'matplotlib.rcsetup', 'matplotlib.fontconfig_pattern', 'pyparsing', 'matplotlib.colors', 'matplotlib._color_data', 'cycler', 'matplotlib._version']
in FHEM
DEBUG:matplotlib:loaded modules: ['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', '_bootlocale', '_locale', 'site', 'os', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', 'types', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'logilab', 'mpl_toolkits', 'sitecustomize', 'pyaudio', '_portaudio', 'wave', 'audioop', 'struct', '_struct', 'chunk', 'datetime', 'time', 'math', '_datetime', 'pydoc', 'inspect', 'dis', 'opcode', '_opcode', 'collections.abc', 'enum', 'linecache', 'tokenize', 're', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg', 'token', 'pkgutil', 'weakref', '_weakrefset', 'platform', 'subprocess', 'signal', 'errno', '_posixsubprocess', 'select', 'selectors', 'threading', 'traceback', 'urllib', 'urllib.parse', 'asyncio', 'asyncio.base_events', 'concurrent', 'concurrent.futures', 'concurrent.futures._base', 'logging', 'string', '_string', 'atexit', 'socket', '_socket', 'ssl', '_ssl', 'base64', 'binascii', 'asyncio.constants', 'asyncio.coroutines', 'asyncio.base_futures', 'asyncio.format_helpers', 'asyncio.log', 'asyncio.events', 'contextvars', '_contextvars', 'asyncio.base_tasks', '_asyncio', 'asyncio.futures', 'asyncio.protocols', 'asyncio.sslproto', 'asyncio.transports', 'asyncio.tasks', 'asyncio.locks', 'asyncio.runners', 'asyncio.queues', 'asyncio.streams', 'asyncio.subprocess', 'asyncio.unix_events', 'asyncio.base_subprocess', 'asyncio.selector_events', 'ctypes', '_ctypes', 'ctypes._endian', 'curses', '_curses', 'dbm', 'dbm.ndbm', '_dbm', 'distutils', 'distutils.command', 'email', 'email.mime', 'ensurepip', 'glob', 'fnmatch', 'tempfile', 'shutil', 'zlib', 'bz2', '_compression', '_bz2', 'lzma', '_lzma', 'pwd', 'grp', 'random', 'hashlib', '_hashlib', '_blake2', '_sha3', 'bisect', '_bisect', '_random', 'html', 'html.entities', 'http', 'json', 'json.decoder', 'json.scanner', '_json', 'json.encoder', 'lib2to3', 'lib2to3.fixes', 'lib2to3.pgen2', 'multiprocessing', 'multiprocessing.context', 'multiprocessing.process', 'multiprocessing.reduction', 'pickle', '_compat_pickle', '_pickle', 'array', '__mp_main__', 'multiprocessing.dummy', 'multiprocessing.dummy.connection', 'queue', '_queue', 'pydoc_data', 'sqlite3', 'sqlite3.dbapi2', '_sqlite3', 'test', 'test.libregrtest', 'test.libregrtest.cmdline', 'argparse', 'gettext', 'locale', 'test.support', 'faulthandler', 'gc', 'logging.handlers', 'nntplib', 'email.header', 'email.quoprimime', 'email.base64mime', 'email.errors', 'email.charset', 'email.encoders', 'quopri', 'sysconfig', 'unittest', 'unittest.result', 'unittest.util', 'unittest.case', 'difflib', 'pprint', 'unittest.suite', 'unittest.loader', 'unittest.main', 'unittest.runner', 'unittest.signals', 'urllib.error', 'urllib.response', 'test.support.testresult', 'xml', 'xml.etree', 'xml.etree.ElementTree', 'xml.etree.ElementPath', 'copy', 'pyexpat.errors', 'pyexpat.model', 'pyexpat', '_elementtree', 'gzip', 'resource', '_sysconfigdata_m_linux_arm-linux-gnueabihf', 'test.libregrtest.main', 'test.libregrtest.runtest', 'test.libregrtest.refleak', 'test.libregrtest.save_env', '_multiprocessing', 'test.libregrtest.setup', 'test.libregrtest.utils', 'textwrap', 'tkinter', '_tkinter', 'tkinter.constants', 'venv', 'wsgiref', 'xml.dom', 'xml.dom.domreg', 'xml.parsers', 'xml.sax', 'xml.sax.xmlreader', 'xml.sax.handler', 'xml.sax._exceptions', 'xmlrpc', 'Crypto', 'Crypto.Cipher', 'Crypto.Hash', 'Crypto.Protocol', 'Crypto.PublicKey', 'Crypto.Random', 'Crypto.Random.OSRNG', 'Crypto.Random.OSRNG.posix', 'Crypto.Random.OSRNG.rng_base', 'Crypto.Util', 'Crypto.Util.py3compat', 'Crypto.Random._UserFriendlyRNG', 'Crypto.Random.Fortuna', 'Crypto.Random.Fortuna.FortunaAccumulator', 'Crypto.pct_warnings', 'Crypto.Random.Fortuna.SHAd256', 'Crypto.Hash.SHA256', 'Crypto.Hash.hashalgo', 'Crypto.Random.Fortuna.FortunaGenerator', 'Crypto.Util.number', 'Crypto.PublicKey._fastmath', 'Crypto.Util._number_new', 'Crypto.Util.Counter', 'Crypto.Util._counter', 'Crypto.Cipher.AES', 'Crypto.Cipher.blockalgo', 'Crypto.Cipher._AES', 'Crypto.SelfTest', 'Crypto.SelfTest.Cipher', 'Crypto.SelfTest.Hash', 'Crypto.SelfTest.Protocol', 'Crypto.SelfTest.PublicKey', 'Crypto.SelfTest.Random', 'Crypto.SelfTest.Random.Fortuna', 'Crypto.SelfTest.Random.OSRNG', 'Crypto.SelfTest.Signature', 'Crypto.SelfTest.Util', 'Crypto.Signature', 'IPython', '__future__', 'IPython.core', 'IPython.core.getipython', 'IPython.core.release', 'IPython.core.application', 'traitlets', 'traitlets.traitlets', 'six', 'traitlets.utils', 'traitlets.utils.getargspec', 'traitlets.utils.importstring', 'ipython_genutils', 'ipython_genutils._version', 'ipython_genutils.py3compat', 'ipython_genutils.encoding', 'traitlets.utils.sentinel', 'traitlets.utils.bunch', 'traitlets._version', 'traitlets.config', 'traitlets.config.application', 'decorator', 'traitlets.config.configurable', 'traitlets.config.loader', 'ast', '_ast', 'ipython_genutils.path', 'ipython_genutils.text', 'ipython_genutils.importstring', 'IPython.core.crashhandler', 'IPython.core.ultratb', 'IPython.core.debugger', 'bdb', 'IPython.utils', 'IPython.utils.PyColorize', 'IPython.utils.coloransi', 'IPython.utils.ipstruct', 'IPython.utils.py3compat', 'IPython.utils.encoding', 'IPython.utils.colorable', 'pygments', 'pygments.util', 'IPython.utils.ulinecache', 'IPython.utils.openpy', 'IPython.core.excolors', 'IPython.testing', 'IPython.testing.skipdoctest', 'pdb', 'cmd', 'code', 'codeop', 'IPython.core.display_trap', 'IPython.utils.path', 'IPython.utils.process', 'IPython.utils._process_posix', 'pexpect', 'pexpect.exceptions', 'pexpect.utils', 'pexpect.expect', 'pexpect.pty_spawn', 'pty', 'tty', 'termios', 'ptyprocess', 'ptyprocess.ptyprocess', 'fcntl', 'ptyprocess.util', 'pexpect.spawnbase', 'pexpect.run', 'IPython.utils._process_common', 'shlex', 'IPython.utils.decorators', 'IPython.utils.data', 'IPython.utils.terminal', ...
naja python und python3 sind doch getrennte Welten? Ich kenne mich damit nicht gut aus ...
In der FHEM Kommandozeile?
{qx(which python3)}
Im Terminal?
which python3
Ich rufe immer mit kompletten Pfad auf! Der user fhem hat uU keine komplette "Umgebung"
Beide Befehle liefern mir
/usr/bin/python3
ok ich habs herausgefunden, ich hab das im falschen user-context installiert.
Ich hab fhem nochmal als su installiert und dann konnte er es importieren.
Jetzt hab ich nur noch den fehler:
Failed to connect to localhost:7072
Failed to send msg, len=22. Not connected.
mein fhem läuft local auf dem raspi.
Die oberfläche erreiche ich über Port 8083
also wenn ich den webbrowser auf dem raspi aufmache kann ich ihn mit dieser url erreichen:
http://localhost:8083/fhem
muss allerdings noch username und passwort mit angeben.
in meinem script hab ich folgendes stehen
_FHEM = fhem.Fhem("localhost")
_FHEM.send_cmd("set RecordingSound off")
wenn ich versuche es so zu öffnen:
_FHEM = fhem.Fhem("localhost:8083")
macht er mir "localhost:8083:7072" draus.
Also das Anmelden/schalten über die IDE und das Terminal hat schonmal geklappt.
Ich bin den anweisungen von der Github-Seite gefolgt
https://pypi.org/project/fhem/
https://domschl.github.io/python-fhem/doc/_build/html/index.html#
aber wenn fhem das script ausführt kann es sich nicht mit dem server verbinden.
script sieht jetzt so aus:
_FHEM = fhem.Fhem(server="192.168.2.125",port=8083,protocol="http",password="xxxx",username="pi")
_FHEM.connect()
if _FHEM.connected():
print("connected as fuck")
_FHEM.send_cmd("set RecordingSound off")
else:
print("Couldn't connect")
_FHEM.close()
Log aus dem Terminal mit User: su / pi
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
recording
finished recording
connected as fuck
Und das Logfile aus FHEM
recording
finished recording
Couldn't connect
2021.07.10 18:12:02 3: ActOnRecording return value: -1
gibts hier vlt. wieder ein rechte-problem wie auch schon beim audio?
Hast Du auf http ein Passwort gesetzt?
Laut Doku ist es eine basicauth und damit eher http als FHEM login ..... ich befürchte, Du mußt bein Scriptersteller nachfragen ...
Edit: Rechtschreibfehler
Es war irgendwas mit crfs
Momentan funktionieren die Aufnahmen.
Ich habs schon fleißig getestet.
Das Skript blockiert immer noch den fhem-server während der aufnahme und meine Lampe wird nicht als "Off" dargestellt.
Das blockieren ist eher das schlimme, da so meine aufzeichnung des Soundlevels unterbrochen werden.
Ich werde diesen Thread hier schließen und einen neuen zu dem Thema aufmachen.
Vielen Dank für eure Hilfe.
Neuer Thread hier
https://forum.fhem.de/index.php/topic,121998.msg1165994.html#msg1165994