Compare commits

..

3 Commits

Author SHA1 Message Date
278d30c421 Store strong references to async tasks
Reason: https://news.t0.vc/IEUC
2023-02-12 18:38:36 +00:00
f01eeacbce Use UTC time instead of timestamp 2023-01-12 18:32:20 +00:00
af87378fd3 idk 2022-01-10 07:57:41 +00:00
3 changed files with 90 additions and 87 deletions

View File

@@ -47,3 +47,8 @@ p {
margin: 0.25em; margin: 0.25em;
} }
.recharts-wrapper p {
color: initial;
font-size: initial;
}

View File

@@ -6,11 +6,12 @@ import './App.css';
function App() { function App() {
const [data, setData] = useState(false); const [data, setData] = useState(false);
const [history, setHistory] = useState(false);
useEffect(() => { useEffect(() => {
const get = async() => { const get = async() => {
try { try {
const res = await axios.get('https://reg.t0.vc/solar.json'); const res = await axios.get('https://solar-api.dns.t0.vc/data');
setData(res.data); setData(res.data);
} catch (error) { } catch (error) {
setData(false); setData(false);
@@ -18,45 +19,47 @@ function App() {
}; };
get(); get();
const interval = setInterval(get, 1000); const interval = setInterval(get, 30000);
return () => clearInterval(interval); return () => clearInterval(interval);
}, []); }, []);
const listen = () => { useEffect(() => {
var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); const get = async() => {
var myArrayBuffer = audioCtx.createBuffer(2, audioCtx.sampleRate * 5, audioCtx.sampleRate); try {
for (var channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) { const date = moment().format('YYYY-MM-DD');
var nowBuffering = myArrayBuffer.getChannelData(channel); const res = await axios.get('https://solar-api.dns.t0.vc/history/'+date);
for (var i = 0; i < myArrayBuffer.length; i++) { setHistory(res.data);
nowBuffering[i] = data.history[i % data.history.length].total / 24000.0; } catch (error) {
} setHistory(false);
}
var source = audioCtx.createBufferSource();
source.buffer = myArrayBuffer;
source.connect(audioCtx.destination);
source.start();
} }
};
get();
const interval = setInterval(get, 30000);
return () => clearInterval(interval);
}, []);
return ( return (
<div> <div>
{data ? {history ?
<div>
<ResponsiveContainer width='100%' height={300}> <ResponsiveContainer width='100%' height={300}>
<LineChart data={data.history}> <LineChart data={history}>
<XAxis <XAxis
dataKey='time' dataKey='time'
minTickGap={10} minTickGap={10}
tickFormatter={timeStr => moment.utc(timeStr).format('HH:mm')} tickFormatter={timeStr => moment(timeStr).format('HH:mm')}
/>
<YAxis
domain={[0, 6000]}
/> />
<YAxis />
<CartesianGrid strokeDasharray='3 3'/> <CartesianGrid strokeDasharray='3 3'/>
<Tooltip <Tooltip
labelFormatter={timeStr => 'Time: ' + moment.utc(timeStr).format('HH:mm')} labelFormatter={timeStr => 'Time: ' + moment(timeStr).format('HH:mm')}
/> />
<Line <Line
type='monotone' type='monotone'
dataKey='total' dataKey='actual_total'
name='Watts' name='Watts'
stroke='#ff5900' stroke='#ff5900'
strokeWidth={2} strokeWidth={2}
@@ -65,14 +68,11 @@ function App() {
/> />
</LineChart> </LineChart>
</ResponsiveContainer> </ResponsiveContainer>
<button onClick={listen}>Listen</button>
{data.night ?
<div className='container'>
<p>The sun has set 😴</p>
</div>
: :
<p>Loading...</p>
}
{data ?
<div className='container'> <div className='container'>
<p>Total: {data.actual_total} W {parseInt(data.actual_total / 5985 * 100)}%</p> <p>Total: {data.actual_total} W {parseInt(data.actual_total / 5985 * 100)}%</p>
@@ -108,8 +108,6 @@ function App() {
)} )}
</div> </div>
</div> </div>
}
</div>
: :
<p>Loading...</p> <p>Loading...</p>
} }

View File

@@ -7,13 +7,13 @@ logging.getLogger('aiohttp').setLevel(logging.DEBUG if os.environ.get('DEBUG') e
import asyncio import asyncio
from aiohttp import web from aiohttp import web
from datetime import datetime, timedelta from datetime import datetime, timedelta, timezone
import pytz import pytz
from APSystemsECUR import APSystemsECUR from APSystemsECUR import APSystemsECUR
ECU_IP = '192.168.69.153' ECU_IP = '192.168.69.153'
LISTEN_IP = '192.168.69.100' LISTEN_IP = '192.168.69.106'
ecu = APSystemsECUR(ECU_IP) ecu = APSystemsECUR(ECU_IP)
app = web.Application() app = web.Application()
prev_ecu_timestamp = None prev_ecu_timestamp = None
@@ -60,7 +60,7 @@ async def get_data():
if data['timestamp'] != prev_ecu_timestamp: if data['timestamp'] != prev_ecu_timestamp:
total = 0 total = 0
timestamp = datetime.utcnow() utctime = datetime.now(timezone.utc)
for i in data['inverters'].values(): for i in data['inverters'].values():
total += i['power'][0] total += i['power'][0]
@@ -73,7 +73,7 @@ async def get_data():
points = [] points = []
for i in data['inverters'].values(): for i in data['inverters'].values():
points.append({ points.append({
'time': timestamp, 'time': utctime,
'measurement': 'inverter', 'measurement': 'inverter',
'tags': {'ecu': data['ecu_id'], 'inverter': i['uid']}, 'tags': {'ecu': data['ecu_id'], 'inverter': i['uid']},
'fields': { 'fields': {
@@ -85,7 +85,7 @@ async def get_data():
}) })
points.append({ points.append({
'time': timestamp, 'time': utctime,
'measurement': 'panel', 'measurement': 'panel',
'tags': {'ecu': data['ecu_id'], 'inverter': i['uid'], 'channel': '0'}, 'tags': {'ecu': data['ecu_id'], 'inverter': i['uid'], 'channel': '0'},
'fields': { 'fields': {
@@ -96,7 +96,7 @@ async def get_data():
}) })
points.append({ points.append({
'time': timestamp, 'time': utctime,
'measurement': 'panel', 'measurement': 'panel',
'tags': {'ecu': data['ecu_id'], 'inverter': i['uid'], 'channel': '1'}, 'tags': {'ecu': data['ecu_id'], 'inverter': i['uid'], 'channel': '1'},
'fields': { 'fields': {
@@ -107,7 +107,7 @@ async def get_data():
}) })
points.append({ points.append({
'time': timestamp, 'time': utctime,
'measurement': 'ecu', 'measurement': 'ecu',
'tags': {'ecu': data['ecu_id']}, 'tags': {'ecu': data['ecu_id']},
'fields': { 'fields': {
@@ -165,6 +165,6 @@ if __name__ == '__main__':
app.router.add_get('/history/{date}', history) app.router.add_get('/history/{date}', history)
loop = asyncio.get_event_loop() loop = asyncio.get_event_loop()
loop.create_task(run_proxies()) a = loop.create_task(run_proxies())
loop.create_task(get_data()) b = loop.create_task(get_data())
web.run_app(app, port=6901) web.run_app(app, port=6901)