forked from ChelseaKR/olive-bark-logger
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreport.html
More file actions
112 lines (100 loc) · 21.7 KB
/
Copy pathreport.html
File metadata and controls
112 lines (100 loc) · 21.7 KB
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Olive's Bark Logger — Noise Report</title>
<style>:root { color-scheme: light dark; }
body { font: 16px/1.5 system-ui, sans-serif; margin: 0; color: #111; background: #fff; }
.skip { position: absolute; left: -999px; }
.skip:focus { left: 8px; top: 8px; position: fixed; background: #fff; padding: 8px; }
main { max-width: 60rem; margin: 0 auto; padding: 1.5rem; }
h1 { font-size: 1.6rem; } h2 { font-size: 1.25rem; margin-top: 2rem; }
dl.stats { display: grid; grid-template-columns: max-content 1fr; gap: .25rem 1rem; }
dl.stats dt { font-weight: 600; }
figure.chart { margin: 1rem 0; border: 1px solid #ccc; padding: 1rem; }
figure.chart figcaption { font-weight: 600; margin-bottom: .5rem; }
table { border-collapse: collapse; margin-top: .75rem; width: 100%; }
caption { text-align: left; font-style: italic; margin-bottom: .25rem; }
th, td { border: 1px solid #bbb; padding: .25rem .5rem; text-align: left; }
.note { background: #f3f3f3; border-left: 4px solid #3b6ea5; padding: .75rem 1rem; }
section.cover { border: 1px solid #bbb; padding: .5rem 1.25rem 1rem; margin: 1rem 0; background: #fafafa; }
section.cover ul { margin: .25rem 0; }
.banner { padding: .75rem 1rem; margin: 1rem 0; border: 2px solid #b35900; background: #fff4e5; }
.banner.banner-ok { border-color: #2f6f3e; background: #eef7ef; }
:focus-visible { outline: 3px solid #3b6ea5; outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) { * { animation: none !important; transition: none !important; } }
@media print {
body { color: #000; background: #fff; }
.skip { display: none; }
.banner { border: 2px solid #000; }
section.cover, figure.chart, table { break-inside: avoid; page-break-inside: avoid; }
main { max-width: none; }
}</style>
</head>
<body>
<a class="skip" href="#main">Skip to report</a>
<main id="main">
<h1>Olive's Bark Logger — Noise Report</h1>
<p>Generated 2026-01-01 12:00 UTC. This report summarizes sound-level <em>events</em> —
when sound crossed a threshold and for how long. No audio was recorded, stored, or
transmitted to produce it.</p>
<section class="cover" aria-label="What this report can and cannot prove">
<h2>What this can and cannot prove</h2>
<p><strong>What it can show:</strong></p>
<ul><li>When sound at this device crossed a set loudness threshold, and for how long, with timestamps — an honest, time-stamped record of the pattern.</li><li>How that pattern lines up with a quiet-hours window you configure.</li></ul>
<p><strong>What it cannot prove:</strong></p>
<ul><li>What made a sound, or who caused it — no audio is recorded, so there is no source attribution.</li><li>Absolute loudness in dB SPL or dB(A): uncalibrated readings are relative dBFS, not the units an ordinance, lease, or HOA rule is written in.</li><li>That any law, lease, or rule was broken — only the relevant authority decides that, and being within quiet hours is not the same as a violation.</li><li>Anything about a place this device was not in — readings are specific to this microphone in this spot, and change if it moves.</li></ul>
<p class="note">By design no audio is ever recorded, stored, or transmitted, so there is nothing to leak, subpoena, or misuse. This is general information, not legal advice; verify your local rule before relying on these numbers.</p>
</section>
<aside class="banner" role="note" aria-label="Calibration status">
<strong>Uncalibrated — these readings are relative, not dB(A).</strong> Levels are relative dBFS, not absolute sound level in dB(A) or dB SPL. Do not read them as the decibel numbers an ordinance or lease specifies; only their pattern relative to each other on this device is meaningful. Run <code>olive-calibrate</code> against a reference meter to estimate SPL (still an estimate, not a Class 1/2 sound-level-meter reading).
</aside>
<h2>Summary</h2>
<dl class="stats"><dt>Total events</dt><dd>4</dd><dt>Total loud time</dt><dd>22 s</dd><dt>Longest event</dt><dd>9 s</dd><dt>Loudest peak</dt><dd>-5.0 dBFS</dd><dt>Mean peak</dt><dd>-11.2 dBFS</dd><dt>Events during quiet hours (22:00–08:00)</dt><dd>3</dd><dt>Loud time during quiet hours (pro-rated)</dt><dd>19 s</dd><dt>Loud time during quiet hours (start-attributed)</dt><dd>19 s</dd></dl>
<h2>Measurement conditions</h2>
<p>Measurement conditions for this report were not recorded (events predate session tracking).</p>
<p class="note">No clock anomalies detected during the measurement window.</p>
<h2>Distributions</h2>
<figure class="chart"><figcaption>Events by hour of day</figcaption><svg viewBox="0 0 776 200" width="776" height="200" role="img" aria-label="Events by hour of day. 24 bars. Maximum 2 events." xmlns="http://www.w3.org/2000/svg"><line x1="8" y1="172" x2="776" y2="172" stroke="#444" stroke-width="1"/><rect x="8" y="172" width="24" height="0" fill="#3b6ea5"><title>00: 0 events</title></rect><text x="20" y="188" font-size="9" text-anchor="middle" fill="#444">00</text><rect x="40" y="172" width="24" height="0" fill="#3b6ea5"><title>01: 0 events</title></rect><text x="52" y="188" font-size="9" text-anchor="middle" fill="#444">01</text><rect x="72" y="92" width="24" height="80" fill="#3b6ea5"><title>02: 1 events</title></rect><text x="84" y="188" font-size="9" text-anchor="middle" fill="#444">02</text><rect x="104" y="172" width="24" height="0" fill="#3b6ea5"><title>03: 0 events</title></rect><text x="116" y="188" font-size="9" text-anchor="middle" fill="#444">03</text><rect x="136" y="172" width="24" height="0" fill="#3b6ea5"><title>04: 0 events</title></rect><text x="148" y="188" font-size="9" text-anchor="middle" fill="#444">04</text><rect x="168" y="172" width="24" height="0" fill="#3b6ea5"><title>05: 0 events</title></rect><text x="180" y="188" font-size="9" text-anchor="middle" fill="#444">05</text><rect x="200" y="172" width="24" height="0" fill="#3b6ea5"><title>06: 0 events</title></rect><text x="212" y="188" font-size="9" text-anchor="middle" fill="#444">06</text><rect x="232" y="172" width="24" height="0" fill="#3b6ea5"><title>07: 0 events</title></rect><text x="244" y="188" font-size="9" text-anchor="middle" fill="#444">07</text><rect x="264" y="172" width="24" height="0" fill="#3b6ea5"><title>08: 0 events</title></rect><text x="276" y="188" font-size="9" text-anchor="middle" fill="#444">08</text><rect x="296" y="172" width="24" height="0" fill="#3b6ea5"><title>09: 0 events</title></rect><text x="308" y="188" font-size="9" text-anchor="middle" fill="#444">09</text><rect x="328" y="172" width="24" height="0" fill="#3b6ea5"><title>10: 0 events</title></rect><text x="340" y="188" font-size="9" text-anchor="middle" fill="#444">10</text><rect x="360" y="172" width="24" height="0" fill="#3b6ea5"><title>11: 0 events</title></rect><text x="372" y="188" font-size="9" text-anchor="middle" fill="#444">11</text><rect x="392" y="172" width="24" height="0" fill="#3b6ea5"><title>12: 0 events</title></rect><text x="404" y="188" font-size="9" text-anchor="middle" fill="#444">12</text><rect x="424" y="172" width="24" height="0" fill="#3b6ea5"><title>13: 0 events</title></rect><text x="436" y="188" font-size="9" text-anchor="middle" fill="#444">13</text><rect x="456" y="92" width="24" height="80" fill="#3b6ea5"><title>14: 1 events</title></rect><text x="468" y="188" font-size="9" text-anchor="middle" fill="#444">14</text><rect x="488" y="172" width="24" height="0" fill="#3b6ea5"><title>15: 0 events</title></rect><text x="500" y="188" font-size="9" text-anchor="middle" fill="#444">15</text><rect x="520" y="172" width="24" height="0" fill="#3b6ea5"><title>16: 0 events</title></rect><text x="532" y="188" font-size="9" text-anchor="middle" fill="#444">16</text><rect x="552" y="172" width="24" height="0" fill="#3b6ea5"><title>17: 0 events</title></rect><text x="564" y="188" font-size="9" text-anchor="middle" fill="#444">17</text><rect x="584" y="172" width="24" height="0" fill="#3b6ea5"><title>18: 0 events</title></rect><text x="596" y="188" font-size="9" text-anchor="middle" fill="#444">18</text><rect x="616" y="172" width="24" height="0" fill="#3b6ea5"><title>19: 0 events</title></rect><text x="628" y="188" font-size="9" text-anchor="middle" fill="#444">19</text><rect x="648" y="172" width="24" height="0" fill="#3b6ea5"><title>20: 0 events</title></rect><text x="660" y="188" font-size="9" text-anchor="middle" fill="#444">20</text><rect x="680" y="172" width="24" height="0" fill="#3b6ea5"><title>21: 0 events</title></rect><text x="692" y="188" font-size="9" text-anchor="middle" fill="#444">21</text><rect x="712" y="172" width="24" height="0" fill="#3b6ea5"><title>22: 0 events</title></rect><text x="724" y="188" font-size="9" text-anchor="middle" fill="#444">22</text><rect x="744" y="12" width="24" height="160" fill="#3b6ea5"><title>23: 2 events</title></rect><text x="756" y="188" font-size="9" text-anchor="middle" fill="#444">23</text></svg><table id="by-hour-table"><caption>Events by hour of day — data table</caption><thead><tr><th scope="col">Bucket</th><th scope="col">events</th></tr></thead><tbody><tr><th scope="row">00</th><td>0</td></tr><tr><th scope="row">01</th><td>0</td></tr><tr><th scope="row">02</th><td>1</td></tr><tr><th scope="row">03</th><td>0</td></tr><tr><th scope="row">04</th><td>0</td></tr><tr><th scope="row">05</th><td>0</td></tr><tr><th scope="row">06</th><td>0</td></tr><tr><th scope="row">07</th><td>0</td></tr><tr><th scope="row">08</th><td>0</td></tr><tr><th scope="row">09</th><td>0</td></tr><tr><th scope="row">10</th><td>0</td></tr><tr><th scope="row">11</th><td>0</td></tr><tr><th scope="row">12</th><td>0</td></tr><tr><th scope="row">13</th><td>0</td></tr><tr><th scope="row">14</th><td>1</td></tr><tr><th scope="row">15</th><td>0</td></tr><tr><th scope="row">16</th><td>0</td></tr><tr><th scope="row">17</th><td>0</td></tr><tr><th scope="row">18</th><td>0</td></tr><tr><th scope="row">19</th><td>0</td></tr><tr><th scope="row">20</th><td>0</td></tr><tr><th scope="row">21</th><td>0</td></tr><tr><th scope="row">22</th><td>0</td></tr><tr><th scope="row">23</th><td>2</td></tr></tbody></table></figure>
<figure class="chart"><figcaption>Events by day</figcaption><svg viewBox="0 0 40 200" width="40" height="200" role="img" aria-label="Events by day. 1 bars. Maximum 4 events." xmlns="http://www.w3.org/2000/svg"><line x1="8" y1="172" x2="40" y2="172" stroke="#444" stroke-width="1"/><rect x="8" y="12" width="24" height="160" fill="#3b6ea5"><title>2026-01-01: 4 events</title></rect><text x="20" y="188" font-size="9" text-anchor="middle" fill="#444">2026-01-01</text></svg><table id="by-day-table"><caption>Events by day — data table</caption><thead><tr><th scope="col">Bucket</th><th scope="col">events</th></tr></thead><tbody><tr><th scope="row">2026-01-01</th><td>4</td></tr></tbody></table></figure>
<h2>Calendar heatmap</h2>
<p>Each cell is the number of sound-level events that began in that hour, by day and hour of day. Every calendar day in the reporting window has a row, including days with no events, so a quiet day is visible as a quiet day rather than missing. Darker cells saw more events; the count is printed in every non-empty cell and repeated in the data table below, so the pattern does not depend on color. These are event counts only — never audio.</p>
<figure class="chart"><figcaption>Events by day and hour</figcaption><svg viewBox="0 0 624 36" width="624" height="36" role="img" aria-label="Events by day and hour. 1 days by 24 hours. Maximum 2 events in a single hour. Busiest: 2026-01-01 23:00 with 2 events." xmlns="http://www.w3.org/2000/svg"><text x="107" y="12" font-size="8" text-anchor="middle" fill="#444">00</text><text x="129" y="12" font-size="8" text-anchor="middle" fill="#444">01</text><text x="151" y="12" font-size="8" text-anchor="middle" fill="#444">02</text><text x="173" y="12" font-size="8" text-anchor="middle" fill="#444">03</text><text x="195" y="12" font-size="8" text-anchor="middle" fill="#444">04</text><text x="217" y="12" font-size="8" text-anchor="middle" fill="#444">05</text><text x="239" y="12" font-size="8" text-anchor="middle" fill="#444">06</text><text x="261" y="12" font-size="8" text-anchor="middle" fill="#444">07</text><text x="283" y="12" font-size="8" text-anchor="middle" fill="#444">08</text><text x="305" y="12" font-size="8" text-anchor="middle" fill="#444">09</text><text x="327" y="12" font-size="8" text-anchor="middle" fill="#444">10</text><text x="349" y="12" font-size="8" text-anchor="middle" fill="#444">11</text><text x="371" y="12" font-size="8" text-anchor="middle" fill="#444">12</text><text x="393" y="12" font-size="8" text-anchor="middle" fill="#444">13</text><text x="415" y="12" font-size="8" text-anchor="middle" fill="#444">14</text><text x="437" y="12" font-size="8" text-anchor="middle" fill="#444">15</text><text x="459" y="12" font-size="8" text-anchor="middle" fill="#444">16</text><text x="481" y="12" font-size="8" text-anchor="middle" fill="#444">17</text><text x="503" y="12" font-size="8" text-anchor="middle" fill="#444">18</text><text x="525" y="12" font-size="8" text-anchor="middle" fill="#444">19</text><text x="547" y="12" font-size="8" text-anchor="middle" fill="#444">20</text><text x="569" y="12" font-size="8" text-anchor="middle" fill="#444">21</text><text x="591" y="12" font-size="8" text-anchor="middle" fill="#444">22</text><text x="613" y="12" font-size="8" text-anchor="middle" fill="#444">23</text><text x="0" y="31" font-size="9" fill="#444">2026-01-01</text><rect x="96" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 00:00 — 0 events</title></rect><rect x="118" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 01:00 — 0 events</title></rect><rect x="140" y="18" width="22" height="18" fill="#9db6d2" stroke="#fff" stroke-width="1"><title>2026-01-01 02:00 — 1 events</title></rect><text x="151" y="31" font-size="9" text-anchor="middle" fill="#111" stroke="#fff" stroke-width="2" stroke-linejoin="round" paint-order="stroke">1</text><rect x="162" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 03:00 — 0 events</title></rect><rect x="184" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 04:00 — 0 events</title></rect><rect x="206" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 05:00 — 0 events</title></rect><rect x="228" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 06:00 — 0 events</title></rect><rect x="250" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 07:00 — 0 events</title></rect><rect x="272" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 08:00 — 0 events</title></rect><rect x="294" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 09:00 — 0 events</title></rect><rect x="316" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 10:00 — 0 events</title></rect><rect x="338" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 11:00 — 0 events</title></rect><rect x="360" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 12:00 — 0 events</title></rect><rect x="382" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 13:00 — 0 events</title></rect><rect x="404" y="18" width="22" height="18" fill="#9db6d2" stroke="#fff" stroke-width="1"><title>2026-01-01 14:00 — 1 events</title></rect><text x="415" y="31" font-size="9" text-anchor="middle" fill="#111" stroke="#fff" stroke-width="2" stroke-linejoin="round" paint-order="stroke">1</text><rect x="426" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 15:00 — 0 events</title></rect><rect x="448" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 16:00 — 0 events</title></rect><rect x="470" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 17:00 — 0 events</title></rect><rect x="492" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 18:00 — 0 events</title></rect><rect x="514" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 19:00 — 0 events</title></rect><rect x="536" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 20:00 — 0 events</title></rect><rect x="558" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 21:00 — 0 events</title></rect><rect x="580" y="18" width="22" height="18" fill="#f5f5f5" stroke="#fff" stroke-width="1"><title>2026-01-01 22:00 — 0 events</title></rect><rect x="602" y="18" width="22" height="18" fill="#3b6ea5" stroke="#fff" stroke-width="1"><title>2026-01-01 23:00 — 2 events</title></rect><text x="613" y="31" font-size="9" text-anchor="middle" fill="#111" stroke="#fff" stroke-width="2" stroke-linejoin="round" paint-order="stroke">2</text></svg><table id="calendar-table"><caption>Events by day and hour — data table (events per hour)</caption><thead><tr><th scope="col">Day</th><th scope="col">00</th><th scope="col">01</th><th scope="col">02</th><th scope="col">03</th><th scope="col">04</th><th scope="col">05</th><th scope="col">06</th><th scope="col">07</th><th scope="col">08</th><th scope="col">09</th><th scope="col">10</th><th scope="col">11</th><th scope="col">12</th><th scope="col">13</th><th scope="col">14</th><th scope="col">15</th><th scope="col">16</th><th scope="col">17</th><th scope="col">18</th><th scope="col">19</th><th scope="col">20</th><th scope="col">21</th><th scope="col">22</th><th scope="col">23</th><th scope="col">Total</th></tr></thead><tbody><tr><th scope="row">2026-01-01</th><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>2</td><td>4</td></tr></tbody></table></figure>
<h2>Quiet hours</h2>
<p>Quiet-hours window: <strong>22:00–08:00</strong> in time zone
<strong>UTC</strong> (daylight-saving aware). Of 4
total events, <strong>3</strong> started within quiet hours,
and <strong>19 s</strong> of loud time fell
inside the window
(vs. 19 s if counted whole by
start time). Event counts are attributed by start time, since a count cannot be split; loud
seconds are pro-rated across the quiet-window boundary, so an event that begins before the
window and ends inside it contributes only the seconds actually within quiet hours.</p>
<h2>Quiet-hours duration rollup</h2>
<p>Detected loud time within the quiet-hours window, totaled per day and attributed by each event's start time. Some ordinances and CC&Rs key on accumulated duration in a day — figures of around <strong>30 minutes continuous</strong> or <strong>60 minutes intermittent</strong> are sometimes cited — but the threshold, the unit, and the definition vary by jurisdiction.</p>
<div class="note"><p>This is a measurement, not a determination. Being within quiet hours is not the same as a violation, and only the relevant authority can decide whether a rule was broken. Compare these durations against your own local ordinance, lease, or HOA rule.</p></div>
<table><caption>Loud time within quiet hours, per day</caption><thead><tr><th scope="col">Day</th><th scope="col">Loud time within quiet hours</th></tr></thead><tbody><tr><th scope="row">2026-01-01</th><td>19 s</td></tr></tbody></table>
<h2>Why there is deliberately no audio</h2>
<div class="note"><p>This device measures sound levels only — it never records, stores, or transmits any audio. That is a deliberate privacy choice, not missing data: each level reading is computed in memory and immediately discarded, so no speech and nothing intelligible is ever kept. There is no recording of anyone in this home or next door that could be leaked, subpoenaed, or misused. Recording a household or a neighbor can also raise consent and eavesdropping concerns under some recording laws; measuring levels only sidesteps that by never capturing content. (General information, not legal advice — check the rules where you live.)</p></div>
<h2>Methodology</h2>
<p>Each ~100 ms frame of audio is read
into memory, reduced to a single root-mean-square level in dBFS, and then discarded.
A noise event is recorded when the level stays at or above
<strong>-35 dBFS</strong> for at least
<strong>0.4 s</strong>; brief dips shorter than the
<strong>1.0 s</strong> debounce do not split one event into many.
For each event we store start time, duration, and peak and average level — six numbers,
no audio. No calibration offset is applied (Uncalibrated: levels are relative dBFS, not absolute SPL.).</p>
<p class="note">How much of this reporting window the device actually monitored could not be determined from this record (no capture session, no recorded gap, and no measurable span of events). Do not read the counts above as covering the whole window.</p>
<h2>Limitations</h2>
<div class="note">
<p>Levels are measured in dBFS, which is relative to digital full scale, not absolute sound pressure level (SPL) in dB. Without calibration against a reference meter, treat the numbers as relative, not absolute.</p>
<p>This tool measures sound levels only. It cannot prove what made a sound or where it came from; it does not record or identify any voice or source.</p>
<p>Microphone placement and room acoustics affect every reading; an event count
reflects this device in this spot, not an absolute fact about the building. These
numbers are offered to inform, not to manufacture a case.</p>
</div>
</main>
</body>
</html>