Mercurial > code > home > repos > mqtt_metrics
comparison src/main.ts @ 1:3d7f2dc9beec
read 1 mqtt topic; dummy convert; route to debugging view
author | drewp@bigasterisk.com |
---|---|
date | Fri, 09 Aug 2024 16:59:06 -0700 |
parents | 0b5b4ede1bf5 |
children | 579df3a4e62d |
comparison
equal
deleted
inserted
replaced
0:0b5b4ede1bf5 | 1:3d7f2dc9beec |
---|---|
1 import { LitElement, TemplateResult, css, html } from "lit"; | 1 import { LitElement, PropertyValues, TemplateResult, css, html } from "lit"; |
2 import { customElement } from "lit/decorators.js"; | 2 import { customElement, property, state } from "lit/decorators.js"; |
3 | |
4 type ConversionEvent = { | |
5 message: { | |
6 t: number; | |
7 topic: string; | |
8 payload: string; | |
9 }; | |
10 metricEvent: { | |
11 name: string; | |
12 labels: { | |
13 labelName: string; | |
14 labelValue: string; | |
15 }[]; | |
16 value: string; | |
17 }; | |
18 }; | |
3 | 19 |
4 @customElement("mm-page") | 20 @customElement("mm-page") |
5 export class MmPage extends LitElement { | 21 export class MmPage extends LitElement { |
6 static styles = [ | 22 static styles = [ |
7 css` | 23 css` |
8 :host { | 24 :host { |
9 display: flex; | 25 display: flex; |
10 flex-direction: column; | 26 flex-direction: column; |
11 height: 100vh; | 27 min-height: 100vh; |
12 background: #121212; | 28 background: #121212; |
13 color: white; | 29 color: white; |
14 text-shadow: 0.6px 0.6px 0px #ffffff70; | 30 text-shadow: 0.6px 0.6px 0px #ffffff70; |
15 font-family: monospace; | 31 font-family: monospace; |
16 font-size: 135%; | 32 font-size: 135%; |
17 } | 33 } |
34 `, | |
35 ]; | |
36 @state() displayedMessages: ConversionEvent[] = []; | |
37 | |
38 protected firstUpdated(_changedProperties: PropertyValues): void { | |
39 super.firstUpdated(_changedProperties); | |
40 new EventSource("api/debugEvents").addEventListener("message", (ev) => { | |
41 this.displayedMessages.push(JSON.parse(ev.data)); | |
42 const maxShown = 20; | |
43 if (this.displayedMessages.length > maxShown) { | |
44 this.displayedMessages = this.displayedMessages.slice(-maxShown); | |
45 } | |
46 this.requestUpdate(); | |
47 }); | |
48 } | |
49 | |
50 render() { | |
51 return html` | |
52 <h1>Mqtt metrics</h1> | |
53 | |
54 ${this.displayedMessages.map((ev) => html`<mm-conversion-event .ev=${ev}></mm-conversion-event>`)} | |
55 <p><a href="metrics">metrics</a> |</p> | |
56 <bigast-loginbar></bigast-loginbar> | |
57 `; | |
58 } | |
59 } | |
60 | |
61 @customElement("mm-conversion-event") | |
62 export class MmConversionEvent extends LitElement { | |
63 static styles = [ | |
64 css` | |
18 div.message { | 65 div.message { |
19 color: #888; | 66 color: #888; |
67 margin-bottom: 1em; | |
20 } | 68 } |
21 .msgKey { | 69 .msgKey { |
22 color: #006699; | 70 color: #006699; |
23 padding-left: 14px; | 71 padding-left: 1em; |
24 } | 72 } |
25 .msgValue { | 73 .msgValue { |
26 color: #ff4500; | 74 color: #ff4500; |
27 } | 75 } |
28 .metricName { | 76 .metricName { |
37 .metricValue { | 85 .metricValue { |
38 color: #4169e1; | 86 color: #4169e1; |
39 } | 87 } |
40 `, | 88 `, |
41 ]; | 89 ]; |
90 @property() ev?: ConversionEvent; | |
42 render() { | 91 render() { |
43 return html` | 92 if (!this.ev) return html``; |
44 <h1>Mqtt metrics</h1> | 93 const ev = this.ev; |
94 const t = new Date(ev.message.t * 1000); | |
95 return html`<div class="message"> | |
96 <div> | |
97 Incoming mqtt message: | |
98 <span class="msgKey">t</span>=<span class="msgValue"> ${t.toLocaleString("sv")} </span> <span class="msgKey">topic</span>=<span class="msgValue" | |
99 >${ev.message.topic}</span | |
100 > | |
101 <span class="msgKey">message</span>=<span class="msgValue">${ev.message.payload}</span> | |
102 </div> | |
103 <div> | |
104 Converted to metric: | |
105 <span class="metricName">${ev.metricEvent.name}</span> | |
45 | 106 |
46 <div class="message"> | 107 {${ev.metricEvent.labels.map( |
47 <div> | 108 (l, i) => html` |
48 Incoming mqtt message: <span class="msgKey">t</span>=<span class="msgValue">${"2024-08-09 14:43:28"}</span> <span class="msgKey">topic</span>=<span | 109 <span class="metricLabelName">${l.labelName}</span>=<span class="metricLabelValue">${l.labelValue}</span> |
49 class="msgValue" | 110 |
50 >${"tr-air-quality/sensor/particulate_matter__10_0__m_concentration/state"}</span | 111 ${i < ev.metricEvent.labels.length - 1 ? "," : "}"} |
51 > | 112 ` |
52 <span class="msgKey">message</span>=<span class="msgValue">${"12"}</span> | 113 )} |
53 </div> | 114 value=<span class="metricValue">${ev.metricEvent.value}</span> |
54 <div> | |
55 Converted to metrics event: | |
56 <span class="metricName">pm_concentration</span> | |
57 { | |
58 <span class="metricLabelName">location</span>="<span class="metricLabelValue">rr</span>", <span class="metricLabelName">size</span>="<span | |
59 class="metricLabelValue" | |
60 >10</span | |
61 >" } value=<span class="metricValue">12</span> | |
62 </div> | |
63 </div> | 115 </div> |
64 | 116 </div>`; |
65 <p> | |
66 <a href="metrics">metrics</a> | | |
67 </p> | |
68 <bigast-loginbar></bigast-loginbar> | |
69 `; | |
70 } | 117 } |
71 } | 118 } |