# HG changeset patch # User drewp@bigasterisk.com # Date 1717721566 25200 # Node ID 719c8cc4d8b26dda86737a66b0166de4e065dcf5 # Parent 20d1fa4250c0137ff6024c26bd9bb6eba63450ab electricity report diff -r 20d1fa4250c0 -r 719c8cc4d8b2 src/FdElectricity.ts --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/FdElectricity.ts Thu Jun 06 17:52:46 2024 -0700 @@ -0,0 +1,111 @@ +import { LitElement, PropertyValues, css, html } from "lit"; +import { customElement, property } from "lit/decorators.js"; +import { shared } from "./shared"; + + +@customElement("fd-electricity") +export class FdElectricity extends LitElement { + static styles = [ + shared, + css` + :host { + font-size: 14px; + } + + :host > table { + margin-top: 10px; + } + th { + text-align: left; + } + td { + text-align: right; + } + tr.total td, + tr.total th { + border-top: 1px solid white; + } + .bar { + background: yellow; + display: inline-block; + height: 10px; + } + .total .bar { + background: pink; + } + `, + ]; + @property() seriesData: Map = new Map(); + constructor() { + super(); + this.load(); + setInterval(this.load.bind(this), 10 * 1000); + } + async load() { + this.seriesData = new Map(); + const base = "https://bigasterisk.com/m/vmselect/select/0/prometheus/api/v1/query"; + const now = Date.now() / 1000 - 10; + const seriesUrls = [ + { url: base + `?query=powermeter_w&time=${now}&step=725ms`, label: "powermeter" }, + { url: base + `?query=(sum%20by%20%20(s)%20(house_power_w))%20-%20(sum%20by(s)%20(powermeter_w))&time=${now}&step=725ms`, label: "unmetered" }, + { url: base + `?query=house_power_w&time=${now}&step=725ms`, label: "total" }, + ]; + + for (const series of seriesUrls) { + const response = await fetch(series.url); + const data = await response.json(); + for (let row of data.data.result) { + this.seriesData.set(series.label + (row.metric.sensor ? "-" + row.metric.sensor : ""), parseFloat(row.value[1])); + } + } + this.update(new Map() as PropertyValues); + } + render() { + const disp = (n: number | undefined) => (n ? `${n.toFixed(1)}` : ""); + const pxPerWatt = 150 / this.seriesData.get("total")!; + const bar = (n: number | undefined) => (n ? html`
` : ""); + return html`

Electricity

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
(unmetered)${disp(this.seriesData.get("unmetered"))}${bar(this.seriesData.get("unmetered"))}
dash${disp(this.seriesData.get("powermeter-do_r"))}${bar(this.seriesData.get("powermeter-do_r"))}
washer${disp(this.seriesData.get("powermeter-ga_washer"))}${bar(this.seriesData.get("powermeter-ga_washer"))}
fridge${disp(this.seriesData.get("powermeter-ki_fridge"))}${bar(this.seriesData.get("powermeter-ki_fridge"))}
server closet${disp(this.seriesData.get("powermeter-st_wall"))}${bar(this.seriesData.get("powermeter-st_wall"))}
theater console${disp(this.seriesData.get("powermeter-tt_console"))}${bar(this.seriesData.get("powermeter-tt_console"))}
workshop desk${disp(this.seriesData.get("powermeter-ws_desk"))}${bar(this.seriesData.get("powermeter-ws_desk"))}
Total${this.seriesData.get("total")} W${bar(this.seriesData.get("total"))}
`; + } +} diff -r 20d1fa4250c0 -r 719c8cc4d8b2 src/index.html --- a/src/index.html Thu Jun 06 17:52:28 2024 -0700 +++ b/src/index.html Thu Jun 06 17:52:46 2024 -0700 @@ -13,6 +13,7 @@
+