Repository: raspishake/rsudp (language: python)

Issue:
Edits based on JOSS review
Edits based on reviewer suggestions in openjournals/joss-reviews#2565, 2021-08-10.

- [x] unit tests on a CI (already [implemented with Scrutinizer CI](https://scrutinizer-ci.com/g/raspishake/rsudp/inspections))
- [x] contributing guidelines on the github page (added [here](https://github.com/raspishake/rsudp/commit/38a95c442153b88b3e54b0db2956c95a1af809bd))
- [x] adding text from the [Why it's special](https://raspishake.github.io/rsudp/about.html#why-it-s-special) section of the docs to the paper's statement of need (added [here](https://github.com/raspishake/rsudp/commit/d5ef7b53da3621300489fbf2c6024fc59092032e))
- [x] compare to and reference other software (added [here](https://github.com/raspishake/rsudp/commit/d5ef7b53da3621300489fbf2c6024fc59092032e))
- [ ] incorporate ObsPy stream (forthcoming: #12)
- [x] clarify research usefulness (done [here](https://github.com/raspishake/rsudp/commit/d5ef7b53da3621300489fbf2c6024fc59092032e))
- [x] add citations (added [here](https://github.com/raspishake/rsudp/commit/90f4bbdc84d85ce81e4b15817662d305840fe8d2))
- [x] add [tests for each module](https://github.com/openjournals/joss-reviews/issues/2565#issuecomment-897977676)
    - [x] c_alert
    - [x] c_alertsound
    - [x] c_consumer
    - [x] c_custom
    - [x] c_forward
    - [x] c_plot
    - [x] c_printraw
    - [x] c_rsam
    - [x] c_telegram
    - [x] c_testing
    - [x] c_tweet
    - [x] c_write
    - [x] t_testdata
    - [x] p_producer
- [x] add code coverage


Discussion / hints:
ObsPy streaming will need to wait for a future release.

Fix patch:
diff --git a/CHANGES.md b/CHANGES.md
index 081aa25..e132274 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -7,6 +7,8 @@
 - added feature requested in [#17](https://github.com/raspishake/rsudp/issues/17) to control forwarding of `ALARM` and `RESET` messages as well as data
 - added feature requested in [#18](https://github.com/raspishake/rsudp/issues/18) to forward messages to multiple destinations (this changes the syntax of the `"address"` and `"port"` fields of the `"forward"` settings section to lists)
 - changed logging structure to be more downstream-friendly. downstream software can now initialize logging to `/tmp/rsudp/XYZ.log` by calling `rsudp.start_logging(logname='XYZ.log')`
+- added tests for Telegram, Twitter, and write modules as suggested [in review](https://github.com/openjournals/joss-reviews/issues/2565) ([#22](https://github.com/raspishake/rsudp/issues/22))
+- addressed ([#23](https://github.com/raspishake/rsudp/issues/23)) which prevented data from being written to the output directory
 
 ## changes in 1.0.1
 - added `rsudp.c_rsam` Real-time Seismic Amplitude Measurement consumer
diff --git a/docs/c_alertsound.html b/docs/c_alertsound.html
index 327a5e5..b3eff97 100644
--- a/docs/c_alertsound.html
+++ b/docs/c_alertsound.html
@@ -218,7 +218,7 @@
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
 <li><p><strong>sta</strong> (bool or <a class="reference external" href="https://github.com/jiaaro/pydub/blob/master/API.markdown#audiosegment">pydub.AudioSegment</a>) – short term average (STA) duration in seconds.</p></li>
-<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.9)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a>.</p></li>
+<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.10)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a>.</p></li>
 </ul>
 </dd>
 </dl>
diff --git a/docs/c_custom.html b/docs/c_custom.html
index e1c03d2..cf40fe6 100644
--- a/docs/c_custom.html
+++ b/docs/c_custom.html
@@ -219,7 +219,7 @@
 Please read the disclaimers and warnings at <a class="reference internal" href="settings.html#customcode"><span class="std std-ref">custom (run custom code)</span></a> prior to using this module.</p>
 <div class="admonition warning">
 <p class="admonition-title">Warning</p>
-<p>If you are running Windows and have code you want to pass to the <a class="reference external" href="https://docs.python.org/3/library/functions.html#exec" title="(in Python v3.9)"><code class="xref py py-func docutils literal notranslate"><span class="pre">exec()</span></code></a> function,
+<p>If you are running Windows and have code you want to pass to the <a class="reference external" href="https://docs.python.org/3/library/functions.html#exec" title="(in Python v3.10)"><code class="xref py py-func docutils literal notranslate"><span class="pre">exec()</span></code></a> function,
 Python requires that your newline characters are in the UNIX style (<code class="code docutils literal notranslate"><span class="pre">\n</span></code>),
 not the standard Windows style (<code class="code docutils literal notranslate"><span class="pre">\r\n</span></code>).
 To convert, follow the instructions in one of the answers to <a href="https://stackoverflow.com/questions/17579553/windows-command-to-convert-unix-line-endings" target="_blank">this stackoverflow question</a>.
@@ -230,9 +230,9 @@
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.9)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a>.</p></li>
-<li><p><strong>codefile</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – string of the python (.py) file to run, or False if none.</p></li>
-<li><p><strong>win_ovr</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – user check to make sure that line ending format is correct (see warning above)</p></li>
+<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.10)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a>.</p></li>
+<li><p><strong>codefile</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – string of the python (.py) file to run, or False if none.</p></li>
+<li><p><strong>win_ovr</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – user check to make sure that line ending format is correct (see warning above)</p></li>
 </ul>
 </dd>
 </dl>
diff --git a/docs/c_plot.html b/docs/c_plot.html
index dfb0a40..c25130c 100644
--- a/docs/c_plot.html
+++ b/docs/c_plot.html
@@ -216,7 +216,7 @@ <h1><a class="reference internal" href="#module-rsudp.c_plot" title="rsudp.c_plo
 <span class="target" id="module-rsudp.c_plot"></span><dl class="py class">
 <dt id="rsudp.c_plot.Plot">
 <em class="property">class </em><code class="sig-prename descclassname">rsudp.c_plot.</code><code class="sig-name descname">Plot</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">q</span></em>, <em class="sig-param"><span class="n">cha</span><span class="o">=</span><span class="default_value">'all'</span></em>, <em class="sig-param"><span class="n">seconds</span><span class="o">=</span><span class="default_value">30</span></em>, <em class="sig-param"><span class="n">spectrogram</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">fullscreen</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">kiosk</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">deconv</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">screencap</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">alert</span><span class="o">=</span><span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_plot.Plot" title="Permalink to this definition">¶</a></dt>
-<dd><p>GUI plotting algorithm, compatible with both Qt5 and TkAgg backends (see <a class="reference external" href="https://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.use" title="(in Matplotlib v3.3.3)"><code class="xref py py-func docutils literal notranslate"><span class="pre">matplotlib.use()</span></code></a>).
+<dd><p>GUI plotting algorithm, compatible with both Qt5 and TkAgg backends (see <a class="reference external" href="https://matplotlib.org/api/matplotlib_configuration_api.html#matplotlib.use" title="(in Matplotlib v3.4.3)"><code class="xref py py-func docutils literal notranslate"><span class="pre">matplotlib.use()</span></code></a>).
 This module can plot seismogram data from a list of 1-4 Shake channels, and calculate and display a spectrogram beneath each.</p>
 <p>By default the plotted <code class="code json docutils literal notranslate"><span class="literal string double"><span class="pre">“duration”</span></span></code> in seconds is <code class="code json docutils literal notranslate"><span class="literal number integer"><span class="pre">30</span></span></code>.
 The plot will refresh at most once per second, but slower processors may take longer.
@@ -228,19 +228,19 @@ <h1><a class="reference internal" href="#module-rsudp.c_plot" title="rsudp.c_plo
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>cha</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.9)"><em>list</em></a>) – channels to plot. Defaults to “all” but can be passed a list of channel names as strings.</p></li>
-<li><p><strong>seconds</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – number of seconds to plot. Defaults to 30.</p></li>
-<li><p><strong>spectrogram</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether to plot the spectrogram. Defaults to True.</p></li>
-<li><p><strong>fullscreen</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether to plot in a fullscreen window. Defaults to False.</p></li>
-<li><p><strong>kiosk</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether to plot in kiosk mode (true fullscreen). Defaults to False.</p></li>
-<li><p><strong>deconv</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether to deconvolve the signal. Defaults to False.</p></li>
-<li><p><strong>screencap</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to save screenshots of events. Defaults to False.</p></li>
-<li><p><strong>alert</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether to draw the number of events at startup. Defaults to True.</p></li>
-<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.9)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p></li>
+<li><p><strong>cha</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.10)"><em>list</em></a>) – channels to plot. Defaults to “all” but can be passed a list of channel names as strings.</p></li>
+<li><p><strong>seconds</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – number of seconds to plot. Defaults to 30.</p></li>
+<li><p><strong>spectrogram</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether to plot the spectrogram. Defaults to True.</p></li>
+<li><p><strong>fullscreen</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether to plot in a fullscreen window. Defaults to False.</p></li>
+<li><p><strong>kiosk</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether to plot in kiosk mode (true fullscreen). Defaults to False.</p></li>
+<li><p><strong>deconv</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether to deconvolve the signal. Defaults to False.</p></li>
+<li><p><strong>screencap</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to save screenshots of events. Defaults to False.</p></li>
+<li><p><strong>alert</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether to draw the number of events at startup. Defaults to True.</p></li>
+<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.10)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p></li>
 </ul>
 </dd>
 <dt class="field-even">Raises</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#ImportError" title="(in Python v3.9)"><strong>ImportError</strong></a> – if the module cannot import either of the Matplotlib Qt5 or TkAgg backends</p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#ImportError" title="(in Python v3.10)"><strong>ImportError</strong></a> – if the module cannot import either of the Matplotlib Qt5 or TkAgg backends</p>
 </dd>
 </dl>
 <dl class="py method">
@@ -287,15 +287,15 @@ <h1><a class="reference internal" href="#module-rsudp.c_plot" title="rsudp.c_plo
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>i</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – number of plot events without clearing the linecache</p></li>
-<li><p><strong>u</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – queue blocking counter</p></li>
+<li><p><strong>i</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – number of plot events without clearing the linecache</p></li>
+<li><p><strong>u</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – queue blocking counter</p></li>
 </ul>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>number of plot events without clearing the linecache and queue blocking counter</p>
 </dd>
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)">int</a>, <a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)">int</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)">int</a>, <a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)">int</a></p>
 </dd>
 </dl>
 </dd></dl>
@@ -307,13 +307,13 @@ <h1><a class="reference internal" href="#module-rsudp.c_plot" title="rsudp.c_plo
 This is a way to figure out how many channels have arrived in the queue.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>u</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – queue blocking counter</p>
+<dd class="field-odd"><p><strong>u</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – queue blocking counter</p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>queue blocking counter</p>
 </dd>
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)">int</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)">int</a></p>
 </dd>
 </dl>
 </dd></dl>
@@ -330,14 +330,14 @@ <h1><a class="reference internal" href="#module-rsudp.c_plot" title="rsudp.c_plo
 
 <dl class="py method">
 <dt id="rsudp.c_plot.Plot.savefig">
-<code class="sig-name descname">savefig</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">event_time</span><span class="o">=</span><span class="default_value">UTCDateTime(2021, 1, 20, 22, 52, 11, 958159)</span></em>, <em class="sig-param"><span class="n">event_time_str</span><span class="o">=</span><span class="default_value">'2021-01-20-225211'</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_plot.Plot.savefig" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname">savefig</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">event_time</span><span class="o">=</span><span class="default_value">UTCDateTime(2021, 10, 16, 21, 22, 10, 585011)</span></em>, <em class="sig-param"><span class="n">event_time_str</span><span class="o">=</span><span class="default_value">'2021-10-16-212210'</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_plot.Plot.savefig" title="Permalink to this definition">¶</a></dt>
 <dd><p>Saves the figure and puts an IMGPATH message on the master queue.
 This message can be used to upload the image to various services.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
 <li><p><strong>event_time</strong> (<a class="reference external" href="https://docs.obspy.org/packages/autogen/obspy.core.utcdatetime.UTCDateTime.html#obspy.core.utcdatetime.UTCDateTime" title="(in ObsPy Documentation (1.2.0) v1.2)"><em>obspy.core.utcdatetime.UTCDateTime</em></a>) – Event time as an obspy UTCDateTime object.</p></li>
-<li><p><strong>event_time_str</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – Event time as a string. This is used to set the filename.</p></li>
+<li><p><strong>event_time_str</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – Event time as a string. This is used to set the filename.</p></li>
 </ul>
 </dd>
 </dl>
diff --git a/docs/c_telegram.html b/docs/c_telegram.html
index 527b8f2..a9fd91b 100644
--- a/docs/c_telegram.html
+++ b/docs/c_telegram.html
@@ -211,7 +211,7 @@
 <span id="rsudp-c-telegram-telegram-alerts"></span><h1><a class="reference internal" href="#module-rsudp.c_telegram" title="rsudp.c_telegram"><code class="xref py py-data docutils literal notranslate"><span class="pre">rsudp.c_telegram</span></code></a> (Telegram alerts)<a class="headerlink" href="#module-rsudp.c_telegram" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
 <dt id="rsudp.c_telegram.Telegrammer">
-<em class="property">class </em><code class="sig-prename descclassname">rsudp.c_telegram.</code><code class="sig-name descname">Telegrammer</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">token</span></em>, <em class="sig-param"><span class="n">chat_id</span></em>, <em class="sig-param"><span class="n">q</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">send_images</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">sender</span><span class="o">=</span><span class="default_value">'Telegram'</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_telegram.Telegrammer" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="sig-prename descclassname">rsudp.c_telegram.</code><code class="sig-name descname">Telegrammer</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">token</span></em>, <em class="sig-param"><span class="n">chat_id</span></em>, <em class="sig-param"><span class="n">testing</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">q</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">send_images</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">sender</span><span class="o">=</span><span class="default_value">'Telegram'</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_telegram.Telegrammer" title="Permalink to this definition">¶</a></dt>
 <dd><blockquote>
 <div><div class="versionadded">
 <p><span class="versionmodified added">New in version 0.4.2.</span></p>
@@ -220,15 +220,14 @@
 <p><a href="https://t.me/" target="_blank">Telegram</a> is a free messaging service which,
 among other things, is suited to quickly broadcasting automatic
 notifications via an API.
-It is <a href="https://t.me/sasmex" target="_blank">used by</a> the Mexican Early Warning
-System (SASMEX) and PanamaIGC.</p>
+It is used by the <a href="https://t.me/sasmex" target="_blank">Mexican Early Warning System (SASMEX)</a> and PanamaIGC.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>token</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – bot token from Telegram bot creation</p></li>
-<li><p><strong>chat_id</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – Telegram chat ID number that this module will post to</p></li>
-<li><p><strong>send_images</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to send images. if False, only alerts will be sent.</p></li>
-<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.9)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p></li>
+<li><p><strong>token</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – bot token from Telegram bot creation</p></li>
+<li><p><strong>chat_id</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – Telegram chat ID number that this module will post to</p></li>
+<li><p><strong>send_images</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to send images. if False, only alerts will be sent.</p></li>
+<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.10)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p></li>
 </ul>
 </dd>
 </dl>
diff --git a/docs/c_tweet.html b/docs/c_tweet.html
index b200eac..312462b 100644
--- a/docs/c_tweet.html
+++ b/docs/c_tweet.html
@@ -211,7 +211,7 @@
 <span id="rsudp-c-tweet-twitter-alerts"></span><h1><a class="reference internal" href="#module-rsudp.c_tweet" title="rsudp.c_tweet"><code class="xref py py-data docutils literal notranslate"><span class="pre">rsudp.c_tweet</span></code></a> (Twitter alerts)<a class="headerlink" href="#module-rsudp.c_tweet" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
 <dt id="rsudp.c_tweet.Tweeter">
-<em class="property">class </em><code class="sig-prename descclassname">rsudp.c_tweet.</code><code class="sig-name descname">Tweeter</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">consumer_key</span></em>, <em class="sig-param"><span class="n">consumer_secret</span></em>, <em class="sig-param"><span class="n">access_token</span></em>, <em class="sig-param"><span class="n">access_token_secret</span></em>, <em class="sig-param"><span class="n">q</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">tweet_images</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">extra_text</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_tweet.Tweeter" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="sig-prename descclassname">rsudp.c_tweet.</code><code class="sig-name descname">Tweeter</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">consumer_key</span></em>, <em class="sig-param"><span class="n">consumer_secret</span></em>, <em class="sig-param"><span class="n">access_token</span></em>, <em class="sig-param"><span class="n">access_token_secret</span></em>, <em class="sig-param"><span class="n">q</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">tweet_images</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">extra_text</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">testing</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_tweet.Tweeter" title="Permalink to this definition">¶</a></dt>
 <dd><div class="versionadded">
 <p><span class="versionmodified added">New in version 1.0.2: </span>The option to add extra text to tweets using the <code class="code docutils literal notranslate"><span class="pre">&quot;extra_text&quot;</span></code>
 setting in settings files built by this version and later.</p>
@@ -234,18 +234,18 @@
 <p>In general, if you are looking for a simple multi-platform notification
 service, it may be easier and more reliable to use the Telegram service
 instead. rsudp has a telegram module at
-:py:class:rsudp.c_telegram.Telegram:. See <a class="reference internal" href="settings.html#setting-up-telegram"><span class="std std-ref">Setting up a Telegram Bot</span></a> for details.</p>
+<code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_telegram.Telegram</span></code>. See <a class="reference internal" href="settings.html#setting-up-telegram"><span class="std std-ref">Setting up a Telegram Bot</span></a> for details.</p>
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>consumer_key</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – Twitter calls this the “consumer key”</p></li>
-<li><p><strong>consumer_secret</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – Twitter calls this the “consumer key secret”</p></li>
-<li><p><strong>access_token</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – Twitter calls this the “consumer access token”</p></li>
-<li><p><strong>access_secret</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – Twitter calls this the “consumer access secret”</p></li>
-<li><p><strong>tweet_images</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to send images. if False, only alerts will be sent.</p></li>
-<li><p><strong>extra_text</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – 103 additional characters to post as part of the twitter message.</p></li>
-<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.9)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p></li>
+<li><p><strong>consumer_key</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – Twitter calls this the “consumer key”</p></li>
+<li><p><strong>consumer_secret</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – Twitter calls this the “consumer key secret”</p></li>
+<li><p><strong>access_token</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – Twitter calls this the “consumer access token”</p></li>
+<li><p><strong>access_secret</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – Twitter calls this the “consumer access secret”</p></li>
+<li><p><strong>tweet_images</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to send images. if False, only alerts will be sent.</p></li>
+<li><p><strong>extra_text</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – 103 additional characters to post as part of the twitter message.</p></li>
+<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.10)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p></li>
 </ul>
 </dd>
 </dl>
diff --git a/docs/c_write.html b/docs/c_write.html
index 9a470c9..96574cd 100644
--- a/docs/c_write.html
+++ b/docs/c_write.html
@@ -211,14 +211,14 @@
 <span id="rsudp-c-write-write-data"></span><h1><a class="reference internal" href="#module-rsudp.c_write" title="rsudp.c_write"><code class="xref py py-data docutils literal notranslate"><span class="pre">rsudp.c_write</span></code></a> (write data)<a class="headerlink" href="#module-rsudp.c_write" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
 <dt id="rsudp.c_write.Write">
-<em class="property">class </em><code class="sig-prename descclassname">rsudp.c_write.</code><code class="sig-name descname">Write</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">q</span></em>, <em class="sig-param"><span class="n">debug</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">cha</span><span class="o">=</span><span class="default_value">'all'</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_write.Write" title="Permalink to this definition">¶</a></dt>
+<em class="property">class </em><code class="sig-prename descclassname">rsudp.c_write.</code><code class="sig-name descname">Write</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">q</span></em>, <em class="sig-param"><span class="n">data_dir</span></em>, <em class="sig-param"><span class="n">debug</span><span class="o">=</span><span class="default_value">False</span></em>, <em class="sig-param"><span class="n">cha</span><span class="o">=</span><span class="default_value">'all'</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.c_write.Write" title="Permalink to this definition">¶</a></dt>
 <dd><p>A simple routine to write daily miniSEED data to <code class="code docutils literal notranslate"><span class="pre">output_dir/data</span></code>.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>cha</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.9)"><em>list</em></a>) – channel(s) to forward. others will be ignored.</p></li>
-<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.9)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p></li>
-<li><p><strong>debug</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to display messages when writing data to disk.</p></li>
+<li><p><strong>cha</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.10)"><em>list</em></a>) – channel(s) to forward. others will be ignored.</p></li>
+<li><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.10)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p></li>
+<li><p><strong>debug</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to display messages when writing data to disk.</p></li>
 </ul>
 </dd>
 </dl>
@@ -228,7 +228,7 @@
 <dd><p>Ticks self variables over into a new day for file naming purposes.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>new</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – If <code class="docutils literal notranslate"><span class="pre">False</span></code>, the program is starting. If <code class="docutils literal notranslate"><span class="pre">True</span></code>, the UTC date just elapsed.</p>
+<dd class="field-odd"><p><strong>new</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – If <code class="docutils literal notranslate"><span class="pre">False</span></code>, the program is starting. If <code class="docutils literal notranslate"><span class="pre">True</span></code>, the UTC date just elapsed.</p>
 </dd>
 </dl>
 </dd></dl>
@@ -239,7 +239,7 @@
 <dd><p>Reads data from the queue and updates the stream.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>Returns <code class="docutils literal notranslate"><span class="pre">True</span></code> if stream is updated, otherwise <code class="docutils literal notranslate"><span class="pre">False</span></code>.</p>
@@ -273,7 +273,7 @@
 or a new UTC day has just started, then this function writes to a new file).</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>stream</strong> (<a class="reference external" href="https://docs.obspy.org/packages/autogen/obspy.core.stream.Stream.html#obspy.core.stream.Stream" title="(in ObsPy Documentation (1.2.0) v1.2)"><em>obspy.core.stream.Stream</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – The stream segment to write. If <code class="docutils literal notranslate"><span class="pre">False</span></code>, the program has just started.</p>
+<dd class="field-odd"><p><strong>stream</strong> (<a class="reference external" href="https://docs.obspy.org/packages/autogen/obspy.core.stream.Stream.html#obspy.core.stream.Stream" title="(in ObsPy Documentation (1.2.0) v1.2)"><em>obspy.core.stream.Stream</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – The stream segment to write. If <code class="docutils literal notranslate"><span class="pre">False</span></code>, the program has just started.</p>
 </dd>
 </dl>
 </dd></dl>
diff --git a/docs/client.html b/docs/client.html
index 90809b8..2c83057 100644
--- a/docs/client.html
+++ b/docs/client.html
@@ -212,7 +212,7 @@
 <dl class="py function">
 <dt id="rsudp.client.handler">
 <code class="sig-prename descclassname">rsudp.client.</code><code class="sig-name descname">handler</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">sig</span></em>, <em class="sig-param"><span class="n">frame</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.client.handler" title="Permalink to this definition">¶</a></dt>
-<dd><p>Function passed to <a class="reference external" href="https://docs.python.org/3/library/signal.html#signal.signal" title="(in Python v3.9)"><code class="xref py py-func docutils literal notranslate"><span class="pre">signal.signal()</span></code></a> to handle close events</p>
+<dd><p>Function passed to <a class="reference external" href="https://docs.python.org/3/library/signal.html#signal.signal" title="(in Python v3.10)"><code class="xref py py-func docutils literal notranslate"><span class="pre">signal.signal()</span></code></a> to handle close events</p>
 </dd></dl>
 
 <dl class="py function">
@@ -228,7 +228,7 @@
 <dd><p>Appends a process to the list of threads to start and stop.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>proc</strong> (<a class="reference external" href="https://docs.python.org/3/library/threading.html#threading.Thread" title="(in Python v3.9)"><em>threading.Thread</em></a>) – The process thread to append to the list of threads.</p>
+<dd class="field-odd"><p><strong>proc</strong> (<a class="reference external" href="https://docs.python.org/3/library/threading.html#threading.Thread" title="(in Python v3.10)"><em>threading.Thread</em></a>) – The process thread to append to the list of threads.</p>
 </dd>
 </dl>
 </dd></dl>
@@ -241,7 +241,7 @@
 <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a>.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.9)">queue.Queue</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.10)">queue.Queue</a></p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>Returns the queue to pass to the sub-consumer.</p>
@@ -257,8 +257,8 @@
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>settings</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.9)"><em>dict</em></a>) – settings dictionary (see <a class="reference internal" href="settings.html#defaults"><span class="std std-ref">Default settings</span></a> for guidance)</p></li>
-<li><p><strong>debug</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to show debug output (should be turned off if starting as daemon)</p></li>
+<li><p><strong>settings</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.10)"><em>dict</em></a>) – settings dictionary (see <a class="reference internal" href="settings.html#defaults"><span class="std std-ref">Default settings</span></a> for guidance)</p></li>
+<li><p><strong>debug</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to show debug output (should be turned off if starting as daemon)</p></li>
 </ul>
 </dd>
 </dl>
@@ -287,13 +287,13 @@
 testing-specific actions should be taken in routines.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>mode</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – if <code class="docutils literal notranslate"><span class="pre">True</span></code> or <code class="docutils literal notranslate"><span class="pre">False</span></code>, sets testing mode state. if anything else, returns state only.</p>
+<dd class="field-odd"><p><strong>mode</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – if <code class="docutils literal notranslate"><span class="pre">True</span></code> or <code class="docutils literal notranslate"><span class="pre">False</span></code>, sets testing mode state. if anything else, returns state only.</p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>testing mode state</p>
 </dd>
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 </dl>
 </dd></dl>
diff --git a/docs/init.html b/docs/init.html
index b8258d0..4ec094f 100644
--- a/docs/init.html
+++ b/docs/init.html
@@ -221,9 +221,9 @@ <h1><a class="reference internal" href="#module-rsudp.__init__" title="rsudp.__i
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>fmt</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.9)"><em>None</em></a>) – Format of message strings (see <a class="reference external" href="https://docs.python.org/3/library/logging.html#module-logging" title="(in Python v3.9)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">logging</span></code></a>; example: <code class="docutils literal notranslate"><span class="pre">'%(asctime)-15s</span> <span class="pre">%(msg)s'</span></code>)</p></li>
-<li><p><strong>datefmt</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.9)"><em>None</em></a>) – Date strings in strftime format (see <a class="reference external" href="https://docs.python.org/3/library/logging.html#module-logging" title="(in Python v3.9)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">logging</span></code></a> example: <code class="docutils literal notranslate"><span class="pre">'%Y-%m-%d</span> <span class="pre">%H:%M:%S'</span></code>)</p></li>
-<li><p><strong>level_fmts</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.9)"><em>dict</em></a>) – Dictionary of log levels and associated formats <code class="docutils literal notranslate"><span class="pre">{logging.INFO:</span> <span class="pre">'infoformat',</span> <span class="pre">logging.WARNING:</span> <span class="pre">'warnformat',</span> <span class="pre">logging.ERROR:</span> <span class="pre">'errformat'}</span></code></p></li>
+<li><p><strong>fmt</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.10)"><em>None</em></a>) – Format of message strings (see <a class="reference external" href="https://docs.python.org/3/library/logging.html#module-logging" title="(in Python v3.10)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">logging</span></code></a>; example: <code class="docutils literal notranslate"><span class="pre">'%(asctime)-15s</span> <span class="pre">%(msg)s'</span></code>)</p></li>
+<li><p><strong>datefmt</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a><em> or </em><a class="reference external" href="https://docs.python.org/3/library/constants.html#None" title="(in Python v3.10)"><em>None</em></a>) – Date strings in strftime format (see <a class="reference external" href="https://docs.python.org/3/library/logging.html#module-logging" title="(in Python v3.10)"><code class="xref py py-mod docutils literal notranslate"><span class="pre">logging</span></code></a> example: <code class="docutils literal notranslate"><span class="pre">'%Y-%m-%d</span> <span class="pre">%H:%M:%S'</span></code>)</p></li>
+<li><p><strong>level_fmts</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.10)"><em>dict</em></a>) – Dictionary of log levels and associated formats <code class="docutils literal notranslate"><span class="pre">{logging.INFO:</span> <span class="pre">'infoformat',</span> <span class="pre">logging.WARNING:</span> <span class="pre">'warnformat',</span> <span class="pre">logging.ERROR:</span> <span class="pre">'errformat'}</span></code></p></li>
 </ul>
 </dd>
 </dl>
@@ -249,13 +249,13 @@ <h1><a class="reference internal" href="#module-rsudp.__init__" title="rsudp.__i
 <dd><p>Creates an additional handler for logging info and warnings to the command line.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>testing</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not testing is active (adds a “TESTING” label to messages)</p>
+<dd class="field-odd"><p><strong>testing</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not testing is active (adds a “TESTING” label to messages)</p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p>
 </dd>
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 </dl>
 </dd></dl>
@@ -266,13 +266,13 @@ <h1><a class="reference internal" href="#module-rsudp.__init__" title="rsudp.__i
 <dd><p>Initialize the write directories if they do not already exist.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>odir</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – output directory</p>
+<dd class="field-odd"><p><strong>odir</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – output directory</p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p>
 </dd>
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 </dl>
 </dd></dl>
@@ -284,10 +284,10 @@ <h1><a class="reference internal" href="#module-rsudp.__init__" title="rsudp.__i
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>msg</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – message to log</p></li>
-<li><p><strong>sender</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – the name of the class or function sending the message</p></li>
-<li><p><strong>announce</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to display “WARNING” before the message</p></li>
-<li><p><strong>spaces</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to display formatting spaces before the message</p></li>
+<li><p><strong>msg</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – message to log</p></li>
+<li><p><strong>sender</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – the name of the class or function sending the message</p></li>
+<li><p><strong>announce</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to display “WARNING” before the message</p></li>
+<li><p><strong>spaces</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to display formatting spaces before the message</p></li>
 </ul>
 </dd>
 </dl>
@@ -300,8 +300,8 @@ <h1><a class="reference internal" href="#module-rsudp.__init__" title="rsudp.__i
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>msg</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – message to log</p></li>
-<li><p><strong>sender</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – the name of the class or function sending the message</p></li>
+<li><p><strong>msg</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – message to log</p></li>
+<li><p><strong>sender</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – the name of the class or function sending the message</p></li>
 </ul>
 </dd>
 </dl>
@@ -314,10 +314,10 @@ <h1><a class="reference internal" href="#module-rsudp.__init__" title="rsudp.__i
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>msg</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – message to log</p></li>
-<li><p><strong>sender</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – the name of the class or function sending the message</p></li>
-<li><p><strong>announce</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to display “WARNING” before the message</p></li>
-<li><p><strong>spaces</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to display formatting spaces before the message</p></li>
+<li><p><strong>msg</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – message to log</p></li>
+<li><p><strong>sender</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – the name of the class or function sending the message</p></li>
+<li><p><strong>announce</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to display “WARNING” before the message</p></li>
+<li><p><strong>spaces</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to display formatting spaces before the message</p></li>
 </ul>
 </dd>
 </dl>
@@ -325,17 +325,17 @@ <h1><a class="reference internal" href="#module-rsudp.__init__" title="rsudp.__i
 
 <dl class="py function">
 <dt id="rsudp.__init__.start_logging">
-<code class="sig-prename descclassname">rsudp.__init__.</code><code class="sig-name descname">start_logging</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">testing</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.__init__.start_logging" title="Permalink to this definition">¶</a></dt>
+<code class="sig-prename descclassname">rsudp.__init__.</code><code class="sig-name descname">start_logging</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">logname</span><span class="o">=</span><span class="default_value">'rsudp.log'</span></em>, <em class="sig-param"><span class="n">testing</span><span class="o">=</span><span class="default_value">False</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.__init__.start_logging" title="Permalink to this definition">¶</a></dt>
 <dd><p>Creates a handler for logging info and warnings to file.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>testing</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not testing is active (adds a “TESTING” label to messages)</p>
+<dd class="field-odd"><p><strong>testing</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not testing is active (adds a “TESTING” label to messages)</p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p>
 </dd>
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 </dl>
 </dd></dl>
diff --git a/docs/raspberryshake.html b/docs/raspberryshake.html
index 1f078e0..0fd8bfd 100644
--- a/docs/raspberryshake.html
+++ b/docs/raspberryshake.html
@@ -239,12 +239,12 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 <em class="property">class </em><code class="sig-prename descclassname">rsudp.raspberryshake.</code><code class="sig-name descname">ConsumerThread</code><a class="headerlink" href="#rsudp.raspberryshake.ConsumerThread" title="Permalink to this definition">¶</a></dt>
 <dd><p>The default consumer thread setup.
 Import this consumer and easily create your own consumer modules!
-This class modifies the <a class="reference external" href="https://docs.python.org/3/library/threading.html#threading.Thread" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">threading.Thread</span></code></a> object to
+This class modifies the <a class="reference external" href="https://docs.python.org/3/library/threading.html#threading.Thread" title="(in Python v3.10)"><code class="xref py py-class docutils literal notranslate"><span class="pre">threading.Thread</span></code></a> object to
 include some settings that all rsudp consumers need,
 some of which the <a class="reference internal" href="p_producer.html#rsudp.p_producer.Producer" title="rsudp.p_producer.Producer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.p_producer.Producer</span></code></a>
 needs in order to function.</p>
 <p>Currently, the modifications that this module makes to
-<a class="reference external" href="https://docs.python.org/3/library/threading.html#threading.Thread" title="(in Python v3.9)"><code class="xref py py-class docutils literal notranslate"><span class="pre">threading.Thread</span></code></a> objects are:</p>
+<a class="reference external" href="https://docs.python.org/3/library/threading.html#threading.Thread" title="(in Python v3.10)"><code class="xref py py-class docutils literal notranslate"><span class="pre">threading.Thread</span></code></a> objects are:</p>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="bp">self</span><span class="o">.</span><span class="n">sender</span> <span class="o">=</span> <span class="s1">&#39;ConsumerThread&#39;</span>  <span class="c1"># module name used in logging</span>
 <span class="bp">self</span><span class="o">.</span><span class="n">alarm</span> <span class="o">=</span> <span class="kc">False</span>              <span class="c1"># the Producer reads this to set the ``ALARM`` state</span>
 <span class="bp">self</span><span class="o">.</span><span class="n">alarm_reset</span> <span class="o">=</span> <span class="kc">False</span>        <span class="c1"># the Producer reads this to set the ``RESET`` state</span>
@@ -308,10 +308,10 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>DP</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.9)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse channel information from</p>
+<dd class="field-odd"><p><strong>DP</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.10)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse channel information from</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)">str</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)">str</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>Returns the instrument channel as a string.</p>
@@ -332,7 +332,7 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.9)">list</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.10)">list</a></p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>The list of channels being sent to the port (from the single IP address sending data)</p>
@@ -356,15 +356,15 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.9)">bytes</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.10)">bytes</a></p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>Returns a data packet as an encoded bytes object.</p>
 </dd>
 <dt class="field-odd">Raises</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#IOError" title="(in Python v3.9)"><strong>IOError</strong></a> – if no socket is open (<a class="reference internal" href="#rsudp.raspberryshake.openSOCK" title="rsudp.raspberryshake.openSOCK"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.openSOCK()</span></code></a>) prior to running this function</p></li>
-<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#IOError" title="(in Python v3.9)"><strong>IOError</strong></a> – if the library is not initialized (<a class="reference internal" href="#rsudp.raspberryshake.initRSlib" title="rsudp.raspberryshake.initRSlib"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.initRSlib()</span></code></a>) prior to running this function</p></li>
+<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#IOError" title="(in Python v3.10)"><strong>IOError</strong></a> – if no socket is open (<a class="reference internal" href="#rsudp.raspberryshake.openSOCK" title="rsudp.raspberryshake.openSOCK"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.openSOCK()</span></code></a>) prior to running this function</p></li>
+<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#IOError" title="(in Python v3.10)"><strong>IOError</strong></a> – if the library is not initialized (<a class="reference internal" href="#rsudp.raspberryshake.initRSlib" title="rsudp.raspberryshake.initRSlib"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.initRSlib()</span></code></a>) prior to running this function</p></li>
 </ul>
 </dd>
 </dl>
@@ -390,12 +390,12 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>TR</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – The transmission frequency (<a class="reference internal" href="#rsudp.raspberryshake.getTR" title="rsudp.raspberryshake.getTR"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getTR()</span></code></a>) in milliseconds between packets</p></li>
-<li><p><strong>DP</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.9)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) calculate sample rate information from</p></li>
+<li><p><strong>TR</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – The transmission frequency (<a class="reference internal" href="#rsudp.raspberryshake.getTR" title="rsudp.raspberryshake.getTR"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getTR()</span></code></a>) in milliseconds between packets</p></li>
+<li><p><strong>DP</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.10)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) calculate sample rate information from</p></li>
 </ul>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)">int</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)">int</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>The sample rate in samples per second from a specific channel</p>
@@ -421,10 +421,10 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>DP</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.9)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse stream information from</p>
+<dd class="field-odd"><p><strong>DP</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.10)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse stream information from</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.9)">list</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#list" title="(in Python v3.10)">list</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>List of data samples in the packet</p>
@@ -453,10 +453,10 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>DP</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.9)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse time information from</p>
+<dd class="field-odd"><p><strong>DP</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.10)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse time information from</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.9)">float</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#float" title="(in Python v3.10)">float</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>Timestamp in decimal seconds since 1970-01-01 00:00:00Z</p>
@@ -481,10 +481,10 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>chn</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – The seismic instrument channel (<a class="reference internal" href="#rsudp.raspberryshake.getCHN" title="rsudp.raspberryshake.getCHN"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getCHN()</span></code></a>) to calculate transmission rate information from</p>
+<dd class="field-odd"><p><strong>chn</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – The seismic instrument channel (<a class="reference internal" href="#rsudp.raspberryshake.getCHN" title="rsudp.raspberryshake.getCHN"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getCHN()</span></code></a>) to calculate transmission rate information from</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)">int</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)">int</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>Transmission rate in milliseconds between consecutive packets from a specific channel</p>
@@ -506,7 +506,7 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)">int</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)">int</a></p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>The number of channels being sent to the port (from the single IP address sending data)</p>
@@ -540,7 +540,7 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 <dd class="field-odd"><p><strong>sender</strong> – <cite>(optional)</cite> The name of the function calling the <code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.printM()</span></code> logging function</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.obspy.org/packages/autogen/obspy.core.inventory.inventory.Inventory.html#obspy.core.inventory.inventory.Inventory" title="(in ObsPy Documentation (1.2.0) v1.2)">obspy.core.inventory.inventory.Inventory</a> or <a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.obspy.org/packages/autogen/obspy.core.inventory.inventory.Inventory.html#obspy.core.inventory.inventory.Inventory" title="(in ObsPy Documentation (1.2.0) v1.2)">obspy.core.inventory.inventory.Inventory</a> or <a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>The inventory of the Raspberry Shake station in the <code class="code pycode python docutils literal notranslate"><span class="name"><span class="pre">rsudp</span></span><span class="operator"><span class="pre">.</span></span><span class="name"><span class="pre">raspberryshake</span></span><span class="operator"><span class="pre">.</span></span><span class="name"><span class="pre">stn</span></span></code> variable.</p>
@@ -561,7 +561,7 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Return type</dt>
-<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)">str</a></p>
+<dd class="field-odd"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)">str</a></p>
 </dd>
 <dt class="field-even">Returns</dt>
 <dd class="field-even"><p>The network IP of the machine that this program is running on</p>
@@ -571,18 +571,18 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 
 <dl class="py function">
 <dt id="rsudp.raspberryshake.handler">
-<code class="sig-prename descclassname">rsudp.raspberryshake.</code><code class="sig-name descname">handler</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">signum</span></em>, <em class="sig-param"><span class="n">frame</span></em>, <em class="sig-param"><span class="n">ip</span><span class="o">=</span><span class="default_value">'100.66.33.145'</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.raspberryshake.handler" title="Permalink to this definition">¶</a></dt>
+<code class="sig-prename descclassname">rsudp.raspberryshake.</code><code class="sig-name descname">handler</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">signum</span></em>, <em class="sig-param"><span class="n">frame</span></em>, <em class="sig-param"><span class="n">ip</span><span class="o">=</span><span class="default_value">'10.8.2.2'</span></em><span class="sig-paren">)</span><a class="headerlink" href="#rsudp.raspberryshake.handler" title="Permalink to this definition">¶</a></dt>
 <dd><p>The signal handler for the nodata alarm.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>signum</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – signal number</p></li>
-<li><p><strong>frame</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – frame number</p></li>
-<li><p><strong>ip</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – the IP of the box this program is running on (i.e. the device the Raspberry Shake should send data to)</p></li>
+<li><p><strong>signum</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – signal number</p></li>
+<li><p><strong>frame</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – frame number</p></li>
+<li><p><strong>ip</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – the IP of the box this program is running on (i.e. the device the Raspberry Shake should send data to)</p></li>
 </ul>
 </dd>
 <dt class="field-even">Raises</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#IOError" title="(in Python v3.9)"><strong>IOError</strong></a> – on UNIX systems if no data is received</p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#IOError" title="(in Python v3.10)"><strong>IOError</strong></a> – on UNIX systems if no data is received</p>
 </dd>
 </dl>
 </dd></dl>
@@ -605,13 +605,13 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>dport</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – The local port the Raspberry Shake is sending UDP data packets to. Defaults to <code class="code pycode python docutils literal notranslate"><span class="literal number integer"><span class="pre">8888</span></span></code>.</p></li>
-<li><p><strong>rsstn</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – The name of the station (something like <code class="code pycode python docutils literal notranslate"><span class="literal string single"><span class="pre">‘RCB43’</span></span></code> or <code class="code pycode python docutils literal notranslate"><span class="literal string single"><span class="pre">‘S0CDE’</span></span></code>)</p></li>
-<li><p><strong>timeout</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.9)"><em>int</em></a>) – The number of seconds for <a class="reference internal" href="#rsudp.raspberryshake.set_params" title="rsudp.raspberryshake.set_params"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.set_params()</span></code></a> to wait for data before an error is raised (zero for unlimited wait)</p></li>
+<li><p><strong>dport</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – The local port the Raspberry Shake is sending UDP data packets to. Defaults to <code class="code pycode python docutils literal notranslate"><span class="literal number integer"><span class="pre">8888</span></span></code>.</p></li>
+<li><p><strong>rsstn</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – The name of the station (something like <code class="code pycode python docutils literal notranslate"><span class="literal string single"><span class="pre">‘RCB43’</span></span></code> or <code class="code pycode python docutils literal notranslate"><span class="literal string single"><span class="pre">‘S0CDE’</span></span></code>)</p></li>
+<li><p><strong>timeout</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#int" title="(in Python v3.10)"><em>int</em></a>) – The number of seconds for <a class="reference internal" href="#rsudp.raspberryshake.set_params" title="rsudp.raspberryshake.set_params"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.set_params()</span></code></a> to wait for data before an error is raised (zero for unlimited wait)</p></li>
 </ul>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)">str</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)">str</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>The instrument channel as a string</p>
@@ -634,7 +634,7 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 </div>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>d</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.9)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse Trace information from</p>
+<dd class="field-odd"><p><strong>d</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.10)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse Trace information from</p>
 </dd>
 <dt class="field-even">Return type</dt>
 <dd class="field-even"><p><a class="reference external" href="https://docs.obspy.org/packages/autogen/obspy.core.trace.Trace.html#obspy.core.trace.Trace" title="(in ObsPy Documentation (1.2.0) v1.2)">obspy.core.trace.Trace</a></p>
@@ -652,12 +652,12 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 Called by <a class="reference internal" href="#rsudp.raspberryshake.initRSlib" title="rsudp.raspberryshake.initRSlib"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.initRSlib()</span></code></a>, must be done before <a class="reference internal" href="#rsudp.raspberryshake.set_params" title="rsudp.raspberryshake.set_params"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.set_params()</span></code></a>.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>host</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – self-referential location at which to open a listening port (defaults to <code class="code pycode python docutils literal notranslate"><span class="literal string single"><span class="pre">‘’</span></span></code> which resolves to <code class="code pycode python docutils literal notranslate"><span class="literal string single"><span class="pre">‘localhost’</span></span></code>)</p>
+<dd class="field-odd"><p><strong>host</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – self-referential location at which to open a listening port (defaults to <code class="code pycode python docutils literal notranslate"><span class="literal string single"><span class="pre">‘’</span></span></code> which resolves to <code class="code pycode python docutils literal notranslate"><span class="literal string single"><span class="pre">‘localhost’</span></span></code>)</p>
 </dd>
 <dt class="field-even">Raises</dt>
 <dd class="field-even"><ul class="simple">
-<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#IOError" title="(in Python v3.9)"><strong>IOError</strong></a> – if the library is not initialized (<a class="reference internal" href="#rsudp.raspberryshake.initRSlib" title="rsudp.raspberryshake.initRSlib"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.initRSlib()</span></code></a>) prior to running this function</p></li>
-<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#OSError" title="(in Python v3.9)"><strong>OSError</strong></a> – if the program cannot bind to the specified port number</p></li>
+<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#IOError" title="(in Python v3.10)"><strong>IOError</strong></a> – if the library is not initialized (<a class="reference internal" href="#rsudp.raspberryshake.initRSlib" title="rsudp.raspberryshake.initRSlib"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.initRSlib()</span></code></a>) prior to running this function</p></li>
+<li><p><a class="reference external" href="https://docs.python.org/3/library/exceptions.html#OSError" title="(in Python v3.10)"><strong>OSError</strong></a> – if the program cannot bind to the specified port number</p></li>
 </ul>
 </dd>
 </dl>
@@ -696,7 +696,7 @@ <h1><a class="reference internal" href="#module-rsudp.raspberryshake" title="rsu
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
 <li><p><strong>stream</strong> (<a class="reference external" href="https://docs.obspy.org/packages/autogen/obspy.core.stream.Stream.html#obspy.core.stream.Stream" title="(in ObsPy Documentation (1.2.0) v1.2)"><em>obspy.core.stream.Stream</em></a>) – The stream to update</p></li>
-<li><p><strong>d</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.9)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse Stream information from</p></li>
+<li><p><strong>d</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#bytes" title="(in Python v3.10)"><em>bytes</em></a>) – The Raspberry Shake UDP data packet (<a class="reference internal" href="#rsudp.raspberryshake.getDATA" title="rsudp.raspberryshake.getDATA"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.raspberryshake.getDATA()</span></code></a>) to parse Stream information from</p></li>
 </ul>
 </dd>
 <dt class="field-even">Return type</dt>
diff --git a/docs/searchindex.js b/docs/searchindex.js
index 75acde0..9bd91f8 100644
--- a/docs/searchindex.js
+++ b/docs/searchindex.js
@@ -1,1 +1,1 @@
-Search.setIndex({docnames:["about","c_alert","c_alertsound","c_consumer","c_custom","c_forward","c_plot","c_rsam","c_telegram","c_testing","c_tweet","c_write","client","contributing","daemon","helpers","index","init","installing","p_producer","packetize","packetloss","raspberryshake","running","settings","t_testdata","test","testing","theory","troubleshooting","youtube"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":2,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,sphinx:56},filenames:["about.rst","c_alert.rst","c_alertsound.rst","c_consumer.rst","c_custom.rst","c_forward.rst","c_plot.rst","c_rsam.rst","c_telegram.rst","c_testing.rst","c_tweet.rst","c_write.rst","client.rst","contributing.rst","daemon.rst","helpers.rst","index.rst","init.rst","installing.rst","p_producer.rst","packetize.rst","packetloss.rst","raspberryshake.rst","running.rst","settings.rst","t_testdata.rst","test.rst","testing.rst","theory.rst","troubleshooting.rst","youtube.rst"],objects:{"rsudp.__init__":{LevelFormatter:[17,1,1,""],add_debug_handler:[17,3,1,""],init_dirs:[17,3,1,""],printE:[17,3,1,""],printM:[17,3,1,""],printW:[17,3,1,""],start_logging:[17,3,1,""]},"rsudp.__init__.LevelFormatter":{format:[17,2,1,""]},"rsudp.c_alert":{Alert:[1,1,1,""]},"rsudp.c_alert.Alert":{run:[1,2,1,""]},"rsudp.c_alertsound":{AlertSound:[2,1,1,""]},"rsudp.c_alertsound.AlertSound":{run:[2,2,1,""]},"rsudp.c_consumer":{Consumer:[3,1,1,""]},"rsudp.c_consumer.Consumer":{run:[3,2,1,""]},"rsudp.c_custom":{Custom:[4,1,1,""]},"rsudp.c_custom.Custom":{run:[4,2,1,""]},"rsudp.c_forward":{Forward:[5,1,1,""]},"rsudp.c_forward.Forward":{run:[5,2,1,""]},"rsudp.c_plot":{Plot:[6,1,1,""]},"rsudp.c_plot.Plot":{deconvolve:[6,2,1,""],figloop:[6,2,1,""],getq:[6,2,1,""],handle_close:[6,2,1,""],handle_resize:[6,2,1,""],mainloop:[6,2,1,""],qu:[6,2,1,""],run:[6,2,1,""],savefig:[6,2,1,""],set_sps:[6,2,1,""],setup_plot:[6,2,1,""],update_plot:[6,2,1,""]},"rsudp.c_rsam":{RSAM:[7,1,1,""]},"rsudp.c_rsam.RSAM":{run:[7,2,1,""]},"rsudp.c_telegram":{Telegrammer:[8,1,1,""]},"rsudp.c_telegram.Telegrammer":{run:[8,2,1,""]},"rsudp.c_testing":{Testing:[9,1,1,""]},"rsudp.c_testing.Testing":{run:[9,2,1,""]},"rsudp.c_tweet":{Tweeter:[10,1,1,""]},"rsudp.c_tweet.Tweeter":{run:[10,2,1,""]},"rsudp.c_write":{Write:[11,1,1,""]},"rsudp.c_write.Write":{elapse:[11,2,1,""],getq:[11,2,1,""],run:[11,2,1,""],set_sps:[11,2,1,""],slicestream:[11,2,1,""],write:[11,2,1,""]},"rsudp.client":{handler:[12,3,1,""],main:[12,3,1,""],mk_p:[12,3,1,""],mk_q:[12,3,1,""],run:[12,3,1,""],start:[12,3,1,""],test:[12,3,1,""],test_mode:[12,3,1,""]},"rsudp.helpers":{conn_stats:[15,3,1,""],deconv_acc_inst:[15,3,1,""],deconv_rbm_inst:[15,3,1,""],deconv_vel_inst:[15,3,1,""],deconvolve:[15,3,1,""],default_settings:[15,3,1,""],dump_default:[15,3,1,""],fsec:[15,3,1,""],get_msg_path:[15,3,1,""],get_msg_time:[15,3,1,""],msg_alarm:[15,3,1,""],msg_imgpath:[15,3,1,""],msg_reset:[15,3,1,""],msg_term:[15,3,1,""],read_settings:[15,3,1,""],set_channels:[15,3,1,""]},"rsudp.p_producer":{Producer:[19,1,1,""]},"rsudp.p_producer.Producer":{run:[19,2,1,""]},"rsudp.packetize":{main:[20,3,1,""],packetize:[20,3,1,""]},"rsudp.packetloss":{main:[21,3,1,""],printTTLS:[21,3,1,""],run:[21,3,1,""],signal_handler:[21,3,1,""]},"rsudp.raspberryshake":{ConsumerThread:[22,1,1,""],copy:[22,3,1,""],getCHN:[22,3,1,""],getCHNS:[22,3,1,""],getDATA:[22,3,1,""],getSR:[22,3,1,""],getSTREAM:[22,3,1,""],getTIME:[22,3,1,""],getTR:[22,3,1,""],getTTLCHN:[22,3,1,""],get_inventory:[22,3,1,""],get_ip:[22,3,1,""],handler:[22,3,1,""],initRSlib:[22,3,1,""],make_trace:[22,3,1,""],openSOCK:[22,3,1,""],set_params:[22,3,1,""],update_stream:[22,3,1,""]},"rsudp.t_testdata":{TestData:[25,1,1,""]},"rsudp.t_testdata.TestData":{run:[25,2,1,""],send:[25,2,1,""]},"rsudp.test":{cancel_tests:[26,3,1,""],datadir_permissions:[26,3,1,""],is_connected:[26,3,1,""],logdir_permissions:[26,3,1,""],make_test_settings:[26,3,1,""],permissions:[26,3,1,""],ss_permissions:[26,3,1,""]},rsudp:{__init__:[17,0,0,"-"],c_alert:[1,0,0,"-"],c_alertsound:[2,0,0,"-"],c_consumer:[3,0,0,"-"],c_custom:[4,0,0,"-"],c_forward:[5,0,0,"-"],c_plot:[6,0,0,"-"],c_rsam:[7,0,0,"-"],c_telegram:[8,0,0,"-"],c_testing:[9,0,0,"-"],c_tweet:[10,0,0,"-"],c_write:[11,0,0,"-"],client:[12,0,0,"-"],helpers:[15,0,0,"-"],p_producer:[19,0,0,"-"],packetize:[20,0,0,"-"],packetloss:[21,0,0,"-"],raspberryshake:[22,0,0,"-"],t_testdata:[25,0,0,"-"],test:[26,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"00z":22,"01t00":15,"10s":14,"15s":17,"16b":[0,24],"1dv7":22,"211704z":28,"21t19":22,"21t20":22,"23t06":28,"246777z":22,"292000z":22,"435214z":28,"532000z":22,"598944z":28,"599z":15,"boolean":[5,24,28],"break":25,"byte":[15,22,28],"case":[18,24,28,29],"class":[1,2,3,4,5,6,7,8,9,10,11,13,15,17,19,22,24,25,28],"default":[1,6,7,12,14,15,16,18,22,23,26,27,28],"final":[14,28,29],"float":[1,7,22,24],"function":[1,4,6,9,11,12,13,20,22,23,24,26,28],"import":[0,6,15,20,22,24,26,28],"int":[6,21,22,25],"long":[1,24],"new":[4,5,6,7,8,9,10,11,12,13,14,15,18,22,24,25,26,27,28,29],"public":[10,29],"return":[6,11,12,15,17,21,22,26,28],"short":[1,2,24],"super":28,"throw":24,"true":[1,4,6,7,11,12,15,17,21,22,24,26,28],"try":26,"while":[0,24,28,29],Adding:[13,16,22],And:28,EHE:15,ENE:15,For:[9,12,15,18,22,24,25,27,28,29],One:29,Pis:24,That:[24,27],The:[0,1,3,5,6,10,11,12,13,15,16,17,19,20,21,22,23,24,26,27,28,29],Then:[25,26,28,29],There:[24,28,29],These:[9,15,17,24],Using:[16,28],Will:22,__init__:[16,28],abc:28,abil:[0,27],abl:[0,24,28,29],abort:29,about:[4,13,14,15,16,23,24,27,28,29],abov:[4,23,24,28,29],acc:[7,24],acceler:[15,24],acceleromet:[0,15,24],access:[10,24],access_secret:[10,24],access_token:[10,24],access_token_secret:10,accommod:24,accompani:0,accordingli:24,account:[10,24],accumul:22,accur:15,achiev:[0,24],across:[0,6,24,29],action:[0,12,27,28],activ:[0,10,14,17,18,20,21,23,24,29],actual:[13,24],adapt:[17,22],add:[0,10,17,24,26,28],add_debug_handl:17,added:[13,22,28],adding:27,addit:[0,10,13,17,28],addition:[0,24],addr:5,address:[5,7,15,22,24,25,29],adjust:[24,30],administr:18,advantag:24,adventur:13,after:[0,6,14,22,23,24,28,29],again:24,agenc:[10,24],agg:13,aggress:24,aim:0,alarm:[2,4,5,6,7,8,9,10,13,15,16,22,23,24,26,27,28],alarm_reset:[1,22],alarmsound:16,alert:[0,1,2,3,6,13,15,16,19,26,27,28],alertsound:[2,24,26,28],algorithm:[6,24],aliv:[9,19,22,25,28],all:[6,11,14,15,19,22,23,24,26,28,29],allow:[6,13,15,16,28,29],almost:29,along:28,alpha:13,alreadi:[13,14,17,24,28],also:[15,19,24,25,27,28,29],alt:24,although:[0,24,29],alwai:[13,14,24],amd:18,among:8,amount:24,amplitud:[7,16],anaconda3:18,anaconda:[18,23],analysi:[16,24],ani:[0,6,15,18,23,24,27,28,29],announc:17,anoth:[5,20,24,28,29],answer:[4,17,22,24],anyth:[12,27],anywai:24,api:[8,10,24,28],api_kei:24,api_secret:24,aplot:6,app:[10,13],appear:[24,29],append:[11,12,17,18,24],appli:[7,10,24],applic:0,appropri:[12,18,24],approxim:24,apt:24,arbitrari:27,architectur:[16,18,27],archiv:27,arg:[1,7],argument:[20,21,22],armv7:18,armv7l:18,around:29,arriv:[2,6,24,25],artifici:27,ascii:20,asctim:17,ask:[18,29],aspect:0,assign:22,associ:17,assum:[0,24,28,29],atop:24,attach:[13,29],attribut:[17,22],audibl:0,audioseg:2,authent:24,automat:[8,18,22],avail:[0,15,16,18,22,23,24,26,27,30],averag:[1,2,24,29],avoid:[6,24],awai:0,axvlin:13,back:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],backend:[6,13,26],backtick:[13,29],bak:18,bandpass:[1,24],bar:29,base:[18,24,27,28],bash:[14,18,23],basic:[24,27],bat:[18,23],batch:[13,23],beauti:0,becaus:[15,22,24],becom:27,bedrock:24,been:[0,18,24,29],beep:24,befor:[17,22,24,28],beforehand:24,begin:[6,23,25],behalf:10,behavior:6,being:[22,24,29],below:[0,16,18,24,27,28,29],beneath:[6,24],berryconda3:18,better:24,between:[21,22,24,28,29],beyond:13,bin:14,binari:24,bind:22,bit:27,block:6,blue:29,boaz:16,bonu:24,bool:[1,2,4,5,6,7,8,10,11,12,15,17,21,22,26,28],boom:[15,16,22,24,27,30],boot:14,bot:[8,10],botfath:24,both:[0,5,6,13,14,15,18,22,24,28],box:22,brace:28,brew:24,brief:[0,24],briefli:28,bring:[0,24],broad:16,broadcast:[6,8,24,28],bug:[16,22,29],build:[22,24,28],built:[5,10],button:29,buzzer:13,c_alarm:[9,26],c_alert:[13,15,16,24],c_alertsound:[16,24,28],c_anotheron:28,c_consum:[1,2,4,5,6,7,8,9,10,11,12,16,19,25,28],c_custom:[13,16,24],c_data:[9,26],c_forward:[16,24],c_imgpath:[9,26],c_mymodul:28,c_mytest:28,c_plot:[15,16,24,28],c_printraw:24,c_process:[9,26],c_reset:[9,26],c_rsam:16,c_telegram:[10,16,24,28],c_term:[9,26],c_test:16,c_tweet:[16,24,28],c_write:[16,24],calcul:[0,1,3,6,19,22,24],calibr:15,call:[6,10,15,17,20,22,24,28,29],can:[4,5,6,10,13,14,15,16,18,20,22,23,24,27,28],cancel:26,cancel_test:26,cannot:[6,22,24,29],canva:6,capabl:[0,24,27,28],caption:28,car:0,care:24,carri:17,cast:[0,29],caus:[6,11,18,22,24],centerpiec:0,central:[6,15,16],certain:[4,6,24],cha:[1,5,6,7,11,15],chan:[7,21,24,26],chang:[14,18,19,23,24,27,29],channel:[0,1,5,6,7,11,15,18,21,22,24,26],charact:[0,4,10,24],chart:[27,28],chat:[8,24],chat_id:[8,24],check:[4,14,16,18,24,27,29],child:28,chime:24,chn:22,choos:[5,18,23],chosen:[24,27],citizen:[15,22],classroom:27,clear:6,clearli:[13,29],click:[18,23,29],client:[2,16,22,23,27],clone:14,close:[6,12,23,28],closer:24,code:[0,6,14,18,22,28,29],codebas:0,codefil:[4,7,24],collect:0,color:[13,17],com:[13,14,16],combin:28,come:[10,22,23,24,29,30],comma:[24,28],command:[12,13,14,17,18,20,21,22,24,27],comment:[6,13],common:[22,29],commun:[0,13,24,28,29],comparison:24,compat:6,complex:0,comput:[0,17,18,23,29],conda:[18,20,21,23,27],config:[14,18,23,24,29],configur:[12,23,24,29],conform:28,confus:15,conn_stat:15,connect:[14,15,26,29],consecut:[21,22],consist:18,consol:[1,7,15,16],constant:21,constraint:24,construct:[15,28],consult:24,consum:[1,2,4,5,6,7,8,10,11,12,13,15,16,19,20,22,24,25,26],consumer_kei:10,consumer_secret:10,consumerthread:[22,28],contact:[0,24],contain:[0,6,13,15,20,22,24,25],content:27,continu:[0,16,24,25,27,28],contribut:[0,16],control:[13,23,24,28],convert:[4,15,20,22,24,27],cool:28,cooper:29,coordin:11,copi:[13,18,22,29],core:[1,6,11,15,22,26,27,28],correct:[4,22,24,29],correctli:[14,18,24,28],cost:0,could:[15,18,24,27,28,29],count:[15,22,24],counter:6,coupl:[17,24],cover:[18,23],cpu:22,creat:[13,14,15,16,17,18,22,23,24,27,28],creation:[8,13,14],crust:0,cryptographi:18,csv:[7,24],ctrl:[21,23,24,29],current:[9,15,18,22,26,28],custom:[4,13,16,27],custom_set:27,customiz:16,d_matplotlib:26,d_pydub:26,daemon:[0,12,16],dai:11,daili:11,data:[0,1,2,3,4,7,8,9,10,15,16,21,22,23,25,26,28,30],data_fil:25,datacast:[5,16,22,23,29],datadir_permiss:26,date:[11,17],datefmt:17,datetim:[15,17],dead:14,debain:14,debian:24,debug:[1,7,11,12,24,26,28],decim:22,decod:15,deconv:[1,6,7],deconv_acc_inst:15,deconv_rbm_inst:15,deconv_vel_inst:15,deconvolut:15,deconvolv:[6,15,24,26],def:28,default_set:15,defin:24,definit:18,deliv:5,deliveri:29,demand:0,demo:[16,23],demonstr:[16,27],denot:[21,28],depend:[0,10,15,17,18,26,28],depict:27,deprec:24,depth:16,deriv:22,describ:[13,28,29],descript:[14,24,26,28],design:[0,25,27,29],desktop:18,destin:[3,5,12,24,28],detail:[0,6,10,22,24],detect:[0,16,23,26,27],detector:24,determin:[1,17,25],develop:[0,10,13,16,18,22,24,28],devic:[0,22,29],diagnost:14,diagram:[9,25,27],dict:[12,15,17,26],dictionari:[12,15,17,26,28],differ:[17,23,24,27,28,29],difficult:[10,29],digit:24,dir:24,directli:[0,22,24,28],directori:[14,17,18,24,26,27,28],disabl:[6,24],disclaim:[0,4,24],discov:27,disk:[11,15,25,27,28],disp:[7,24],displac:24,displai:[0,1,6,11,15,17,24,29],distanc:29,distribut:[0,3,5,10,18,19,24,28],docstr:28,document:[14,27,28],doe:[0,14,15,24,25,27],doesn:[15,18,24],doing:[14,24,27],don:[26,27,29],done:[14,18,20,22,27,28],doorbel:24,doubl:[18,23],down:[10,11,22],download:[18,22,24,26],downward:24,dport:22,draw:6,drawn:6,drop:[24,29],duckduckgo:29,due:[0,29],dump:[15,23,27],dump_default:15,duplic:28,durat:[1,2,6,24,26],dure:[9,16,25,28],dynam:6,each:[3,6,19,22,24,28,29],earli:[0,6,8,10,24],earlier:28,earth:0,earthquak:[0,16,23,27],easi:[0,13,23,24,28],easier:[10,13,24],easiest:26,easili:[13,22],echo:18,edg:24,edit:[18,27],educ:0,eew:[0,24],effect:6,effici:[13,28],ehn:15,ehz:[15,22,24,28],either:[5,6,7,20,23,24,28,29],elaps:[6,11,21],els:[12,29],elsewher:[0,14,24],embed:15,empti:24,emsc:10,enabl:[0,6,7,14,24,26,28],encod:22,encourag:28,end:[4,18,24,25,28],endpoint:24,endtest:25,enhanc:13,enn:15,enough:[0,22],ensur:24,enter:[14,18,23,24,27],entir:[14,24],entri:24,environ:[18,20,21,23,27],enz:[15,24],eq_screenshot:[24,26],equal:24,errformat:17,error:[0,6,13,14,17,22,24,29],especi:[6,24],essenti:[27,28],etc:[13,18],ethernet:29,even:[13,24,27,29],event:[0,6,12,13,15,17,24],event_tim:[6,15],event_time_str:6,eventu:28,everi:[6,7,14,21,24,29],evt:6,exampl:[3,15,17,18,19,21,22,24,28,29],exceed:[1,24],except:[17,22,28],excess:24,exec:4,execreload:14,execstart:14,execstartpr:14,execstop:14,execut:[3,4,7,14,18,19,22,24,26,28],exist:[17,24,28,29],exit:[24,25,28],experi:[24,29],explain:24,explan:18,explicit:[0,24],explor:0,extens:0,extern:29,extra:[10,24],extra_text:[10,24],extract:22,extrem:[0,24],face:29,fact:0,fail:14,failur:28,fairli:29,fals:[0,1,2,4,6,7,8,9,10,11,12,15,17,19,21,22,24,25,26,28],far:[0,29],fast:[22,24],fdsn:[22,24,26],featur:[0,13,16,23,29],feed:27,feel:[13,16,28],fetch:[9,26],few:24,ffmpeg:[18,24,28],field:[15,18,24],fifo:28,figloop:6,fignam:15,figur:[0,6,15,24,27,28,29],file:[4,5,6,10,11,14,15,17,18,20,23,24,25,26,27,29],filenam:6,filesystem:24,fill:24,filter:[1,24],find:[5,13,16,22,24,27],fine:22,firewal:16,first:[6,10,14,18,23,24,25,28,29],fix:[18,29],flag:[1,19,27,28],flavor:24,flow:[9,16,23,25],fmt:17,focu:23,folder:[18,24],follow:[4,14,15,16,18,21,24,26,27,28,29],footstep:24,forc:[23,24],forg:18,fork:24,form:[22,28],formal:28,format:[0,1,4,7,13,15,17,20,24,25,27,28,29],formatexcept:17,formatt:[16,28],formattim:17,formerli:23,forum:[13,28,29],forward:[7,11,16,23,29],found:24,four:[9,24],fraction:15,frame:[12,21,22],free:[8,24,28,29],freez:14,freq:15,frequenc:[21,22,24],from:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],front:24,fsec:15,full:[6,15],fulli:[0,22,24],fullscreen:[6,24],fun:13,further:[0,24],futur:[18,24],fwaddr:[7,24],fwd_alarm:[5,24],fwd_data:[5,24],fwformat:[7,24],fwport:[7,24],gather:28,gempa:22,gener:[10,16,18,27,28,29],geophon:[0,6,15,24],get:[5,6,13,15,16,22,24,26,27,28,29],get_inventori:22,get_ip:22,get_msg_path:15,get_msg_tim:15,getchn:22,getdata:22,getmessag:17,getq:[6,11,28],getsr:22,getstream:22,gettim:22,gettr:22,getttlchn:22,git:[14,18,23],github:[13,14,16,18,29],give:[10,24,29],given:[15,28,29],glad:29,global:[12,22],globe:29,goe:[24,28,29],going:[0,29],gone:10,got:28,gpio:13,gracefulli:19,grade:[0,24],graphic:14,grasp:0,grav:7,great:29,green:14,grei:14,ground:[3,19],group:24,guarante:[0,24,29],gui:[0,6,24],guid:[16,24],guidanc:12,hack:22,had:24,handl:[6,12,23],handle_clos:6,handle_res:6,handler:[12,17,21,22],happen:[6,24,28,29],hard:29,harmless:18,has:[0,4,6,9,10,11,18,21,24,28,29],have:[0,4,6,13,14,15,18,22,24,27,28,29],hdf:[15,22,24],head:18,headless:0,hear:13,heart:6,help:[12,22,24,29],helper:[16,22],here:[0,1,4,13,17,24,26,28],hierarchi:[9,25,27,28],high:24,higher:24,highli:16,highpass:[1,24,26],hit:18,hobbi:[0,24],hold:24,home:[14,15,18,23,24,28],homebrew:24,host:[22,29],hostnam:26,hour:[0,10,21,29],how:[6,13,18,23,24,27,28],howev:[10,18,24,27,29],http:[13,14,16,28,29],hundredth:15,ian:16,iannesbitt:[14,15],idea:28,ifttt:13,ignor:[5,11,23,24,28],imag:[6,8,10,15,24,28],imgpath:[6,8,9,10,15,26,28],immedi:25,implement:28,impli:[0,24],implic:24,importerror:6,inabl:29,inact:14,includ:[0,10,14,22,23,24,27,28],incom:[1,23],increas:22,increment:6,indefinit:29,independ:28,index:[1,2,3,4,5,6,7,8,9,10,11,12,19,20,21,22,24,25,26],indic:[12,13,19,29],individu:[27,29],inet:26,inf:20,infinit:28,info:[17,29],infoformat:17,inform:[0,10,15,17,22,24,28,29],ingest:29,init:29,init_dir:17,initd:22,initi:[15,16,21,22,26,28],initrslib:22,input:[20,24],insert:24,inset:28,insid:[24,29],instal:[0,14,16,20,21,23,27,30],instanc:[15,28],instanti:28,instantli:28,instead:[10,27],institut:22,instruct:[4,16,18,24,26,27],instrument:[0,15,16,22,24],integ:[15,18,22],integr:[13,27,28],intend:[0,22,24],interact:13,interfac:17,intern:[24,29],internet:[26,27,29],interrupt:14,interv:[7,24],intervent:0,intuit:0,inv:[15,22],inventori:[9,15,22,24,26],involv:13,ioerror:[22,29],is_connect:26,isn:13,isp:29,issu:[0,13,16,24,27,28],item:[24,28],its:[0,9,10,14,15,22,24,26,27,28],itself:27,job:29,json:[5,7,15,18,23,24,27,28,29],jump:24,just:[9,11,24,28,29],keep:[0,22,24],kei:[10,18,24,29],keystrok:21,kid:13,kill:14,kiosk:[0,6,24],know:[16,18,28,29],known:[23,24,29],kwarg:[1,7,22],label:[17,29],laid:28,laptop:18,larg:27,last:[11,24,25,27,28],later:[5,10,18],latest:[18,25],layout:16,lead:24,lean:0,learn:[0,13],least:[15,22,24],leav:[0,18],length:24,let:[6,24,28,29],level:17,level_fmt:17,levelformatt:17,liabil:[0,24],libav:[24,28],librari:[6,15,16,23],licens:[0,24],life:[0,24],light:13,like:[3,9,13,14,17,18,19,22,23,24,27,28,29],likewis:1,limit:[0,10,24],line:[4,12,13,14,17,20,21,22,23,24,25,27,28,29],linecach:6,linestyl:13,linewidth:13,linger:14,link:24,linux:[14,16],list:[1,3,5,6,11,12,15,19,22,24,28],listen:[1,7,21,22,24,29],lite:[7,24],littl:6,live:[1,7,16],load:[12,24],loc:15,local:[0,16,21,22,24,27],localhost:[22,25],locat:[15,18,22,23,24,29],lock:24,log:[13,14,17,22,24,26,29],logdir:26,logdir_permiss:26,logic:28,loginctl:14,logrecord:17,longer:[6,24],look:[0,10,14,16,18,19,22,24,27,28,29],loop:[6,22,25,28],lose:24,loss:[21,29],lost:21,lot:[6,28],low:[0,22],lowpass:[1,24,26],lta:16,lxml:18,mac:[18,24],machin:[14,22,24],maco:16,made:[0,11,28],mai:[0,3,6,10,14,18,19,23,24,28,29],main:[3,6,12,16,20,21,24,28],mainloop:6,mainpid:14,maintain:[0,28],make:[0,4,6,10,12,13,18,22,24,27,28,29],make_test_set:[26,27,28],make_trac:22,manag:24,mani:[0,6,10,24,28,29],manual:[16,18,24,29],master:[6,12,16,19,28],match:[15,24],matplotlib:[6,13,18,26,28],matter:24,max:1,mean:[0,4,18,24,27,28],meant:[0,24,27],measur:[7,15,24],media:[0,10,13,28],memori:[0,22],merg:22,messag:[1,2,3,4,5,6,7,8,9,10,11,13,15,16,17,19,20,24,25,26],method:[18,23,24],metric:15,mexican:[8,24],microsecond:15,middl:[16,28],might:[14,24,29],millisecond:[21,22],miniconda3:18,miniconda:18,minimum:0,minise:[11,16,20,27],minut:18,misconfigur:14,miss:24,mk_p:[12,28],mk_q:[12,28],mkdir:14,mode:[6,12,16,24,27],model:24,modif:22,modifi:[18,22,23,26,28],modul:[0,4,5,6,8,10,13,16,18,20,22,25,26],monei:0,monitor:[0,13,14,16,19,28,29],month:0,more:[4,5,6,10,13,22,23,24,27,28,29],most:[0,6,13,22,24,29],motion:[0,3,16,19,24],motor:13,move:[0,24,28,29],mp3:24,mp3file:24,mpl:26,mseed:[20,27],msg:[15,17],msg_alarm:15,msg_imgpath:15,msg_reset:15,msg_term:15,much:[0,24,28,29],multi:10,multipl:[0,5,24,28],must:[0,6,10,15,18,20,22,24,27,28,29],mymod:28,mymodul:28,n_internet:26,n_inventori:[9,26],n_port:26,nail:10,name:[6,11,15,17,18,21,22,23,24,26,27,28],nano:14,nation:24,nativ:24,natur:0,navig:29,nearbi:24,nearli:0,necessari:[14,15,22],necessarili:24,need:[0,13,14,15,16,18,22,23,24,26,27,28,29],neg:[0,24],nesbitt:16,network:[5,14,22,24,25,26],never:24,newbot:24,newlin:[4,24],next:[14,18,23,24,25,28],nodata:22,node:[24,29],noder:24,nois:24,non:[0,24],none:[4,12,15,17],nonetyp:15,normal:[9,27,28],notabl:24,note:[0,27,29],notif:[0,8,10,16],notifi:[1,16,29],now:[14,18,22,24,28],nth:6,num:5,number:[6,8,15,21,22,24,28],numpi:18,object:[1,2,3,5,6,15,18,19,22,28],obspi:[1,3,6,11,15,18,19,20,22,24,27,28],occasion:[0,24],occur:[24,28],odir:17,off:[12,13,22,28],off_ev:13,offic:30,offici:[0,24],often:[24,29],old:[18,22],on_ev:13,onc:[6,10,24,27,28],one:[0,4,5,13,15,22,23,24,27,28,29],ones:13,onli:[0,8,9,10,12,15,22,23,24,28],onlin:29,open:[0,13,18,22,23,24,25,28],opensock:22,oper:[9,11,17,18,23,27],operand:17,option:[5,7,10,16,22,24,28],order:[0,5,6,14,15,16,18,22,24,28],ordinari:27,ordinarili:27,org:[13,28,29],organ:[16,28],orig:22,oserror:22,other:[0,1,3,5,6,8,11,13,14,16,18,19,23,24,28],otherwis:[11,21,26],our:[13,16,18,23,28,29,30],out:[6,16,17,22,24,27,28,29],outcom:0,outf:20,outlin:28,output:[0,7,12,13,14,15,17,20,24,26,29],output_dir:[11,15,24],outsid:29,over:[1,11,18,22,27,29],overload:29,overrid:18,overview:[16,24],overwrit:23,overwritten:18,own:[0,13,16,22,24,26],p_data_dir:26,p_log_dir:26,p_log_fil:26,p_log_std:26,p_output_dir:26,p_produc:[1,3,15,16,22,24,28],p_screenshot_dir:26,packag:[20,24],packet:[5,6,7,9,11,15,16,22,24,25,27,29],packetloss:[16,29],pad:15,page:[1,2,3,4,5,6,7,8,9,10,11,12,13,16,19,20,21,22,24,25,26,27,29],panama:30,panamaigc:8,param:28,paramet:[1,2,3,4,5,6,7,8,9,10,11,12,15,16,17,19,20,21,22,24,25,26,28],parent:28,pars:[16,22,28],parser:28,part:[0,10,24,28],partial:15,partwai:18,pass:[2,3,4,5,6,9,12,13,15,16,19,20,21,22,24,25,26],past:[13,14,29],path:[15,18,23,24,26],patienc:29,paus:18,per:[6,11,15,22,23,24],perform:[0,24],perhap:[0,27],period:[0,21,24,29],perman:14,permiss:[10,26,27,29],person:16,piec:[0,24,27],pin:13,ping:24,pip:18,place:[22,24,28],plai:[13,16,18,26,27,28],plan:28,platform:[0,10,28],playback:24,pleas:[0,4,13,18,24,27,29],plenti:22,plot:[0,3,13,15,16,19,23,26,28],plt:13,plu:29,png:[15,24,28],point:[22,24,28],popul:[3,6,19,24],port:[5,7,15,19,21,22,23,24,25,26,27,28,29],portion:24,posit:[0,9,24,25],post:[8,10,24,28,29],potenti:13,power:[0,6,9,22,24],pre:16,precis:[15,22],prefer:[16,23],prepar:25,preparatori:17,press:[23,24,29],pressur:[0,15,16,24],pretti:28,previou:[18,24],print:[7,15,16,17,21,22],printdata:16,printfreq:21,printm:[17,22,28],printraw:24,printttl:21,printw:17,prior:[4,22,24,26],privat:29,privileg:18,probabl:[18,28],problem:[13,18,24,27,29],proc:12,proce:[18,24],process:[0,3,6,9,10,12,16,21,23,24,26,27,28],processor:[6,18,24],produc:[1,3,12,13,15,16,20,22,24,27],profession:[0,24],profil:[18,24],program:[0,11,13,14,16,18,21,22,23,24,25,26,27],programmat:28,project:[0,16],prompt:[18,23],properli:6,properti:[0,24],protect:0,protocol:29,provid:[0,13,14,24,29],pull:[18,28],purpos:[11,24,28],put:[6,15,19,24],pydub:[2,26],pyplot:[13,28],python3:20,python:[0,4,15,16,18,20,24,28],qt5:6,quak:24,quarter:6,question:[4,11,13,24,28],queue:[1,2,3,4,5,6,7,8,9,10,11,12,13,15,19,24,25,28],quickli:[0,8,10],quiet:[7,26],quit:[2,4,6,7,16,19,25,28],r24fa:[15,26,28],r3bcf:22,r940d:22,rais:[1,6,22],ram:0,raspberri:[0,10,14,15,16,18,20,22,24,25,26,27,29,30],raspberryshak:[13,15,16,28,29],raspbian:[14,18,24],raspishak:[13,14,16],rate:[6,10,15,21,22,25,27],ratio:[1,24],raw:[5,15,24],rcb43:22,reach:25,read:[1,2,3,4,5,7,8,10,11,15,16,18,20,22,24,25,27,28],read_set:15,reader:25,readi:[15,18,23,24],readili:24,real:[0,7,14,16],realli:24,reason:[14,18,23,29],reboot:14,rebuild:23,receiv:[19,22,24,26,27,28],recept:9,record:[0,6,15,17,27],recur:29,recurs:[1,24],recursive_sta_lta:[1,24],red:[14,28],redraw:6,referenti:22,reflect:[15,29],refresh:[6,24],regard:[0,14],regist:24,reject:24,rel:10,relat:6,releas:[18,24],relev:[24,26,28,29],reli:[0,24,28],reliabl:[10,22],reload:14,remain:0,remind:28,remot:[16,27],remov:24,render:24,replac:18,report:[12,15,21,22,28,29],repositori:[0,18,23,24],repres:9,request:[22,28],requir:[0,4,22,24,27,28],reset:[1,5,9,13,15,22,24,26,28],reset_tim:15,resid:29,resiz:6,resolv:[22,24],resourc:[13,16],respect:[24,28],respons:[24,29],rest:[27,28],restart:[0,16,24,29],restartsec:14,restructuredtext:28,result:[12,24,26],rewritten:18,richard:16,right:[15,22,28,29],rigor:10,room:0,round:15,router:29,routin:[0,6,11,12,13,27],row:[28,29],rs4d:[15,24],rsam:[16,26],rsstn:22,rsudp:[13,24,28,30],rsudp_set:[18,23,24,29],rtype:28,rule:10,run:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,19,20,21,22,25,26,27,28,30],runtim:28,s0cde:22,safer:29,sai:[14,24,29],said:24,same:[22,24,25,27,29],sampl:[6,11,15,22,27],sasmex:[8,24],save:[0,6,15,17,24,28],save_pct:6,savefig:[6,28],scenario:24,scienc:[0,15,22],scipi:18,screen:24,screencap:6,screenshot:[6,13,15,24,26,28],script:[13,14,18,22,23,24,27,29],scroll:29,search:[1,2,3,4,5,6,7,8,9,10,11,12,16,19,20,21,22,24,25,26,29],sec:15,second:[1,2,6,7,11,14,15,18,21,22,24,27,28,29],secret:[10,24],section:[0,5,18,24,28,29],secur:29,sediment:24,see:[0,1,2,4,5,6,7,8,9,10,12,13,14,16,17,19,20,22,23,24,25,27,28,29],seek:25,seem:0,segment:11,seiscomp3:22,seismic:[0,7,16,20,22,27],seismogram:[6,24],seismograph:[0,16],seismolog:0,self:[2,4,6,7,9,11,15,22,25,28],send:[1,6,7,8,10,13,15,17,22,23,24,25,27,28,29],send_imag:[8,24],sender:[8,17,22,28],sent:[1,2,3,4,5,6,7,8,9,10,11,22,24,25,28,29],separ:[6,24],sequenc:[24,28],serial:15,server:24,servic:[6,8,10,14,24,26,29],set:[0,1,4,5,6,7,10,11,12,13,14,15,16,18,21,22,23,25,26,29,30],set_channel:15,set_param:22,set_sp:[6,11],settings_loc:15,setup:[12,16,22,29],setup_plot:6,sever:[18,23,24,29],shake:[0,6,10,14,15,16,20,22,23,24,25,26,27,30],shorten:24,should:[0,1,12,14,18,19,22,24,28,29],show:[0,12,14,27,28],shown:28,shutdown:6,shz:[15,24],side:16,sig:12,sign:24,signal:[1,6,12,21,22,24,28],signal_handl:21,signum:[21,22],similar:[0,13,18,28],simpl:[0,10,11,15,24,25],simpli:[18,24],simultan:[0,24],sinc:[13,21,22,24,28,29],singl:[5,22,24],site:29,size:24,skip:18,sleep:14,slice:11,slicestream:11,slightli:[27,29],slow:29,slower:[6,24],small:[24,27,29],social:[0,10,13,28],socket:[22,25],softwar:[0,13,18,23,24,27,28],solut:22,solv:29,some:[6,13,14,15,18,22,23,24,26,28,29],somehow:14,someon:27,someth:[13,14,16,22,24,28,29],sometim:10,somewher:[24,29],sonar:24,soon:30,sort:28,sound:[0,1,13,16,18,23,26,27,28],soundloc:2,sourc:[0,23,24,28,29],space:[17,24],span:10,special:16,specif:[1,6,12,15,18,21,22,27,29],specifi:[5,7,15,17,22,24,25,26,27,28,29],spectrogram:[6,24],speed:[24,25],spent:0,sphinx:28,spin:28,sps:[15,22],sqlalchemi:18,ss_permiss:26,sta:[2,16],stabl:0,stackoverflow:[4,17,22,24],stamp:17,stand:28,standard:[0,4,24,28],start:[5,9,11,12,14,16,21,22,24,25,26,27,28],start_log:17,startup:6,stat:15,state:[0,12,13,22,23,24,26],station:[15,22,24,26],statist:21,statu:[14,19,28],stdout:[24,26],steim2:24,step:[17,18,24,28],still:[24,29],stn:22,stomp:24,stop:[12,19,23],store:[22,29],str:[1,4,5,6,7,8,10,11,15,17,20,22,25,26,28],straightforward:29,strang:15,stream:[1,3,6,9,11,15,16,19,21,22,23,24,28,30],street:0,strftime:[15,17],strict:29,stricter:10,string:[4,6,15,17,22,24,25,28],structur:[14,26],student:27,stuff:[6,28],style:[4,24],sub:[3,12,15,16,22,28],submit:[28,29],subsequ:24,substitut:[0,24],succe:24,success:26,successfulli:24,sudden:[0,16,24],sudo:[14,24],suffer:0,suffic:0,suffici:24,suggest:[13,16],suit:[8,24],summari:27,suppli:[12,24],support:[15,28,29],suppress:7,sure:[4,13,24,27,29],suspici:10,switcher:24,sys:28,system:[0,8,14,18,22,23,24],systemctl:[0,16],systemd:14,t_testdata:[16,27],tab:24,tag:13,tail:14,take:[6,12,18,24],taken:12,talk:29,target:[14,29],task:[0,3,19],task_don:28,team:[15,29],technic:29,telegram:[0,10,13,16],telegramm:[8,24,28],tell:[18,24,27,28,29],term:[1,2,4,6,7,9,15,19,24,25,26,28],termin:[18,23],test:[0,6,12,14,15,16,17,18,20,24],test_mod:12,testb:22,testdata:[9,25,27],testdir:26,text:[10,12,14,15,17,20,24,27,29],than:[5,6,10,14,18,23,24,27,29],thank:[28,29],thei:[13,17,19,22,23,26,27,28,29],them:[12,17,24,25,28,29],theoret:24,theori:[0,28],therefor:16,thi:[0,1,3,4,5,6,8,9,10,11,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29],thing1:28,thing:[0,3,6,8,13,17,19,24,28,29],think:10,thoroughli:24,those:[3,5,20,22],thread:[5,9,12,16,19,22,24,25,27],threadsaf:6,three:[24,28,29],thresh:1,threshold:[1,24,26],through:[0,6,10,18,23,27,28,29],thu:18,tick:11,time:[0,1,6,7,11,13,14,15,16,17,21,22,23,26,27,29],timeout:22,timestamp:[15,22,25],tkagg:6,tmp:[13,14,24,26,29],token:[8,10,24],too:[24,29],tool:0,top:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],total:22,trace:[0,15,22],track:16,tradit:28,transduc:[0,15,16,24],transmiss:[15,21,22,25],tri:0,trigger:[0,1,3,6,13,16,19,27,28],tripl:[13,29],troubl:[18,27],troubleshoot:[16,27],truncat:24,turn:[12,20,28,29],tutori:[14,16,18,23],tweet:[10,16],tweet_imag:[10,24],tweeter:[10,24,28],twitter:[0,13,16],two:[15,24,28],txt:[20,27],type:[6,9,11,12,15,16,17,18,21,22,23,24,26,27],typic:[24,27,29],ubuntu:14,udp:[0,5,7,16,20,22,23,24,25,27,29],unam:18,uncheck:24,unconsolid:24,under:29,understand:[24,28],unfamiliar:28,uniqu:0,unit:[14,15,24,26],univers:28,unix:[4,13,14,16,18,22,24],unless:24,unlimit:22,unmaintain:0,unmodifi:24,unpredict:0,unstabl:29,until:[9,15,22,25,28,29],unzip:18,updat:[6,11,22,24],update_plot:6,update_stream:22,upload:6,upon:[16,28],usag:[20,22,27],use:[0,6,10,15,18,22,23,27,28],used:[0,3,6,8,10,13,15,17,19,22,24,27,28],useful:[0,17,27,28],user:[0,4,14,15,16,22,23,24,28,29],usernam:24,uses:[0,1,15,17,28,29],usestim:17,usg:10,using:[4,10,13,14,17,18,20,21,22,24,26,27,29],usual:[0,27,29],utc:11,utcdatetim:[1,6,15,22],utcdatetime1:13,utcdatetime2:13,utcdatetime3:13,utcdatetime4:13,util:[17,20,24],valid:[15,24],valu:[12,18,21,22,24,26,28,29],vari:10,variabl:[11,12,15,18,22,26],variou:[3,6,16,18,19,27],vel:[7,24],veloc:[15,24],verbos:15,veri:[22,24],version:[4,5,7,8,9,10,12,15,18,24,25,26,28],vertic:[6,15,24],via:[0,8,28,29],vibrat:0,video:[16,18,23],virtual:18,visual:16,voltag:24,wai:[0,6,13,16,24,26,27,28,29],wait:[22,24],walkthrough:16,want:[4,13,14,15,24],wantedbi:14,warm:24,warn:[0,4,8,17,24],warnformat:17,warranti:[0,24],wast:26,watch:[27,28],web:24,websit:24,week:0,weird:6,welcom:[13,16],well:[13,14,24,29],were:[24,27],what:[4,14,16,24,27,28,29],whatev:[24,28],when:[0,1,2,6,10,11,13,16,18,21,22,24,25,28,30],whenev:24,where:[6,18,20,23,24,28,29],wherea:14,whether:[0,1,5,6,7,8,10,11,12,14,17,18,19,24,26,27],which:[0,8,14,15,17,19,20,21,22,24,27,28,29],white:15,why:[16,29],wifi:29,williamstown:24,win:[18,23],win_overrid:[4,24],win_ovr:4,window:[4,6,7,13,16],wish:[18,24,26,28],within:[14,20],without:[0,6,13,24,27,29],work:[13,14,15,18,22,24,28,29],worker:28,would:[15,18,24,26,27,28,29],write:[16,17,20,26],writer:16,written:[16,24],wrong:29,x86:18,x86_64:18,xyz:28,yellow:15,yet:0,yield:[17,24],you:[0,4,10,13,14,15,16,18,22,23,24,26,27,28,29],your:[4,10,13,14,16,21,22,23,24,26,29],your_modul:[26,28],your_shake_bot_id:24,your_test:26,yourself:[18,29],youtub:16,z0000:[22,24,26],zero:[15,22,29]},titles:["<span class=\"section-number\">1. </span>About rsudp","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_alert</span></code> (STA/LTA alarm)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_alertsound</span></code> (play sound)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_consumer</span></code> (master consumer)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_custom</span></code> (run code)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_forward</span></code> (forward data)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_plot</span></code> (plot data)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_rsam</span></code> (RSAM analysis)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_telegram</span></code> (Telegram alerts)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_testing</span></code> (test consumer)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_tweet</span></code> (Twitter alerts)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_write</span></code> (write data)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.client</span></code> (central module)","<span class=\"section-number\">2. </span>Contributing to this project","<span class=\"section-number\">5. </span>rsudp as a <code class=\"docutils literal notranslate\"><span class=\"pre\">systemctl</span></code> daemon","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.helpers</span></code> (helper functions)","<cite>rsudp</cite> 1.0.2","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.__init__</span></code> (initialization functions)","<span class=\"section-number\">2. </span>Installing rsudp","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.p_producer</span></code> (data producer)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.packetize</span></code> (data formatter)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.packetloss</span></code> (track packets)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.raspberryshake</span></code> (main library)","<span class=\"section-number\">4. </span>Running rsudp","<span class=\"section-number\">3. </span>Modules and Settings","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.t_testdata</span></code> (test pre-producer)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.test</span></code> (test helpers)","<span class=\"section-number\">7. </span>Testing and demoing rsudp","<span class=\"section-number\">1. </span>Program architecture and flow","<span class=\"section-number\">6. </span>Troubleshooting rsudp","YouTube walkthroughs"],titleterms:{"default":24,"function":[15,16,17,27],Adding:28,The:18,Using:[24,27],__init__:17,about:0,add:18,advanc:18,alarm:1,alarmsound:24,alert:[8,10,24],amplitud:24,analysi:7,app:24,architectur:28,bashrc:18,bot:24,broad:0,bug:13,c_alert:1,c_alertsound:2,c_consum:3,c_custom:4,c_forward:5,c_plot:6,c_rsam:7,c_telegram:8,c_test:9,c_tweet:10,c_write:11,can:[0,29],central:12,classroom:24,client:[12,28],code:[4,13,16,24],command:29,conda:29,consol:24,consum:[3,9,28],contribut:13,custom:24,daemon:14,data:[5,6,11,19,20,24,27,29],datacast:24,demo:[27,30],demonstr:[23,24],depend:24,detect:[24,30],document:16,dure:27,earthquak:[24,30],easi:18,exec:24,featur:28,file:28,firewal:29,flow:[27,28,29],formatt:20,forward:[5,24],gener:24,helper:[15,26],home:29,inconsist:29,index:16,initi:17,instal:[18,24],instruct:14,issu:29,layout:28,librari:22,line:18,linux:[18,24],live:[24,30],local:29,lta:[1,24],maco:[18,24],main:22,manual:23,master:3,messag:28,middl:29,minise:24,mode:23,modul:[12,24,27,28],network:29,notif:24,other:29,overview:0,own:[27,28],p_produc:19,packet:[20,21],packetloss:21,pass:28,plai:[2,24],plot:[6,24],pre:25,print:24,printdata:24,produc:[19,25,28],program:28,project:13,pydub:24,quiet:24,quit:23,raspberryshak:22,real:24,receiv:29,recommend:24,remot:29,restart:14,rsam:[7,24],rsudp:[0,1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20,21,22,23,25,26,27,29],run:[4,18,23,24,29],sampl:28,school:29,seismic:24,set:[24,27,28],setup:14,shake:29,side:29,sound:[2,24],sourc:18,special:0,sta:[1,24],start:23,stop:29,suggest:28,systemctl:14,t_testdata:25,telegram:[8,24],test:[9,23,25,26,27,28],thi:13,thread:28,time:24,track:21,trigger:24,troubleshoot:[14,29],tweet:24,twitter:[10,24],type:28,univers:29,unix:23,updat:18,upon:24,use:24,user:18,vault:24,wai:18,walkthrough:30,what:0,why:0,window:[18,23,24],write:[11,24],writer:24,your:[18,27,28],youtub:30}})
\ No newline at end of file
+Search.setIndex({docnames:["about","c_alert","c_alertsound","c_consumer","c_custom","c_forward","c_plot","c_rsam","c_telegram","c_testing","c_tweet","c_write","client","contributing","daemon","helpers","index","init","installing","p_producer","packetize","packetloss","raspberryshake","running","settings","t_testdata","test","testing","theory","troubleshooting","youtube"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":2,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.todo":2,sphinx:56},filenames:["about.rst","c_alert.rst","c_alertsound.rst","c_consumer.rst","c_custom.rst","c_forward.rst","c_plot.rst","c_rsam.rst","c_telegram.rst","c_testing.rst","c_tweet.rst","c_write.rst","client.rst","contributing.rst","daemon.rst","helpers.rst","index.rst","init.rst","installing.rst","p_producer.rst","packetize.rst","packetloss.rst","raspberryshake.rst","running.rst","settings.rst","t_testdata.rst","test.rst","testing.rst","theory.rst","troubleshooting.rst","youtube.rst"],objects:{"rsudp.__init__":{LevelFormatter:[17,1,1,""],add_debug_handler:[17,3,1,""],init_dirs:[17,3,1,""],printE:[17,3,1,""],printM:[17,3,1,""],printW:[17,3,1,""],start_logging:[17,3,1,""]},"rsudp.__init__.LevelFormatter":{format:[17,2,1,""]},"rsudp.c_alert":{Alert:[1,1,1,""]},"rsudp.c_alert.Alert":{run:[1,2,1,""]},"rsudp.c_alertsound":{AlertSound:[2,1,1,""]},"rsudp.c_alertsound.AlertSound":{run:[2,2,1,""]},"rsudp.c_consumer":{Consumer:[3,1,1,""]},"rsudp.c_consumer.Consumer":{run:[3,2,1,""]},"rsudp.c_custom":{Custom:[4,1,1,""]},"rsudp.c_custom.Custom":{run:[4,2,1,""]},"rsudp.c_forward":{Forward:[5,1,1,""]},"rsudp.c_forward.Forward":{run:[5,2,1,""]},"rsudp.c_plot":{Plot:[6,1,1,""]},"rsudp.c_plot.Plot":{deconvolve:[6,2,1,""],figloop:[6,2,1,""],getq:[6,2,1,""],handle_close:[6,2,1,""],handle_resize:[6,2,1,""],mainloop:[6,2,1,""],qu:[6,2,1,""],run:[6,2,1,""],savefig:[6,2,1,""],set_sps:[6,2,1,""],setup_plot:[6,2,1,""],update_plot:[6,2,1,""]},"rsudp.c_rsam":{RSAM:[7,1,1,""]},"rsudp.c_rsam.RSAM":{run:[7,2,1,""]},"rsudp.c_telegram":{Telegrammer:[8,1,1,""]},"rsudp.c_telegram.Telegrammer":{run:[8,2,1,""]},"rsudp.c_testing":{Testing:[9,1,1,""]},"rsudp.c_testing.Testing":{run:[9,2,1,""]},"rsudp.c_tweet":{Tweeter:[10,1,1,""]},"rsudp.c_tweet.Tweeter":{run:[10,2,1,""]},"rsudp.c_write":{Write:[11,1,1,""]},"rsudp.c_write.Write":{elapse:[11,2,1,""],getq:[11,2,1,""],run:[11,2,1,""],set_sps:[11,2,1,""],slicestream:[11,2,1,""],write:[11,2,1,""]},"rsudp.client":{handler:[12,3,1,""],main:[12,3,1,""],mk_p:[12,3,1,""],mk_q:[12,3,1,""],run:[12,3,1,""],start:[12,3,1,""],test:[12,3,1,""],test_mode:[12,3,1,""]},"rsudp.helpers":{conn_stats:[15,3,1,""],deconv_acc_inst:[15,3,1,""],deconv_rbm_inst:[15,3,1,""],deconv_vel_inst:[15,3,1,""],deconvolve:[15,3,1,""],default_settings:[15,3,1,""],dump_default:[15,3,1,""],fsec:[15,3,1,""],get_msg_path:[15,3,1,""],get_msg_time:[15,3,1,""],msg_alarm:[15,3,1,""],msg_imgpath:[15,3,1,""],msg_reset:[15,3,1,""],msg_term:[15,3,1,""],read_settings:[15,3,1,""],set_channels:[15,3,1,""]},"rsudp.p_producer":{Producer:[19,1,1,""]},"rsudp.p_producer.Producer":{run:[19,2,1,""]},"rsudp.packetize":{main:[20,3,1,""],packetize:[20,3,1,""]},"rsudp.packetloss":{main:[21,3,1,""],printTTLS:[21,3,1,""],run:[21,3,1,""],signal_handler:[21,3,1,""]},"rsudp.raspberryshake":{ConsumerThread:[22,1,1,""],copy:[22,3,1,""],getCHN:[22,3,1,""],getCHNS:[22,3,1,""],getDATA:[22,3,1,""],getSR:[22,3,1,""],getSTREAM:[22,3,1,""],getTIME:[22,3,1,""],getTR:[22,3,1,""],getTTLCHN:[22,3,1,""],get_inventory:[22,3,1,""],get_ip:[22,3,1,""],handler:[22,3,1,""],initRSlib:[22,3,1,""],make_trace:[22,3,1,""],openSOCK:[22,3,1,""],set_params:[22,3,1,""],update_stream:[22,3,1,""]},"rsudp.t_testdata":{TestData:[25,1,1,""]},"rsudp.t_testdata.TestData":{run:[25,2,1,""],send:[25,2,1,""]},"rsudp.test":{cancel_tests:[26,3,1,""],datadir_permissions:[26,3,1,""],is_connected:[26,3,1,""],logdir_permissions:[26,3,1,""],make_test_settings:[26,3,1,""],permissions:[26,3,1,""],ss_permissions:[26,3,1,""]},rsudp:{__init__:[17,0,0,"-"],c_alert:[1,0,0,"-"],c_alertsound:[2,0,0,"-"],c_consumer:[3,0,0,"-"],c_custom:[4,0,0,"-"],c_forward:[5,0,0,"-"],c_plot:[6,0,0,"-"],c_rsam:[7,0,0,"-"],c_telegram:[8,0,0,"-"],c_testing:[9,0,0,"-"],c_tweet:[10,0,0,"-"],c_write:[11,0,0,"-"],client:[12,0,0,"-"],helpers:[15,0,0,"-"],p_producer:[19,0,0,"-"],packetize:[20,0,0,"-"],packetloss:[21,0,0,"-"],raspberryshake:[22,0,0,"-"],t_testdata:[25,0,0,"-"],test:[26,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","class","Python class"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:class","2":"py:method","3":"py:function"},terms:{"00z":22,"01t00":15,"10s":14,"15s":17,"16b":[0,24],"1dv7":22,"211704z":28,"21t19":22,"21t20":22,"23t06":28,"246777z":22,"292000z":22,"435214z":28,"532000z":22,"598944z":28,"599z":15,"boolean":[5,24,28],"break":25,"byte":[15,22,28],"case":[18,24,28,29],"class":[1,2,3,4,5,6,7,8,9,10,11,13,15,17,19,22,24,25,28],"default":[1,6,7,12,14,15,16,18,22,23,26,27,28],"final":[14,28,29],"float":[1,7,22,24],"function":[1,4,6,9,11,12,13,20,22,23,24,26,28],"import":[0,6,15,20,22,24,26,28],"int":[6,21,22,25],"long":[1,24],"new":[4,5,6,7,8,9,10,11,12,13,14,15,18,22,24,25,26,27,28,29],"public":[10,29],"return":[6,11,12,15,17,21,22,26,28],"short":[1,2,24],"super":28,"throw":24,"true":[1,4,6,7,11,12,15,17,21,22,24,26,28],"try":26,"while":[0,24,28,29],Adding:[13,16,22],And:28,EHE:15,ENE:15,For:[9,12,15,18,22,24,25,27,28,29],One:29,Pis:24,That:[24,27],The:[0,1,3,5,6,10,11,12,13,15,16,17,19,20,21,22,23,24,26,27,28,29],Then:[25,26,28,29],There:[24,28,29],These:[9,15,17,24],Using:[16,28],Will:22,__init__:[16,28],abc:28,abil:[0,27],abl:[0,24,28,29],abort:29,about:[4,13,14,15,16,23,24,27,28,29],abov:[4,23,24,28,29],acc:[7,24],acceler:[15,24],acceleromet:[0,15,24],access:[10,24],access_secret:[10,24],access_token:[10,24],access_token_secret:10,accommod:24,accompani:0,accordingli:24,account:[10,24],accumul:22,accur:15,achiev:[0,24],across:[0,6,24,29],action:[0,12,27,28],activ:[0,10,14,17,18,20,21,23,24,29],actual:[13,24],adapt:[17,22],add:[0,10,17,24,26,28],add_debug_handl:17,added:[13,22,28],adding:27,addit:[0,10,13,17,28],addition:[0,24],addr:5,address:[5,7,15,22,24,25,29],adjust:[24,30],administr:18,advantag:24,adventur:13,after:[0,6,14,22,23,24,28,29],again:24,agenc:[10,24],agg:13,aggress:24,aim:0,alarm:[2,4,5,6,7,8,9,10,13,15,16,22,23,24,26,27,28],alarm_reset:[1,22],alarmsound:16,alert:[0,1,2,3,6,13,15,16,19,26,27,28],alertsound:[2,24,26,28],algorithm:[6,24],aliv:[9,19,22,25,28],all:[6,11,14,15,19,22,23,24,26,28,29],allow:[6,13,15,16,28,29],almost:29,along:28,alpha:13,alreadi:[13,14,17,24,28],also:[15,19,24,25,27,28,29],alt:24,although:[0,24,29],alwai:[13,14,24],amd:18,among:8,amount:24,amplitud:[7,16],anaconda3:18,anaconda:[18,23],analysi:[16,24],ani:[0,6,15,18,23,24,27,28,29],announc:17,anoth:[5,20,24,28,29],answer:[4,17,22,24],anyth:[12,27],anywai:24,api:[8,10,24,28],api_kei:24,api_secret:24,aplot:6,app:[10,13],appear:[24,29],append:[11,12,17,18,24],appli:[7,10,24],applic:0,appropri:[12,18,24],approxim:24,apt:24,arbitrari:27,architectur:[16,18,27],archiv:27,arg:[1,7],argument:[20,21,22],armv7:18,armv7l:18,around:29,arriv:[2,6,24,25],artifici:27,ascii:20,asctim:17,ask:[18,29],aspect:0,assign:22,associ:17,assum:[0,24,28,29],atop:24,attach:[13,29],attribut:[17,22],audibl:0,audioseg:2,authent:24,automat:[8,18,22],avail:[0,15,16,18,22,23,24,26,27,30],averag:[1,2,24,29],avoid:[6,24],awai:0,axvlin:13,back:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],backend:[6,13,26],backtick:[13,29],bak:18,bandpass:[1,24],bar:29,base:[18,24,27,28],bash:[14,18,23],basic:[24,27],bat:[18,23],batch:[13,23],beauti:0,becaus:[15,22,24],becom:27,bedrock:24,been:[0,18,24,29],beep:24,befor:[17,22,24,28],beforehand:24,begin:[6,23,25],behalf:10,behavior:6,being:[22,24,29],below:[0,16,18,24,27,28,29],beneath:[6,24],berryconda3:18,better:24,between:[21,22,24,28,29],beyond:13,bin:14,binari:24,bind:22,bit:27,block:6,blue:29,boaz:16,bonu:24,bool:[1,2,4,5,6,7,8,10,11,12,15,17,21,22,26,28],boom:[15,16,22,24,27,30],boot:14,bot:[8,10],botfath:24,both:[0,5,6,13,14,15,18,22,24,28],box:22,brace:28,brew:24,brief:[0,24],briefli:28,bring:[0,24],broad:16,broadcast:[6,8,24,28],bug:[16,22,29],build:[22,24,28],built:[5,10],button:29,buzzer:13,c_alarm:[9,26],c_alert:[13,15,16,24],c_alertsound:[16,24,28],c_anotheron:28,c_consum:[1,2,4,5,6,7,8,9,10,11,12,16,19,25,28],c_custom:[13,16,24],c_data:[9,26],c_forward:[16,24],c_img:26,c_imgpath:[9,26],c_minise:26,c_mymodul:28,c_mytest:28,c_plot:[15,16,24,28],c_printraw:24,c_process:[9,26],c_reset:[9,26],c_rsam:16,c_telegram:[10,16,24,26,28],c_term:[9,26],c_test:16,c_tweet:[16,24,26,28],c_write:[16,24],calcul:[0,1,3,6,19,22,24],calibr:15,call:[6,10,15,17,20,22,24,28,29],can:[4,5,6,10,13,14,15,16,18,20,22,23,24,27,28],cancel:26,cancel_test:26,cannot:[6,22,24,29],canva:6,capabl:[0,24,27,28],caption:28,car:0,care:24,carri:17,cast:[0,29],caus:[6,11,18,22,24],centerpiec:0,central:[6,15,16],certain:[4,6,24],cha:[1,5,6,7,11,15],chan:[7,21,24,26],chang:[14,18,19,23,24,27,29],channel:[0,1,5,6,7,11,15,18,21,22,24,26],charact:[0,4,10,24],chart:[27,28],chat:[8,24],chat_id:[8,24],check:[4,14,16,18,24,27,29],child:28,chime:24,chn:22,choos:[5,18,23],chosen:[24,27],citizen:[15,22],classroom:27,clear:6,clearli:[13,29],click:[18,23,29],client:[2,16,22,23,27],clone:14,close:[6,12,23,28],closer:24,code:[0,6,14,18,22,28,29],codebas:0,codefil:[4,7,24],collect:0,color:[13,17],com:[13,14,16],combin:28,come:[10,22,23,24,29,30],comma:[24,28],command:[12,13,14,17,18,20,21,22,24,27],comment:[6,13],common:[22,29],commun:[0,13,24,28,29],comparison:24,compat:6,complex:0,comput:[0,17,18,23,29],conda:[18,20,21,23,27],config:[14,18,23,24,29],configur:[12,23,24,29],conform:28,confus:15,conn_stat:15,connect:[14,15,26,29],consecut:[21,22],consist:18,consol:[1,7,15,16],constant:21,constraint:24,construct:[15,28],consult:24,consum:[1,2,4,5,6,7,8,10,11,12,13,15,16,19,20,22,24,25,26],consumer_kei:10,consumer_secret:10,consumerthread:[22,28],contact:[0,24],contain:[0,6,13,15,20,22,24,25],content:27,continu:[0,16,24,25,27,28],contribut:[0,16],control:[13,23,24,28],convert:[4,15,20,22,24,27],cool:28,cooper:29,coordin:11,copi:[13,18,22,29],core:[1,6,11,15,22,26,27,28],correct:[4,22,24,29],correctli:[14,18,24,28],cost:0,could:[15,18,24,27,28,29],count:[15,22,24],counter:6,coupl:[17,24],cover:[18,23],cpu:22,creat:[13,14,15,16,17,18,22,23,24,27,28],creation:[8,13,14],crust:0,cryptographi:18,csv:[7,24],ctrl:[21,23,24,29],current:[9,15,18,22,26,28],custom:[4,13,16,27],custom_set:27,customiz:16,d_matplotlib:26,d_pydub:26,daemon:[0,12,16],dai:11,daili:11,data:[0,1,2,3,4,7,8,9,10,15,16,21,22,23,25,26,28,30],data_dir:11,data_fil:25,datacast:[5,16,22,23,29],datadir_permiss:26,date:[11,17],datefmt:17,datetim:[15,17],dead:14,debain:14,debian:24,debug:[1,7,11,12,24,26,28],decim:22,decod:15,deconv:[1,6,7],deconv_acc_inst:15,deconv_rbm_inst:15,deconv_vel_inst:15,deconvolut:15,deconvolv:[6,15,24,26],def:28,default_set:15,defin:24,definit:18,deliv:5,deliveri:29,demand:0,demo:[16,23],demonstr:[16,27],denot:[21,28],depend:[0,10,15,17,18,26,28],depict:27,deprec:24,depth:16,deriv:22,describ:[13,28,29],descript:[14,24,26,28],design:[0,25,27,29],desktop:18,destin:[3,5,12,24,28],detail:[0,6,10,22,24],detect:[0,16,23,26,27],detector:24,determin:[1,17,25],develop:[0,10,13,16,18,22,24,28],devic:[0,22,29],diagnost:14,diagram:[9,25,27],dict:[12,15,17,26],dictionari:[12,15,17,26,28],differ:[17,23,24,27,28,29],difficult:[10,29],digit:24,dir:24,directli:[0,22,24,28],directori:[14,17,18,24,26,27,28],disabl:[6,24],disclaim:[0,4,24],discov:27,disk:[11,15,25,27,28],disp:[7,24],displac:24,displai:[0,1,6,11,15,17,24,29],distanc:29,distribut:[0,3,5,10,18,19,24,28],docstr:28,document:[14,27,28],doe:[0,14,15,24,25,27],doesn:[15,18,24],doing:[14,24,27],don:[26,27,29],done:[14,18,20,22,27,28],doorbel:24,doubl:[18,23],down:[10,11,22],download:[18,22,24,26],downward:24,dport:22,draw:6,drawn:6,drop:[24,29],duckduckgo:29,due:[0,29],dump:[15,23,27],dump_default:15,duplic:28,durat:[1,2,6,24,26],dure:[9,16,25,28],dynam:6,each:[3,6,19,22,24,28,29],earli:[0,6,8,10,24],earlier:28,earth:0,earthquak:[0,16,23,27],easi:[0,13,23,24,28],easier:[10,13,24],easiest:26,easili:[13,22],echo:18,edg:24,edit:[18,27],educ:0,eew:[0,24],effect:6,effici:[13,28],ehn:15,ehz:[15,22,24,28],either:[5,6,7,20,23,24,28,29],elaps:[6,11,21],els:[12,29],elsewher:[0,14,24],embed:15,empti:24,emsc:10,enabl:[0,6,7,14,24,26,28],encod:22,encourag:28,end:[4,18,24,25,28],endpoint:24,endtest:25,enhanc:13,enn:15,enough:[0,22],ensur:24,enter:[14,18,23,24,27],entir:[14,24],entri:24,environ:[18,20,21,23,27],enz:[15,24],eq_screenshot:[24,26],equal:24,errformat:17,error:[0,6,13,14,17,22,24,29],especi:[6,24],essenti:[27,28],etc:[13,18],ethernet:29,even:[13,24,27,29],event:[0,6,12,13,15,17,24],event_tim:[6,15],event_time_str:6,eventu:28,everi:[6,7,14,21,24,29],evt:6,exampl:[3,15,17,18,19,21,22,24,28,29],exceed:[1,24],except:[17,22,28],excess:24,exec:4,execreload:14,execstart:14,execstartpr:14,execstop:14,execut:[3,4,7,14,18,19,22,24,26,28],exist:[17,24,26,28,29],exit:[24,25,28],experi:[24,29],explain:24,explan:18,explicit:[0,24],explor:0,extens:0,extern:29,extra:[10,24],extra_text:[10,24],extract:22,extrem:[0,24],face:29,fact:0,fail:14,failur:28,fairli:29,fals:[0,1,2,4,6,7,8,9,10,11,12,15,17,19,21,22,24,25,26,28],far:[0,29],fast:[22,24],fdsn:[22,24,26],featur:[0,13,16,23,29],feed:27,feel:[13,16,28],fetch:[9,26],few:24,ffmpeg:[18,24,28],field:[15,18,24],fifo:28,figloop:6,fignam:15,figur:[0,6,15,24,27,28,29],file:[4,5,6,10,11,14,15,17,18,20,23,24,25,26,27,29],filenam:6,filesystem:24,fill:24,filter:[1,24],find:[5,13,16,22,24,27],fine:22,firewal:16,first:[6,10,14,18,23,24,25,28,29],fix:[18,29],flag:[1,19,27,28],flavor:24,flow:[9,16,23,25],fmt:17,focu:23,folder:[18,24],follow:[4,14,15,16,18,21,24,26,27,28,29],footstep:24,forc:[23,24],forg:18,fork:24,form:[22,28],formal:28,format:[0,1,4,7,13,15,17,20,24,25,27,28,29],formatexcept:17,formatt:[16,28],formattim:17,formerli:23,forum:[13,28,29],forward:[7,11,16,23,29],found:24,four:[9,24],fraction:15,frame:[12,21,22],free:[8,24,28,29],freez:14,freq:15,frequenc:[21,22,24],from:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30],front:24,fsec:15,full:[6,15],fulli:[0,22,24],fullscreen:[6,24],fun:13,further:[0,24],futur:[18,24],fwaddr:[7,24],fwd_alarm:[5,24],fwd_data:[5,24],fwformat:[7,24],fwport:[7,24],gather:28,gempa:22,gener:[10,16,18,27,28,29],geophon:[0,6,15,24],get:[5,6,13,15,16,22,24,26,27,28,29],get_inventori:22,get_ip:22,get_msg_path:15,get_msg_tim:15,getchn:22,getdata:22,getmessag:17,getq:[6,11,28],getsr:22,getstream:22,gettim:22,gettr:22,getttlchn:22,git:[14,18,23],github:[13,14,16,18,29],give:[10,24,29],given:[15,28,29],glad:29,global:[12,22],globe:29,goe:[24,28,29],going:[0,29],gone:10,got:28,gpio:13,gracefulli:19,grade:[0,24],graphic:14,grasp:0,grav:7,great:29,green:14,grei:14,ground:[3,19],group:24,guarante:[0,24,29],gui:[0,6,24],guid:[16,24],guidanc:12,hack:22,had:24,handl:[6,12,23],handle_clos:6,handle_res:6,handler:[12,17,21,22],happen:[6,24,28,29],hard:29,harmless:18,has:[0,4,6,9,10,11,18,21,24,28,29],have:[0,4,6,13,14,15,18,22,24,27,28,29],hdf:[15,22,24],head:18,headless:0,hear:13,heart:6,help:[12,22,24,29],helper:[16,22],here:[0,1,4,13,17,24,26,28],hierarchi:[9,25,27,28],high:24,higher:24,highli:16,highpass:[1,24,26],hit:18,hobbi:[0,24],hold:24,home:[14,15,18,23,24,28],homebrew:24,host:[22,29],hostnam:26,hour:[0,10,21,29],how:[6,13,18,23,24,27,28],howev:[10,18,24,27,29],http:[13,14,16,28,29],hundredth:15,ian:16,iannesbitt:[14,15],idea:28,ifttt:13,ignor:[5,11,23,24,28],imag:[6,8,10,15,24,28],imgpath:[6,8,9,10,15,26,28],immedi:25,implement:28,impli:[0,24],implic:24,importerror:6,inabl:29,inact:14,includ:[0,10,14,22,23,24,27,28],incom:[1,23],increas:22,increment:6,indefinit:29,independ:28,index:[1,2,3,4,5,6,7,8,9,10,11,12,19,20,21,22,24,25,26],indic:[12,13,19,29],individu:[27,29],inet:26,inf:20,infinit:28,info:[17,29],infoformat:17,inform:[0,10,15,17,22,24,28,29],ingest:29,init:29,init_dir:17,initd:22,initi:[15,16,21,22,26,28],initrslib:22,input:[20,24],insert:24,inset:28,insid:[24,29],instal:[0,14,16,20,21,23,27,30],instanc:[15,28],instanti:28,instantli:28,instead:[10,27],institut:22,instruct:[4,16,18,24,26,27],instrument:[0,15,16,22,24],integ:[15,18,22],integr:[13,27,28],intend:[0,22,24],interact:13,interfac:17,intern:[24,29],internet:[26,27,29],interrupt:14,interv:[7,24],intervent:0,intuit:0,inv:[15,22],inventori:[9,15,22,24,26],involv:13,ioerror:[22,29],is_connect:26,isn:13,isp:29,issu:[0,13,16,24,27,28],item:[24,28],its:[0,9,10,14,15,22,24,26,27,28],itself:27,job:29,json:[5,7,15,18,23,24,27,28,29],jump:24,just:[9,11,24,28,29],keep:[0,22,24],kei:[10,18,24,29],keystrok:21,kid:13,kill:14,kiosk:[0,6,24],know:[16,18,28,29],known:[23,24,29],kwarg:[1,7,22],label:[17,29],laid:28,laptop:18,larg:27,last:[11,24,25,27,28],later:[5,10,18],latest:[18,25],layout:16,lead:24,lean:0,learn:[0,13],least:[15,22,24],leav:[0,18],length:24,let:[6,24,28,29],level:17,level_fmt:17,levelformatt:17,liabil:[0,24],libav:[24,28],librari:[6,15,16,23],licens:[0,24],life:[0,24],light:13,like:[3,9,13,14,17,18,19,22,23,24,27,28,29],likewis:1,limit:[0,10,24],line:[4,12,13,14,17,20,21,22,23,24,25,27,28,29],linecach:6,linestyl:13,linewidth:13,linger:14,link:24,linux:[14,16],list:[1,3,5,6,11,12,15,19,22,24,28],listen:[1,7,21,22,24,29],lite:[7,24],littl:6,live:[1,7,16],load:[12,24],loc:15,local:[0,16,21,22,24,27],localhost:[22,25],locat:[15,18,22,23,24,29],lock:24,log:[13,14,17,22,24,26,29],logdir:26,logdir_permiss:26,logic:28,loginctl:14,lognam:17,logrecord:17,longer:[6,24],look:[0,10,14,16,18,19,22,24,27,28,29],loop:[6,22,25,28],lose:24,loss:[21,29],lost:21,lot:[6,28],low:[0,22],lowpass:[1,24,26],lta:16,lxml:18,mac:[18,24],machin:[14,22,24],maco:16,made:[0,11,28],mai:[0,3,6,10,14,18,19,23,24,28,29],main:[3,6,12,16,20,21,24,28],mainloop:6,mainpid:14,maintain:[0,28],make:[0,4,6,10,12,13,18,22,24,27,28,29],make_test_set:[26,27,28],make_trac:22,manag:24,mani:[0,6,10,24,28,29],manual:[16,18,24,29],master:[6,12,16,19,28],match:[15,24],matplotlib:[6,13,18,26,28],matter:24,max:1,mean:[0,4,18,24,27,28],meant:[0,24,27],measur:[7,15,24],media:[0,10,13,28],memori:[0,22],merg:22,messag:[1,2,3,4,5,6,7,8,9,10,11,13,15,16,17,19,20,24,25,26],method:[18,23,24],metric:15,mexican:[8,24],microsecond:15,middl:[16,28],might:[14,24,29],millisecond:[21,22],miniconda3:18,miniconda:18,minimum:0,minise:[11,16,20,26,27],minut:18,misconfigur:14,miss:24,mk_p:[12,28],mk_q:[12,28],mkdir:14,mode:[6,12,16,24,27],model:24,modif:22,modifi:[18,22,23,26,28],modul:[0,4,5,6,8,10,13,16,18,20,22,25,26],monei:0,monitor:[0,13,14,16,19,28,29],month:0,more:[4,5,6,10,13,22,23,24,27,28,29],most:[0,6,13,22,24,29],motion:[0,3,16,19,24],motor:13,move:[0,24,28,29],mp3:24,mp3file:24,mpl:26,mseed:[20,27],msg:[15,17],msg_alarm:15,msg_imgpath:15,msg_reset:15,msg_term:15,much:[0,24,28,29],multi:10,multipl:[0,5,24,28],must:[0,6,10,15,18,20,22,24,27,28,29],mymod:28,mymodul:28,n_internet:26,n_inventori:[9,26],n_port:26,nail:10,name:[6,11,15,17,18,21,22,23,24,26,27,28],nano:14,nation:24,nativ:24,natur:0,navig:29,nearbi:24,nearli:0,necessari:[14,15,22],necessarili:24,need:[0,13,14,15,16,18,22,23,24,26,27,28,29],neg:[0,24],nesbitt:16,network:[5,14,22,24,25,26],never:24,newbot:24,newlin:[4,24],next:[14,18,23,24,25,28],nodata:22,node:[24,29],noder:24,nois:24,non:[0,24],none:[4,12,15,17],nonetyp:15,normal:[9,27,28],notabl:24,note:[0,27,29],notif:[0,8,10,16],notifi:[1,16,29],now:[14,18,22,24,28],nth:6,num:5,number:[6,8,15,21,22,24,28],numpi:18,object:[1,2,3,5,6,15,18,19,22,28],obspi:[1,3,6,11,15,18,19,20,22,24,27,28],occasion:[0,24],occur:[24,28],odir:17,off:[12,13,22,28],off_ev:13,offic:30,offici:[0,24],often:[24,29],old:[18,22],on_ev:13,onc:[6,10,24,27,28],one:[0,4,5,13,15,22,23,24,27,28,29],ones:13,onli:[0,8,9,10,12,15,22,23,24,28],onlin:29,open:[0,13,18,22,23,24,25,28],opensock:22,oper:[9,11,17,18,23,27],operand:17,option:[5,7,10,16,22,24,28],order:[0,5,6,14,15,16,18,22,24,28],ordinari:27,ordinarili:27,org:[13,28,29],organ:[16,28],orig:22,oserror:22,other:[0,1,3,5,6,8,11,13,14,16,18,19,23,24,28],otherwis:[11,21,26],our:[13,16,18,23,28,29,30],out:[6,16,17,22,24,27,28,29],outcom:0,outf:20,outlin:28,output:[0,7,12,13,14,15,17,20,24,26,29],output_dir:[11,15,24],outsid:29,over:[1,11,18,22,27,29],overload:29,overrid:18,overview:[16,24],overwrit:23,overwritten:18,own:[0,13,16,22,24,26],p_data_dir:26,p_log_dir:26,p_log_fil:26,p_log_std:26,p_output_dir:26,p_produc:[1,3,15,16,22,24,28],p_screenshot_dir:26,packag:[20,24],packet:[5,6,7,9,11,15,16,22,24,25,27,29],packetloss:[16,29],pad:15,page:[1,2,3,4,5,6,7,8,9,10,11,12,13,16,19,20,21,22,24,25,26,27,29],panama:30,panamaigc:8,param:28,paramet:[1,2,3,4,5,6,7,8,9,10,11,12,15,16,17,19,20,21,22,24,25,26,28],parent:28,pars:[16,22,28],parser:28,part:[0,10,24,28],partial:15,partwai:18,pass:[2,3,4,5,6,9,12,13,15,16,19,20,21,22,24,25,26],past:[13,14,29],path:[15,18,23,24,26],patienc:29,paus:18,per:[6,11,15,22,23,24],perform:[0,24],perhap:[0,27],period:[0,21,24,29],perman:14,permiss:[10,26,27,29],person:16,piec:[0,24,27],pin:13,ping:24,pip:18,place:[22,24,28],plai:[13,16,18,26,27,28],plan:28,platform:[0,10,28],playback:24,pleas:[0,4,13,18,24,27,29],plenti:22,plot:[0,3,13,15,16,19,23,26,28],plt:13,plu:29,png:[15,24,28],point:[22,24,28],popul:[3,6,19,24],port:[5,7,15,19,21,22,23,24,25,26,27,28,29],portion:24,posit:[0,9,24,25],post:[8,10,24,28,29],potenti:13,power:[0,6,9,22,24],pre:16,precis:[15,22],prefer:[16,23],prepar:25,preparatori:17,press:[23,24,29],pressur:[0,15,16,24],pretti:28,previou:[18,24],print:[7,15,16,17,21,22],printdata:16,printfreq:21,printm:[17,22,28],printraw:24,printttl:21,printw:17,prior:[4,22,24,26],privat:29,privileg:18,probabl:[18,28],problem:[13,18,24,27,29],proc:12,proce:[18,24],process:[0,3,6,9,10,12,16,21,23,24,26,27,28],processor:[6,18,24],produc:[1,3,12,13,15,16,20,22,24,27],profession:[0,24],profil:[18,24],program:[0,11,13,14,16,18,21,22,23,24,25,26,27],programmat:28,project:[0,16],prompt:[18,23],properli:6,properti:[0,24],protect:0,protocol:29,provid:[0,13,14,24,29],pull:[18,28],purpos:[11,24,28],put:[6,15,19,24],pydub:[2,26],pyplot:[13,28],python3:20,python:[0,4,15,16,18,20,24,28],qt5:6,quak:24,quarter:6,question:[4,11,13,24,28],queue:[1,2,3,4,5,6,7,8,9,10,11,12,13,15,19,24,25,28],quickli:[0,8,10],quiet:[7,26],quit:[2,4,6,7,16,19,25,28],r24fa:[15,26,28],r3bcf:22,r940d:22,rais:[1,6,22],ram:0,raspberri:[0,10,14,15,16,18,20,22,24,25,26,27,29,30],raspberryshak:[13,15,16,28,29],raspbian:[14,18,24],raspishak:[13,14,16],rate:[6,10,15,21,22,25,27],ratio:[1,24],raw:[5,15,24],rcb43:22,reach:25,read:[1,2,3,4,5,7,8,10,11,15,16,18,20,22,24,25,27,28],read_set:15,reader:25,readi:[15,18,23,24],readili:24,real:[0,7,14,16],realli:24,reason:[14,18,23,29],reboot:14,rebuild:23,receiv:[19,22,24,26,27,28],recept:9,record:[0,6,15,17,27],recur:29,recurs:[1,24],recursive_sta_lta:[1,24],red:[14,28],redraw:6,referenti:22,reflect:[15,29],refresh:[6,24],regard:[0,14],regist:24,reject:24,rel:10,relat:6,releas:[18,24],relev:[24,26,28,29],reli:[0,24,28],reliabl:[10,22],reload:14,remain:0,remind:28,remot:[16,27],remov:24,render:24,replac:18,report:[12,15,21,22,28,29],repositori:[0,18,23,24],repres:9,request:[22,28],requir:[0,4,22,24,27,28],reset:[1,5,9,13,15,22,24,26,28],reset_tim:15,resid:29,resiz:6,resolv:[22,24],resourc:[13,16],respect:[24,28],respons:[24,29],rest:[27,28],restart:[0,16,24,29],restartsec:14,restructuredtext:28,result:[12,24,26],rewritten:18,richard:16,right:[15,22,28,29],rigor:10,room:0,round:15,router:29,routin:[0,6,11,12,13,27],row:[28,29],rs4d:[15,24],rsam:[16,26],rsstn:22,rsudp:[13,24,28,30],rsudp_set:[18,23,24,29],rtype:28,rule:10,run:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,16,19,20,21,22,25,26,27,28,30],runtim:28,s0cde:22,safer:29,sai:[14,24,29],said:24,same:[22,24,25,27,29],sampl:[6,11,15,22,27],sasmex:[8,24],save:[0,6,15,17,24,28],save_pct:6,savefig:[6,28],scenario:24,scienc:[0,15,22],scipi:18,screen:24,screencap:6,screenshot:[6,13,15,24,26,28],script:[13,14,18,22,23,24,27,29],scroll:29,search:[1,2,3,4,5,6,7,8,9,10,11,12,16,19,20,21,22,24,25,26,29],sec:15,second:[1,2,6,7,11,14,15,18,21,22,24,27,28,29],secret:[10,24],section:[0,5,18,24,28,29],secur:29,sediment:24,see:[0,1,2,4,5,6,7,8,9,10,12,13,14,16,17,19,20,22,23,24,25,27,28,29],seek:25,seem:0,segment:11,seiscomp3:22,seismic:[0,7,16,20,22,27],seismogram:[6,24],seismograph:[0,16],seismolog:0,self:[2,4,6,7,9,11,15,22,25,28],send:[1,6,7,8,10,13,15,17,22,23,24,25,27,28,29],send_imag:[8,24],sender:[8,17,22,28],sent:[1,2,3,4,5,6,7,8,9,10,11,22,24,25,28,29],separ:[6,24],sequenc:[24,28],serial:15,server:24,servic:[6,8,10,14,24,26,29],set:[0,1,4,5,6,7,10,11,12,13,14,15,16,18,21,22,23,25,26,29,30],set_channel:15,set_param:22,set_sp:[6,11],settings_loc:15,setup:[12,16,22,29],setup_plot:6,sever:[18,23,24,29],shake:[0,6,10,14,15,16,20,22,23,24,25,26,27,30],shorten:24,should:[0,1,12,14,18,19,22,24,28,29],show:[0,12,14,27,28],shown:28,shutdown:6,shz:[15,24],side:16,sig:12,sign:24,signal:[1,6,12,21,22,24,28],signal_handl:21,signum:[21,22],similar:[0,13,18,28],simpl:[0,10,11,15,24,25],simpli:[18,24],simultan:[0,24],sinc:[13,21,22,24,28,29],singl:[5,22,24],site:29,size:24,skip:18,sleep:14,slice:11,slicestream:11,slightli:[27,29],slow:29,slower:[6,24],small:[24,27,29],social:[0,10,13,28],socket:[22,25],softwar:[0,13,18,23,24,27,28],solut:22,solv:29,some:[6,13,14,15,18,22,23,24,26,28,29],somehow:14,someon:27,someth:[13,14,16,22,24,28,29],sometim:10,somewher:[24,29],sonar:24,soon:30,sort:28,sound:[0,1,13,16,18,23,26,27,28],soundloc:2,sourc:[0,23,24,28,29],space:[17,24],span:10,special:16,specif:[1,6,12,15,18,21,22,27,29],specifi:[5,7,15,17,22,24,25,26,27,28,29],spectrogram:[6,24],speed:[24,25],spent:0,sphinx:28,spin:28,sps:[15,22],sqlalchemi:18,ss_permiss:26,sta:[2,16],stabl:0,stackoverflow:[4,17,22,24],stamp:17,stand:28,standard:[0,4,24,28],start:[5,9,11,12,14,16,21,22,24,25,26,27,28],start_log:17,startup:6,stat:15,state:[0,12,13,22,23,24,26],station:[15,22,24,26],statist:21,statu:[14,19,28],stdout:[24,26],steim2:24,step:[17,18,24,28],still:[24,29],stn:22,stomp:24,stop:[12,19,23],store:[22,29],str:[1,4,5,6,7,8,10,11,15,17,20,22,25,26,28],straightforward:29,strang:15,stream:[1,3,6,9,11,15,16,19,21,22,23,24,28,30],street:0,strftime:[15,17],strict:29,stricter:10,string:[4,6,15,17,22,24,25,28],structur:[14,26],student:27,stuff:[6,28],style:[4,24],sub:[3,12,15,16,22,28],submit:[28,29],subsequ:24,substitut:[0,24],succe:24,success:26,successfulli:24,sudden:[0,16,24],sudo:[14,24],suffer:0,suffic:0,suffici:24,suggest:[13,16],suit:[8,24],summari:27,suppli:[12,24],support:[15,28,29],suppress:7,sure:[4,13,24,27,29],suspici:10,switcher:24,sys:28,system:[0,8,14,18,22,23,24],systemctl:[0,16],systemd:14,t_testdata:[16,27],tab:24,tag:13,tail:14,take:[6,12,18,24],taken:12,talk:29,target:[14,29],task:[0,3,19],task_don:28,team:[15,29],technic:29,telegram:[0,10,13,16,26],telegramm:[8,24,28],tell:[18,24,27,28,29],term:[1,2,4,6,7,9,15,19,24,25,26,28],termin:[18,23],test:[0,6,8,10,12,14,15,16,17,18,20,24],test_mod:12,testb:22,testdata:[9,25,27],testdir:26,text:[10,12,14,15,17,20,24,27,29],than:[5,6,10,14,18,23,24,27,29],thank:[28,29],thei:[13,17,19,22,23,26,27,28,29],them:[12,17,24,25,28,29],theoret:24,theori:[0,28],therefor:16,thi:[0,1,3,4,5,6,8,9,10,11,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29],thing1:28,thing:[0,3,6,8,13,17,19,24,28,29],think:10,thoroughli:24,those:[3,5,20,22],thread:[5,9,12,16,19,22,24,25,27],threadsaf:6,three:[24,28,29],thresh:1,threshold:[1,24,26],through:[0,6,10,18,23,27,28,29],thu:18,tick:11,time:[0,1,6,7,11,13,14,15,16,17,21,22,23,26,27,29],timeout:22,timestamp:[15,22,25],tkagg:6,tmp:[13,14,24,26,29],token:[8,10,24],too:[24,29],tool:0,top:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],total:22,trace:[0,15,22],track:16,tradit:28,transduc:[0,15,16,24],transmiss:[15,21,22,25],tri:0,trigger:[0,1,3,6,13,16,19,27,28],tripl:[13,29],troubl:[18,27],troubleshoot:[16,27],truncat:24,turn:[12,20,28,29],tutori:[14,16,18,23],tweet:[10,16,26],tweet_imag:[10,24],tweeter:[10,24,28],twitter:[0,13,16,26],two:[15,24,28],txt:[20,27],type:[6,9,11,12,15,16,17,18,21,22,23,24,26,27],typic:[24,27,29],ubuntu:14,udp:[0,5,7,16,20,22,23,24,25,27,29],unam:18,uncheck:24,unconsolid:24,under:29,understand:[24,28],unfamiliar:28,uniqu:0,unit:[14,15,24,26],univers:28,unix:[4,13,14,16,18,22,24],unless:24,unlimit:22,unmaintain:0,unmodifi:24,unpredict:0,unstabl:29,until:[9,15,22,25,28,29],unzip:18,updat:[6,11,22,24],update_plot:6,update_stream:22,upload:6,upon:[16,28],usag:[20,22,27],use:[0,6,10,15,18,22,23,27,28],used:[0,3,6,8,10,13,15,17,19,22,24,27,28],useful:[0,17,27,28],user:[0,4,14,15,16,22,23,24,28,29],usernam:24,uses:[0,1,15,17,28,29],usestim:17,usg:10,using:[4,10,13,14,17,18,20,21,22,24,26,27,29],usual:[0,27,29],utc:11,utcdatetim:[1,6,15,22],utcdatetime1:13,utcdatetime2:13,utcdatetime3:13,utcdatetime4:13,util:[17,20,24],valid:[15,24],valu:[12,18,21,22,24,26,28,29],vari:10,variabl:[11,12,15,18,22,26],variou:[3,6,16,18,19,27],vel:[7,24],veloc:[15,24],verbos:15,veri:[22,24],version:[4,5,7,8,9,10,12,15,18,24,25,26,28],vertic:[6,15,24],via:[0,8,28,29],vibrat:0,video:[16,18,23],virtual:18,visual:16,voltag:24,wai:[0,6,13,16,24,26,27,28,29],wait:[22,24],walkthrough:16,want:[4,13,14,15,24],wantedbi:14,warm:24,warn:[0,4,8,17,24],warnformat:17,warranti:[0,24],wast:26,watch:[27,28],web:24,websit:24,week:0,weird:6,welcom:[13,16],well:[13,14,24,29],were:[24,27],what:[4,14,16,24,27,28,29],whatev:[24,28],when:[0,1,2,6,10,11,13,16,18,21,22,24,25,28,30],whenev:24,where:[6,18,20,23,24,28,29],wherea:14,whether:[0,1,5,6,7,8,10,11,12,14,17,18,19,24,26,27],which:[0,8,14,15,17,19,20,21,22,24,27,28,29],white:15,why:[16,29],wifi:29,williamstown:24,win:[18,23],win_overrid:[4,24],win_ovr:4,window:[4,6,7,13,16],wish:[18,24,26,28],within:[14,20],without:[0,6,13,24,27,29],work:[13,14,15,18,22,24,28,29],worker:28,would:[15,18,24,26,27,28,29],write:[16,17,20,26],writer:16,written:[16,24],wrong:29,x86:18,x86_64:18,xyz:28,yellow:15,yet:0,yield:[17,24],you:[0,4,10,13,14,15,16,18,22,23,24,26,27,28,29],your:[4,10,13,14,16,21,22,23,24,26,29],your_modul:[26,28],your_shake_bot_id:24,your_test:26,yourself:[18,29],youtub:16,z0000:[22,24,26],zero:[15,22,29]},titles:["<span class=\"section-number\">1. </span>About rsudp","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_alert</span></code> (STA/LTA alarm)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_alertsound</span></code> (play sound)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_consumer</span></code> (master consumer)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_custom</span></code> (run code)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_forward</span></code> (forward data)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_plot</span></code> (plot data)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_rsam</span></code> (RSAM analysis)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_telegram</span></code> (Telegram alerts)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_testing</span></code> (test consumer)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_tweet</span></code> (Twitter alerts)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.c_write</span></code> (write data)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.client</span></code> (central module)","<span class=\"section-number\">2. </span>Contributing to this project","<span class=\"section-number\">5. </span>rsudp as a <code class=\"docutils literal notranslate\"><span class=\"pre\">systemctl</span></code> daemon","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.helpers</span></code> (helper functions)","<cite>rsudp</cite> 1.0.2","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.__init__</span></code> (initialization functions)","<span class=\"section-number\">2. </span>Installing rsudp","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.p_producer</span></code> (data producer)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.packetize</span></code> (data formatter)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.packetloss</span></code> (track packets)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.raspberryshake</span></code> (main library)","<span class=\"section-number\">4. </span>Running rsudp","<span class=\"section-number\">3. </span>Modules and Settings","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.t_testdata</span></code> (test pre-producer)","<code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">rsudp.test</span></code> (test helpers)","<span class=\"section-number\">7. </span>Testing and demoing rsudp","<span class=\"section-number\">1. </span>Program architecture and flow","<span class=\"section-number\">6. </span>Troubleshooting rsudp","YouTube walkthroughs"],titleterms:{"default":24,"function":[15,16,17,27],Adding:28,The:18,Using:[24,27],__init__:17,about:0,add:18,advanc:18,alarm:1,alarmsound:24,alert:[8,10,24],amplitud:24,analysi:7,app:24,architectur:28,bashrc:18,bot:24,broad:0,bug:13,c_alert:1,c_alertsound:2,c_consum:3,c_custom:4,c_forward:5,c_plot:6,c_rsam:7,c_telegram:8,c_test:9,c_tweet:10,c_write:11,can:[0,29],central:12,classroom:24,client:[12,28],code:[4,13,16,24],command:29,conda:29,consol:24,consum:[3,9,28],contribut:13,custom:24,daemon:14,data:[5,6,11,19,20,24,27,29],datacast:24,demo:[27,30],demonstr:[23,24],depend:24,detect:[24,30],document:16,dure:27,earthquak:[24,30],easi:18,exec:24,featur:28,file:28,firewal:29,flow:[27,28,29],formatt:20,forward:[5,24],gener:24,helper:[15,26],home:29,inconsist:29,index:16,initi:17,instal:[18,24],instruct:14,issu:29,layout:28,librari:22,line:18,linux:[18,24],live:[24,30],local:29,lta:[1,24],maco:[18,24],main:22,manual:23,master:3,messag:28,middl:29,minise:24,mode:23,modul:[12,24,27,28],network:29,notif:24,other:29,overview:0,own:[27,28],p_produc:19,packet:[20,21],packetloss:21,pass:28,plai:[2,24],plot:[6,24],pre:25,print:24,printdata:24,produc:[19,25,28],program:28,project:13,pydub:24,quiet:24,quit:23,raspberryshak:22,real:24,receiv:29,recommend:24,remot:29,restart:14,rsam:[7,24],rsudp:[0,1,2,3,4,5,6,7,8,9,10,11,12,14,15,16,17,18,19,20,21,22,23,25,26,27,29],run:[4,18,23,24,29],sampl:28,school:29,seismic:24,set:[24,27,28],setup:14,shake:29,side:29,sound:[2,24],sourc:18,special:0,sta:[1,24],start:23,stop:29,suggest:28,systemctl:14,t_testdata:25,telegram:[8,24],test:[9,23,25,26,27,28],thi:13,thread:28,time:24,track:21,trigger:24,troubleshoot:[14,29],tweet:24,twitter:[10,24],type:28,univers:29,unix:23,updat:18,upon:24,use:24,user:18,vault:24,wai:18,walkthrough:30,what:0,why:0,window:[18,23,24],write:[11,24],writer:24,your:[18,27,28],youtub:30}})
\ No newline at end of file
diff --git a/rsudp/__init__.py b/rsudp/__init__.py
index 5766253..4af8c66 100644
--- a/rsudp/__init__.py
+++ b/rsudp/__init__.py
@@ -32,6 +32,7 @@
 output_dir = False
 data_dir = False
 scap_dir = False
+ms_path = False
 
 COLOR = {
 	'purple': '\033[95m',
diff --git a/rsudp/c_telegram.py b/rsudp/c_telegram.py
index c676419..d63c14f 100644
--- a/rsudp/c_telegram.py
+++ b/rsudp/c_telegram.py
@@ -17,13 +17,12 @@ class Telegrammer(rs.ConsumerThread):
 
 	.. |sasmex_use| raw:: html
 
-		<a href="https://t.me/sasmex" target="_blank">used by</a>
+		<a href="https://t.me/sasmex" target="_blank">Mexican Early Warning System (SASMEX)</a>
 
 	|telegram| is a free messaging service which,
 	among other things, is suited to quickly broadcasting automatic
 	notifications via an API.
-	It is |sasmex_use| the Mexican Early Warning
-	System (SASMEX) and PanamaIGC.
+	It is used by the |sasmex_use| and PanamaIGC.
 
 	:param str token: bot token from Telegram bot creation
 	:param str chat_id: Telegram chat ID number that this module will post to
@@ -31,7 +30,7 @@ class Telegrammer(rs.ConsumerThread):
 	:param queue.Queue q: queue of data and messages sent by :class:`rsudp.c_consumer.Consumer`
 
 	'''
-	def __init__(self, token, chat_id,
+	def __init__(self, token, chat_id, testing=False,
 				 q=False, send_images=False,
 				 sender='Telegram'):
 		"""
@@ -44,6 +43,7 @@ def __init__(self, token, chat_id,
 		self.send_images = send_images
 		self.token = token
 		self.chat_id = chat_id
+		self.testing = testing
 		self.fmt = '%Y-%m-%d %H:%M:%S.%f'
 		self.region = ' - region: %s' % rs.region.title() if rs.region else ''
 
@@ -55,16 +55,22 @@ def __init__(self, token, chat_id,
 			self.alive = False
 			sys.exit()
 
-		self.telegram = tg.Bot(token=self.token)
+		if not self.testing:
+			self.telegram = tg.Bot(token=self.token)
+		else:
+			printW('The Telegram module will not post to Telegram in Testing mode.',
+					self.sender, announce=False)
 
 		self.livelink = 'live feed ➡️ https://stationview.raspberryshake.org/#?net=%s&sta=%s' % (rs.net, rs.stn)
 		self.message0 = '(Raspberry Shake station %s.%s%s) Event detected at' % (rs.net, rs.stn, self.region)
+		self.last_message = False
 
 		printM('Starting.', self.sender)
 
 
 	def auth(self):
-		self.telegram = tg.Bot(token=self.token)
+		if not self.testing:
+			self.telegram = tg.Bot(token=self.token)
 
 
 	def getq(self):
@@ -91,8 +97,9 @@ def _when_alarm(self, d):
 		response = None
 		try:
 			printM('Sending alert...', sender=self.sender)
-			response = self.telegram.sendMessage(chat_id=self.chat_id, text=message)
-			printM('Sent Telegram: %s' % (message), sender=self.sender)
+			if not self.testing:
+				response = self.telegram.sendMessage(chat_id=self.chat_id, text=message)
+			printM('Telegram message: %s' % (message), sender=self.sender)
 
 		except Exception as e:
 			printE('Could not send alert - %s' % (e))
@@ -100,11 +107,13 @@ def _when_alarm(self, d):
 				printE('Waiting 5 seconds and trying to send again...', sender=self.sender, spaces=True)
 				time.sleep(5)
 				self.auth()
-				response = self.telegram.sendMessage(chat_id=self.chat_id, text=message)
-				printM('Sent Telegram: %s' % (message), sender=self.sender)
+				if not self.testing:
+					response = self.telegram.sendMessage(chat_id=self.chat_id, text=message)
+				printM('Telegram message: %s' % (message), sender=self.sender)
 			except Exception as e:
 				printE('Could not send alert - %s' % (e))
 				response = None
+		self.last_message = message
 
 
 	def _when_img(self, d):
@@ -120,7 +129,8 @@ def _when_img(self, d):
 				with open(imgpath, 'rb') as image:
 					try:
 						printM('Uploading image to Telegram %s' % (imgpath), self.sender)
-						response = self.telegram.sendPhoto(chat_id=self.chat_id, photo=image)
+						if not self.testing:
+							response = self.telegram.sendPhoto(chat_id=self.chat_id, photo=image)
 						printM('Sent image', sender=self.sender)
 					except Exception as e:
 						printE('Could not send image - %s' % (e))
@@ -129,7 +139,8 @@ def _when_img(self, d):
 							time.sleep(5.1)
 							self.auth()
 							printM('Uploading image to Telegram (2nd try) %s' % (imgpath), self.sender)
-							response = self.telegram.sendPhoto(chat_id=self.chat_id, photo=image)
+							if not self.testing:
+								response = self.telegram.sendPhoto(chat_id=self.chat_id, photo=image)
 							printM('Sent image', sender=self.sender)
 
 						except Exception as e:
diff --git a/rsudp/c_tweet.py b/rsudp/c_tweet.py
index 506db06..489ae6c 100644
--- a/rsudp/c_tweet.py
+++ b/rsudp/c_tweet.py
@@ -53,7 +53,7 @@ class Tweeter(rs.ConsumerThread):
 		In general, if you are looking for a simple multi-platform notification
 		service, it may be easier and more reliable to use the Telegram service
 		instead. rsudp has a telegram module at
-		:py:class:rsudp.c_telegram.Telegram:. See :ref:`setting-up-telegram` for details.
+		:py:class:`rsudp.c_telegram.Telegram`. See :ref:`setting-up-telegram` for details.
 
 	:param str consumer_key: Twitter calls this the "consumer key"
 	:param str consumer_secret: Twitter calls this the "consumer key secret"
@@ -67,7 +67,7 @@ class Tweeter(rs.ConsumerThread):
 
 	'''
 	def __init__(self, consumer_key, consumer_secret, access_token, access_token_secret,
-				 q=False, tweet_images=False, extra_text=False,
+				 q=False, tweet_images=False, extra_text=False, testing=False,
 				 ):
 		"""
 		Initialize the process
@@ -76,12 +76,14 @@ def __init__(self, consumer_key, consumer_secret, access_token, access_token_sec
 		self.sender = 'Tweeter'
 		self.alive = True
 		self.tweet_images = tweet_images
+		self.testing = testing
 		self.fmt = '%Y-%m-%d %H:%M:%S.%f'
 		self.region = ' - region: %s' % rs.region.title() if rs.region else ''
 		self.consumer_key = consumer_key
 		self.consumer_secret = consumer_secret
 		self.access_token = access_token
 		self.access_token_secret = access_token_secret
+		self.last_message = False
 
 		self._resolve_extra_text(extra_text)
 
@@ -93,12 +95,18 @@ def __init__(self, consumer_key, consumer_secret, access_token, access_token_sec
 			self.alive = False
 			sys.exit()
 
-		self.twitter = Twython(
-			consumer_key,
-			consumer_secret,
-			access_token,
-			access_token_secret
-		)
+		if not self.testing:
+			self.twitter = Twython(
+				consumer_key,
+				consumer_secret,
+				access_token,
+				access_token_secret
+			)
+		else:
+			printW('The Twitter module will not post to Twitter in Testing mode.',
+					self.sender, announce=False)
+
+
 		self.livelink = 'live feed ➡️ https://stationview.raspberryshake.org/#?net=%s&sta=%s' % (rs.net, rs.stn)
 		self.message0 = '(#RaspberryShake station %s.%s%s) Event detected at' % (rs.net, rs.stn, self.region)
 		self.message1 = '(#RaspberryShake station %s.%s%s) Image of event detected at' % (rs.net, rs.stn, self.region)
@@ -153,32 +161,36 @@ def _when_alarm(self, d):
 		message = '%s %s UTC%s - %s' % (self.message0, self.last_event_str, self.extra_text, self.livelink)
 		response = None
 		try:
-			printM('Sending tweet...', sender=self.sender)
-			response = self.twitter.update_status(status=message, lat=rs.inv[0][0].latitude,
-													long=rs.inv[0][0].longitude,
-													geo_enabled=True, display_coordinates=True)
-													# location will only stick to tweets on accounts that have location enabled in Settings
-			printM('Tweeted: %s' % (message), sender=self.sender)
-			url = 'https://twitter.com/%s/status/%s' % (response['user']['screen_name'], response['id_str'])
-			printM('Tweet URL: %s' % url)
-
-		except Exception as e:
-			printE('could not send alert tweet - %s' % (e))
-			try:
-				printE('Waiting 5 seconds and trying to send tweet again...', sender=self.sender, spaces=True)
-				time.sleep(5.1)
-				self.auth()
+			printM('Tweet: %s' % (message), sender=self.sender)
+			if not self.testing:
 				response = self.twitter.update_status(status=message, lat=rs.inv[0][0].latitude,
 														long=rs.inv[0][0].longitude,
 														geo_enabled=True, display_coordinates=True)
 														# location will only stick to tweets on accounts that have location enabled in Settings
-				printM('Tweeted: %s' % (message), sender=self.sender)
 				url = 'https://twitter.com/%s/status/%s' % (response['user']['screen_name'], response['id_str'])
 				printM('Tweet URL: %s' % url)
+
+		except Exception as e:
+			printE('could not send alert tweet - %s' % (e))
+			try:
+				printE('Waiting 5 seconds and trying to send tweet again...', sender=self.sender, spaces=True)
+				time.sleep(5.1)
+				printM('Tweet: %s' % (message), sender=self.sender)
+				if not self.testing:
+					self.auth()
+					response = self.twitter.update_status(status=message, lat=rs.inv[0][0].latitude,
+															long=rs.inv[0][0].longitude,
+															geo_enabled=True, display_coordinates=True)
+															# location will only stick to tweets on accounts that have location enabled in Settings
+					url = 'https://twitter.com/%s/status/%s' % (response['user']['screen_name'], response['id_str'])
+					printM('Tweet URL: %s' % url)
 			except Exception as e:
 				printE('could not send alert tweet - %s' % (e))
 				response = None
 
+		self.last_message = message
+
+
 
 	def _when_img(self, d):
 		'''
@@ -191,27 +203,12 @@ def _when_img(self, d):
 			imgtime = helpers.fsec(helpers.get_msg_time(d))
 			message = '%s %s UTC%s' % (self.message1, imgtime.strftime(self.fmt)[:22], self.extra_text)
 			response = None
-			if os.path.exists(imgpath):
-				with open(imgpath, 'rb') as image:
-					try:
-						printM('Uploading image to Twitter %s' % (imgpath), self.sender)
-						response = self.twitter.upload_media(media=image)
-						time.sleep(5.1)
-						printM('Sending tweet...', sender=self.sender)
-						response = self.twitter.update_status(status=message, media_ids=response['media_id'],
-																lat=rs.inv[0][0].latitude, long=rs.inv[0][0].longitude,
-																geo_enabled=True, display_coordinates=True)
-																# location will only stick to tweets on accounts that have location enabled in Settings
-						printM('Tweeted with image: %s' % (message), sender=self.sender)
-						url = 'https://twitter.com/%s/status/%s' % (response['user']['screen_name'], response['id_str'])
-						printM('Tweet URL: %s' % url)
-					except Exception as e:
-						printE('could not send multimedia tweet - %s' % (e))
+			printM('Image tweet: %s' % (message), sender=self.sender)
+			if not self.testing:
+				if os.path.exists(imgpath):
+					with open(imgpath, 'rb') as image:
 						try:
-							printM('Waiting 5 seconds and trying to send tweet again...', sender=self.sender)
-							time.sleep(5.1)
-							self.auth()
-							printM('Uploading image to Twitter (2nd try) %s' % (imgpath), self.sender)
+							printM('Uploading image to Twitter %s' % (imgpath), self.sender)
 							response = self.twitter.upload_media(media=image)
 							time.sleep(5.1)
 							printM('Sending tweet...', sender=self.sender)
@@ -219,17 +216,33 @@ def _when_img(self, d):
 																	lat=rs.inv[0][0].latitude, long=rs.inv[0][0].longitude,
 																	geo_enabled=True, display_coordinates=True)
 																	# location will only stick to tweets on accounts that have location enabled in Settings
-							printM('Tweeted with image: %s' % (message), sender=self.sender)
 							url = 'https://twitter.com/%s/status/%s' % (response['user']['screen_name'], response['id_str'])
 							printM('Tweet URL: %s' % url)
-
 						except Exception as e:
-							printE('could not send multimedia tweet (2nd try) - %s' % (e))
-							response = None
-
-			else:
-				printM('Could not find image: %s' % (imgpath), sender=self.sender)
-
+							printE('could not send multimedia tweet - %s' % (e))
+							try:
+								printM('Waiting 5 seconds and trying to send tweet again...', sender=self.sender)
+								time.sleep(5.1)
+								self.auth()
+								printM('Uploading image to Twitter (2nd try) %s' % (imgpath), self.sender)
+								response = self.twitter.upload_media(media=image)
+								time.sleep(5.1)
+								printM('Sending tweet...', sender=self.sender)
+								response = self.twitter.update_status(status=message, media_ids=response['media_id'],
+																		lat=rs.inv[0][0].latitude, long=rs.inv[0][0].longitude,
+																		geo_enabled=True, display_coordinates=True)
+																		# location will only stick to tweets on accounts that have location enabled in Settings
+								url = 'https://twitter.com/%s/status/%s' % (response['user']['screen_name'], response['id_str'])
+								printM('Tweet URL: %s' % url)
+
+							except Exception as e:
+								printE('could not send multimedia tweet (2nd try) - %s' % (e))
+								response = None
+
+				else:
+					printM('Could not find image: %s' % (imgpath), sender=self.sender)
+		
+		self.last_message = message
 
 	def run(self):
 		"""
diff --git a/rsudp/c_write.py b/rsudp/c_write.py
index 8e51b05..3193653 100644
--- a/rsudp/c_write.py
+++ b/rsudp/c_write.py
@@ -5,7 +5,7 @@
 from rsudp.raspberryshake import ConsumerThread
 import rsudp.raspberryshake as rs
 from rsudp import printM, printW, printE, helpers
-from rsudp import data_dir
+from rsudp import ms_path
 
 class Write(rs.ConsumerThread):
 	"""
@@ -16,19 +16,20 @@ class Write(rs.ConsumerThread):
 	:param queue.Queue q: queue of data and messages sent by :class:`rsudp.c_consumer.Consumer`
 	:param bool debug: whether or not to display messages when writing data to disk.
 	"""
-	def __init__(self, q, debug=False, cha='all'):
+	def __init__(self, q, data_dir, debug=False, cha='all'):
 		"""
 		Initialize the process
 		"""
 		super().__init__()
 		self.sender = 'Write'
 		self.alive = True
+		self.debug = debug
 
 		self.queue = q
 
 		self.stream = rs.Stream()
-		self.outdir = data_dir
-		self.debug = debug
+		self.outdir = os.path.join(data_dir, 'data')
+		self.outfiles = []
 
 		self.chans = []
 		helpers.set_channels(self, cha)
@@ -112,6 +113,8 @@ def write(self, stream=False):
 				t.data = t.data.filled(fill_value=0) # fill array (to avoid obspy write error)
 			outfile = self.outdir + '/%s.%s.00.%s.D.%s.%s' % (t.stats.network,
 								t.stats.station, t.stats.channel, self.y, self.j)
+			if not outfile in self.outfiles:
+				self.outfiles.append(outfile)
 			if os.path.exists(os.path.abspath(outfile)):
 				with open(outfile, 'ab') as fh:
 					if self.debug:
diff --git a/rsudp/client.py b/rsudp/client.py
index 5f7500f..1cbd87c 100644
--- a/rsudp/client.py
+++ b/rsudp/client.py
@@ -39,6 +39,9 @@
 DESTINATIONS, THREADS = [], []
 PROD = False
 PLOTTER = False
+TELEGRAM = False
+TWITTER = False
+WRITER = False
 SOUND = False
 TESTING = False
 TESTQUEUE = False
@@ -177,11 +180,12 @@ def run(settings, debug):
 		mk_p(prnt)
 
 	if settings['write']['enabled']:
+		global WRITER
 		# set up queue and process
 		cha = settings['write']['channels']
 		q = mk_q()
-		writer = Write(q=q, cha=cha)
-		mk_p(writer)
+		WRITER = Write(q=q, data_dir=output_dir, cha=cha)
+		mk_p(WRITER)
 
 	if settings['plot']['enabled'] and MPL:
 		while True:
@@ -313,6 +317,7 @@ def run(settings, debug):
 
 
 	if settings['tweets']['enabled']:
+		global TWITTER
 		consumer_key = settings['tweets']['api_key']
 		consumer_secret = settings['tweets']['api_secret']
 		access_token = settings['tweets']['access_token']
@@ -321,23 +326,23 @@ def run(settings, debug):
 		extra_text = settings['tweets']['extra_text']
 
 		q = mk_q()
-		tweet = Tweeter(q=q, consumer_key=consumer_key, consumer_secret=consumer_secret,
+		TWITTER = Tweeter(q=q, consumer_key=consumer_key, consumer_secret=consumer_secret,
 						access_token=access_token, access_token_secret=access_token_secret,
-						tweet_images=tweet_images, extra_text=extra_text)
-		mk_p(tweet)
+						tweet_images=tweet_images, extra_text=extra_text, testing=TESTING)
+		mk_p(TWITTER)
 
 	if settings['telegram']['enabled']:
+		global TELEGRAM
 		token = settings['telegram']['token']
 		chat_ids = settings['telegram']['chat_id'].strip(' ').split(',')
 		send_images = settings['telegram']['send_images']
-		
 		for chat_id in chat_ids:
 			sender = "Telegram id %s" % (chat_id)
 			q = mk_q()
-			telegram = Telegrammer(q=q, token=token, chat_id=chat_id,
-								   send_images=send_images,
+			TELEGRAM = Telegrammer(q=q, token=token, chat_id=chat_id,
+								   send_images=send_images, testing=TESTING,
 								   sender=sender)
-			mk_p(telegram)
+			mk_p(TELEGRAM)
 
 	if settings['rsam']['enabled']:
 		# put settings in namespace
@@ -597,11 +602,34 @@ def test():
 
 	try:
 		run(settings, debug=True)
+
+		if T.TEST['c_miniseed']:
+			printM('Merging and testing MiniSEED file...', sender='test client', announce=False)
+			try:
+				ms = rs.Stream()
+				for outfile in WRITER.outfiles:
+					if os.path.exists(outfile):
+						T.TEST['c_miniseed'][1] = True
+						ms = ms + rs.read(outfile)
+						dn, fn = os.path.dirname(outfile), os.path.basename(outfile)
+						os.replace(outfile, os.path.join(dn, 'test.' + fn))
+					else:
+						raise FileNotFoundError('MiniSEED file not found: %s' % outfile)
+				printM(ms.merge())
+			except Exception as e:
+				printE(e)
+				T.TEST['c_miniseed'][1] = False
+		if (T.TEST['c_tweet'] and TWITTER.last_message):
+			T.TEST['c_tweet'][1] = True
+		if (T.TEST['c_telegram'] and TELEGRAM.last_message):
+			T.TEST['c_telegram'][1] = True
+
 	except Exception as e:
 		printE(traceback.format_exc(), announce=False)
 		printE('Ending tests.', sender='test client', announce=False)
 		time.sleep(0.5)
 
+
 	TESTQUEUE.put(b'ENDTEST')
 	printW('Test finished.', sender=SENDER, announce=False)
 
diff --git a/rsudp/raspberryshake.py b/rsudp/raspberryshake.py
index af19b46..fc887ae 100644
--- a/rsudp/raspberryshake.py
+++ b/rsudp/raspberryshake.py
@@ -7,7 +7,7 @@
 import signal
 from obspy import UTCDateTime
 from obspy.core.stream import Stream
-from obspy import read_inventory
+from obspy import read_inventory, read
 from obspy.geodetics.flinnengdahl import FlinnEngdahl
 from obspy.core.trace import Trace
 from rsudp import printM, printW, printE
diff --git a/rsudp/rs_sounds/doorbell.wav b/rsudp/rs_sounds/doorbell.wav
new file mode 100644
index 0000000..765084d
Binary files /dev/null and b/rsudp/rs_sounds/doorbell.wav differ


Test patch:
diff --git a/docs/_sources/test.rst.txt b/docs/_sources/test.rst.txt
index 4bc6650..a90f102 100644
--- a/docs/_sources/test.rst.txt
+++ b/docs/_sources/test.rst.txt
@@ -29,6 +29,10 @@ and their initial state:
         # core
         'c_data':               ['receiving data              ', False],
         'c_processing':         ['processing data             ', False],
+        'c_miniseed':           ['miniSEED data exists        ', False],
+        'c_img':                ['screenshot exists           ', False],
+        'c_tweet':              ['Telegram module             ', False],
+        'c_telegram':           ['Twitter module              ', False],
         'c_ALARM':              ['ALARM message               ', False],
         'c_RESET':              ['RESET message               ', False],
         'c_IMGPATH':            ['IMGPATH message             ', False],
diff --git a/docs/c_testing.html b/docs/c_testing.html
index ad4fcdc..282dae0 100644
--- a/docs/c_testing.html
+++ b/docs/c_testing.html
@@ -237,7 +237,7 @@
 <code class="docutils literal notranslate"><span class="pre">TERM</span></code>, <code class="docutils literal notranslate"><span class="pre">ALARM</span></code>, <code class="docutils literal notranslate"><span class="pre">RESET</span></code>, and <code class="docutils literal notranslate"><span class="pre">IMGPATH</span></code>.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.9)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p>
+<dd class="field-odd"><p><strong>q</strong> (<a class="reference external" href="https://docs.python.org/3/library/queue.html#queue.Queue" title="(in Python v3.10)"><em>queue.Queue</em></a>) – queue of data and messages sent by <a class="reference internal" href="c_consumer.html#rsudp.c_consumer.Consumer" title="rsudp.c_consumer.Consumer"><code class="xref py py-class docutils literal notranslate"><span class="pre">rsudp.c_consumer.Consumer</span></code></a></p>
 </dd>
 </dl>
 <dl class="py method">
diff --git a/docs/test.html b/docs/test.html
index 6562f31..cfcaa64 100644
--- a/docs/test.html
+++ b/docs/test.html
@@ -235,6 +235,10 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
     <span class="c1"># core</span>
     <span class="s1">&#39;c_data&#39;</span><span class="p">:</span>               <span class="p">[</span><span class="s1">&#39;receiving data              &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
     <span class="s1">&#39;c_processing&#39;</span><span class="p">:</span>         <span class="p">[</span><span class="s1">&#39;processing data             &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
+    <span class="s1">&#39;c_miniseed&#39;</span><span class="p">:</span>           <span class="p">[</span><span class="s1">&#39;miniSEED data exists        &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
+    <span class="s1">&#39;c_img&#39;</span><span class="p">:</span>                <span class="p">[</span><span class="s1">&#39;screenshot exists           &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
+    <span class="s1">&#39;c_tweet&#39;</span><span class="p">:</span>              <span class="p">[</span><span class="s1">&#39;Telegram module             &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
+    <span class="s1">&#39;c_telegram&#39;</span><span class="p">:</span>           <span class="p">[</span><span class="s1">&#39;Twitter module              &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
     <span class="s1">&#39;c_ALARM&#39;</span><span class="p">:</span>              <span class="p">[</span><span class="s1">&#39;ALARM message               &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
     <span class="s1">&#39;c_RESET&#39;</span><span class="p">:</span>              <span class="p">[</span><span class="s1">&#39;RESET message               &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
     <span class="s1">&#39;c_IMGPATH&#39;</span><span class="p">:</span>            <span class="p">[</span><span class="s1">&#39;IMGPATH message             &#39;</span><span class="p">,</span> <span class="kc">False</span><span class="p">],</span>
@@ -262,13 +266,13 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>settings</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.9)"><em>dict</em></a>) – the dictionary of settings for program execution</p></li>
-<li><p><strong>plot</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to plot (<code class="docutils literal notranslate"><span class="pre">False</span></code> == no plot)</p></li>
-<li><p><strong>quiet</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not to play sounds (<code class="docutils literal notranslate"><span class="pre">True</span></code> == no sound)</p></li>
+<li><p><strong>settings</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.10)"><em>dict</em></a>) – the dictionary of settings for program execution</p></li>
+<li><p><strong>plot</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to plot (<code class="docutils literal notranslate"><span class="pre">False</span></code> == no plot)</p></li>
+<li><p><strong>quiet</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not to play sounds (<code class="docutils literal notranslate"><span class="pre">True</span></code> == no sound)</p></li>
 </ul>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.9)">dict</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.10)">dict</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>settings dictionary to test with</p>
@@ -282,10 +286,10 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
 <dd><p>Test write permissions in the data directory (<code class="docutils literal notranslate"><span class="pre">./data</span></code> by default)</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>testdir</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – The directory to test permissions for</p>
+<dd class="field-odd"><p><strong>testdir</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – The directory to test permissions for</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>the output of <a class="reference internal" href="#rsudp.test.permissions" title="rsudp.test.permissions"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.test.permissions()</span></code></a></p>
@@ -299,10 +303,10 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
 <dd><p>Test for an internet connection.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>hostname</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – The hostname to test with</p>
+<dd class="field-odd"><p><strong>hostname</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – The hostname to test with</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p><code class="docutils literal notranslate"><span class="pre">True</span></code> if connection is successful, <code class="docutils literal notranslate"><span class="pre">False</span></code> otherwise</p>
@@ -316,10 +320,10 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
 <dd><p>Test write permissions in the log directory (<code class="docutils literal notranslate"><span class="pre">/tmp/rsudp</span></code> by default)</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>logdir</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – The log directory to test permissions for</p>
+<dd class="field-odd"><p><strong>logdir</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – The log directory to test permissions for</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>the output of <a class="reference internal" href="#rsudp.test.permissions" title="rsudp.test.permissions"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.test.permissions()</span></code></a></p>
@@ -373,6 +377,18 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
 <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">settings['plot']['eq_screenshots']</span></code></p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p></td>
 </tr>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">settings['write']['enabled']</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">settings['write']['channels']</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">['all']</span></code></p></td>
+</tr>
+<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">settings['tweets']['enabled']</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p></td>
+</tr>
+<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">settings['telegram']['enabled']</span></code></p></td>
+<td><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p></td>
+</tr>
 <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">settings['alertsound']['enabled']</span></code></p></td>
 <td><p><code class="docutils literal notranslate"><span class="pre">True</span></code></p></td>
 </tr>
@@ -394,12 +410,12 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
 <dd class="field-odd"><ul class="simple">
-<li><p><strong>settings</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.9)"><em>dict</em></a>) – settings dictionary (will be modified from <a class="reference internal" href="settings.html#defaults"><span class="std std-ref">Default settings</span></a>)</p></li>
-<li><p><strong>inet</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)"><em>bool</em></a>) – whether or not the internet test passed</p></li>
+<li><p><strong>settings</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.10)"><em>dict</em></a>) – settings dictionary (will be modified from <a class="reference internal" href="settings.html#defaults"><span class="std std-ref">Default settings</span></a>)</p></li>
+<li><p><strong>inet</strong> (<a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)"><em>bool</em></a>) – whether or not the internet test passed</p></li>
 </ul>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.9)">dict</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#dict" title="(in Python v3.10)">dict</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>settings dictionary to test with</p>
@@ -413,10 +429,10 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
 <dd><p>Test write permissions for the specified directory.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>dp</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – the directory path to test permissions for</p>
+<dd class="field-odd"><p><strong>dp</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – the directory path to test permissions for</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>if <code class="docutils literal notranslate"><span class="pre">True</span></code>, the test was successful, <code class="docutils literal notranslate"><span class="pre">False</span></code> otherwise</p>
@@ -430,10 +446,10 @@ <h1><a class="reference internal" href="#module-rsudp.test" title="rsudp.test"><
 <dd><p>Test write permissions in the screenshots directory (<code class="docutils literal notranslate"><span class="pre">./screenshots</span></code> by default)</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
-<dd class="field-odd"><p><strong>testdir</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.9)"><em>str</em></a>) – The directory to test permissions for</p>
+<dd class="field-odd"><p><strong>testdir</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.10)"><em>str</em></a>) – The directory to test permissions for</p>
 </dd>
 <dt class="field-even">Return type</dt>
-<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.9)">bool</a></p>
+<dd class="field-even"><p><a class="reference external" href="https://docs.python.org/3/library/functions.html#bool" title="(in Python v3.10)">bool</a></p>
 </dd>
 <dt class="field-odd">Returns</dt>
 <dd class="field-odd"><p>the output of <a class="reference internal" href="#rsudp.test.permissions" title="rsudp.test.permissions"><code class="xref py py-func docutils literal notranslate"><span class="pre">rsudp.test.permissions()</span></code></a></p>
diff --git a/docsrc/test.rst b/docsrc/test.rst
index 4bc6650..a90f102 100644
--- a/docsrc/test.rst
+++ b/docsrc/test.rst
@@ -29,6 +29,10 @@ and their initial state:
         # core
         'c_data':               ['receiving data              ', False],
         'c_processing':         ['processing data             ', False],
+        'c_miniseed':           ['miniSEED data exists        ', False],
+        'c_img':                ['screenshot exists           ', False],
+        'c_tweet':              ['Telegram module             ', False],
+        'c_telegram':           ['Twitter module              ', False],
         'c_ALARM':              ['ALARM message               ', False],
         'c_RESET':              ['RESET message               ', False],
         'c_IMGPATH':            ['IMGPATH message             ', False],
diff --git a/rsudp/c_testing.py b/rsudp/c_testing.py
index cdeacfd..7b1f3d8 100644
--- a/rsudp/c_testing.py
+++ b/rsudp/c_testing.py
@@ -2,8 +2,11 @@
 from rsudp.raspberryshake import ConsumerThread
 import rsudp.raspberryshake as rs
 from rsudp import printM, printW, helpers
+from rsudp import ms_path
 import rsudp.test as t
 
+IMGPATH = False
+
 class Testing(rs.ConsumerThread):
 	'''
 	.. versionadded:: 0.4.3
@@ -93,6 +96,7 @@ def _messagetests(self, d):
 		:param bytes d: a data packet from the queue
 
 		'''
+		global IMGPATH
 		if 'TERM' in str(d):
 			printM('Got TERM message...', sender=self.sender)
 			t.TEST['c_TERM'][1] = True
@@ -114,9 +118,16 @@ def _messagetests(self, d):
 			printM('Got IMGPATH message with time %s' % (
 				   helpers.fsec(helpers.get_msg_time(d))
 				   ), sender=self.sender)
-			printM('and path %s' % (helpers.get_msg_path(d)), sender=self.sender)
+			IMGPATH = helpers.get_msg_path(d)
+			printM('and path %s' % (IMGPATH), sender=self.sender)
 			t.TEST['c_IMGPATH'][1] = True
 
+	def _img_test(self):
+		if t.TEST['c_img']:
+			t.TEST['c_img'][1] = os.path.exists(IMGPATH)
+			dn, fn = os.path.dirname(IMGPATH), os.path.basename(IMGPATH)
+			os.replace(IMGPATH, os.path.join(dn, 'test.' + fn))
+
 
 	def run(self):
 		'''
@@ -131,5 +142,7 @@ def run(self):
 		while self.alive:
 			self._getd()
 
+		self._img_test()
+
 		printW('Exiting.', sender=self.sender, announce=False)
 		sys.exit()
diff --git a/rsudp/test.py b/rsudp/test.py
index 005d4de..2ae9ae5 100644
--- a/rsudp/test.py
+++ b/rsudp/test.py
@@ -28,6 +28,10 @@
 	# core
 	'c_data':				['receiving data              ', False],
 	'c_processing':			['processing data             ', False],
+	'c_miniseed':			['miniSEED data exists        ', False],
+	'c_img':				['screenshot exists           ', False],
+	'c_tweet':				['Telegram module             ', False],
+	'c_telegram':			['Twitter module              ', False],
 	'c_ALARM':				['ALARM message               ', False],
 	'c_RESET':				['RESET message               ', False],
 	'c_IMGPATH':			['IMGPATH message             ', False],
@@ -60,6 +64,10 @@ def make_test_settings(settings, inet=False):
 	 ``settings['plot']['deconvolve']``       ``True``
 	 ``settings['plot']['units']``            ``'CHAN'``
 	 ``settings['plot']['eq_screenshots']``   ``True``
+	 ``settings['write']['enabled']``         ``True``
+	 ``settings['write']['channels']``        ``['all']``
+	 ``settings['tweets']['enabled']``        ``True``
+	 ``settings['telegram']['enabled']``      ``True``
 	 ``settings['alertsound']['enabled']``    ``True``
 	 ``settings['rsam']['enabled']``          ``True``
 	 ``settings['rsam']['debug']``            ``True``
@@ -97,6 +105,12 @@ def make_test_settings(settings, inet=False):
 	settings['plot']['units'] = 'CHAN'
 	settings['plot']['eq_screenshots'] = True
 
+	settings['write']['enabled'] = True
+	settings['write']['channels'] = ['all']
+
+	settings['telegram']['enabled'] = True
+	settings['tweets']['enabled'] = True
+
 	settings['alertsound']['enabled'] = True
 
 	settings['rsam']['enabled'] = True
@@ -129,6 +143,7 @@ def cancel_tests(settings, MPL, plot, quiet):
 		settings['plot']['enabled'] = False
 		del TEST['d_matplotlib']
 		del TEST['c_IMGPATH']
+		del TEST['c_img']
 		printM('Plot is disabled')
 
 	if quiet: