New final

This commit is contained in:
Milan Toman
2021-01-20 15:03:50 +01:00
parent 7f7b593450
commit 58b74300cb
19 changed files with 2203 additions and 0 deletions

4
doc/build/.buildinfo vendored Normal file
View File

@@ -0,0 +1,4 @@
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: a84e020f225cc7ba65e040666d94782f
tags: 645f666f9bcd5a90fca523b33c5a78b7

BIN
doc/build/.doctrees/db_structure.doctree vendored Normal file

Binary file not shown.

BIN
doc/build/.doctrees/environment.pickle vendored Normal file

Binary file not shown.

BIN
doc/build/.doctrees/examples.doctree vendored Normal file

Binary file not shown.

BIN
doc/build/.doctrees/index.doctree vendored Normal file

Binary file not shown.

BIN
doc/build/.doctrees/introduction.doctree vendored Normal file

Binary file not shown.

0
doc/build/.nojekyll vendored Normal file
View File

244
doc/build/_sources/db_structure.rst.txt vendored Normal file
View File

@@ -0,0 +1,244 @@
Structure of InfluxDB
=====================
influxDB SCHEMA:
DB weather
measure wind
----------------
value | speed or direction or windgust
---------------------------------------
field tag
measure temphumi
----------------
temperature | humidity | external, internal | pressure
---------------------------------------------------------
field field tag field
measure rain
----------------
rain | rate / total / intensity | restart if zero, was it 65535 => before?
---------------------------------------------
field tag field(int)
DB status
ISS measure
----------------
voltage | solar or capacitor | state / lqi / | battery or future_shit |
----------------------------------------------------------------
field tag field tag
RasPI system
----------------
usage | disk, mem, cpu, eth, wifi %
------------------------------------
field | tag
SQLite SCHEMA:
DB status
TABLE raspi
----------------
t_stamp | usage | host | type
-----------------------------------------------
INT | INT | VARCHAR(50) | VARCHAR(20)
CREATE TABLE raspi(
t_stamp INT,
usage INT,
host VARCHAR(50),
type VARCHAR(20));
TABLE network
----------------
t_stamp | count | type | nic | host
------------------------------------------------------------
INT | INT | VARCHAR(20) | VARCHAR(20) | VARCHAR(50)
CREATE TABLE network(
t_stamp INT,
count INT,
type VARCHAR(20),
nic VARCHAR(20),
host VARCHAR(50));
TABLE vantage_vue_iss
----------------------
t_stamp | voltage | type | lqi | rssi | batt_low
------------------------------------------------------------------
INT | INT | VARCHAR(20) | TINYINT | TINYINT | BOOL
-------------------------------------------------------------------------------
ENERGY
-------------------------------------------------------------------------------
CREATE CONTINUOUS QUERY cq_power_1m on voltage BEGIN
SELECT max(power) AS p_max, min(power) AS p_min,
mean(power) as power, mean(voltage) AS voltage
INTO voltage.monthly.mppt_aggregated
FROM voltage.realtime.mppt
GROUP BY time(1m),type
END
CREATE CONTINUOUS QUERY "cq_power_1h" ON "voltage" BEGIN
SELECT max("power") AS p_max,min(power) AS p_min,
mean(power) as power, mean(voltage) AS voltage
INTO "yearly"."mppt_aggregated"
FROM realtime.mppt
GROUP BY time(1h), type
END
CREATE CONTINUOUS QUERY "cq_power_6h" ON "voltage" BEGIN
SELECT max("power") AS p_max,min(power) AS p_min,
mean(power) as power, mean(voltage) AS voltage
INTO "infinite"."mppt_aggregated"
FROM realtime.mppt
GROUP BY time(6h), type
END
drop continuous query cq_power_30m on voltage
show retention policies on weather_v2
create retention policy realtime on weather_v2 duration 168h replication 1 shard duration 1h
create retention policy monthly on weather_v2 duration 720h replication 1 shard duration 24h
create retention policy yearly on weather_v2 duration 8760h replication 1 shard duration 168h
create retention policy infinite on weather_v2 duration 0s replication 1 shard duration 720h
select time,value into realtime.rain from autogen.rain where time > now()-1w group by *
select time,humidity,pressure,temperature into realtime.temphumi from autogen.temphumi where time > now()-1w group by *
select time,humidity,temperature into realtime.usense from autogen.usense where time > now()-1w group by *
select time,value into realtime.wind from autogen.wind where time > now()-1w group by *
alter retention policy realtime on weather_v2 default
-------------------------------------------------------------------------------
WIND - DONE
-------------------------------------------------------------------------------
CREATE CONTINUOUS QUERY "cq_rain_10m" ON "weather_v2" BEGIN
SELECT max("rainrate") AS rrate_max, mean(rainrate) AS rrate, max(rain_bucket_tips) AS rain_tips
INTO "monthly"."rainrate_aggregated"
FROM realtime.rain
GROUP BY time(10m)
END
CREATE CONTINUOUS QUERY "cq_rain_1h" ON "weather_v2" BEGIN
SELECT max("rainrate") AS rrate_max, mean(rainrate) AS rrate, max(rain_bucket_tips) AS rain_tips
INTO "yealy"."rainrate_aggregated"
FROM realtime.rain
GROUP BY time(10m)
END
-------------------------------------------------------------------------------
RAIN - DONE
-------------------------------------------------------------------------------
CREATE CONTINUOUS QUERY "cq_rain_10m" ON "weather_v2" BEGIN
SELECT max("value") AS val_max, mean(value) AS value
INTO "monthly"."rainrate_aggregated"
FROM realtime.rain
GROUP BY type,time(10m)
END
CREATE CONTINUOUS QUERY "cq_rain_1h" ON "weather_v2" BEGIN
SELECT max("value") AS val_max, mean(value) AS value
INTO "yearly"."rainrate_aggregated"
FROM realtime.rain
GROUP BY type,time(1h)
END
CREATE CONTINUOUS QUERY "cq_rain_6h" ON "weather_v2" BEGIN
SELECT max("value") AS val_max, mean(value) AS value
INTO "infinite"."rainrate_aggregated"
FROM realtime.rain
GROUP BY type,time(6h)
END
-------------------------------------------------------------------------------
TEMPHUMI - DONE
-------------------------------------------------------------------------------
CREATE CONTINUOUS QUERY "cq_temphumi_10m" ON "weather_v2" BEGIN
SELECT
max("humidity") AS humidity_max,
min("humidity") AS humidity_min,
mean("humidity") AS humidity,
max("temperature") AS temperature_max,
min("temperature") AS temperature_min,
mean("temperature") AS temperature
INTO "monthly"."temphumi_aggregated"
FROM realtime.temphumi
GROUP BY type, time(10m)
END
CREATE CONTINUOUS QUERY "cq_temphumi_1h" ON "weather_v2" BEGIN
SELECT
max("humidity") AS humidity_max,
min("humidity") AS humidity_min,
mean("humidity") AS humidity,
max("temperature") AS temperature_max,
min("temperature") AS temperature_min,
mean("temperature") AS temperature
INTO "yearly"."temphumi_aggregated"
FROM realtime.temphumi
GROUP BY type, time(1h)
END
CREATE CONTINUOUS QUERY "cq_temphumi_6h" ON "weather_v2" BEGIN
SELECT
max("humidity") AS humidity_max,
min("humidity") AS humidity_min,
mean("humidity") AS humidity,
max("temperature") AS temperature_max,
min("temperature") AS temperature_min,
mean("temperature") AS temperature
INTO "infinite"."temphumi_aggregated"
FROM realtime.temphumi
GROUP BY type, time(6h)
END
-------------------------------------------------------------------------------
USENSE - DONE
-------------------------------------------------------------------------------
CREATE CONTINUOUS QUERY "cq_usense_6h" ON "weather_v2" BEGIN
SELECT mean("battery") AS battery, mean(humidity) AS humidity, mean(temperature) AS temperature
INTO "yearly"."usense_aggregated"
FROM realtime.usense
GROUP BY type,time(6h)
END
CREATE CONTINUOUS QUERY "cq_usense_12h" ON "weather_v2" BEGIN
SELECT mean("battery") AS battery, mean(humidity) AS humidity, mean(temperature) AS temperature
INTO "infinite"."usense_aggregated"
FROM realtime.usense
GROUP BY type,time(12h)
END
-------------------------------------------------------------------------------
WIND
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
STATUS
-------------------------------------------------------------------------------
POLICIES
--------
create retention policy realtime on status duration 168h replication 1 shard duration 1h
create retention policy monthly on status duration 720h replication 1 shard duration 24h
create retention policy yearly on status duration 8760h replication 1 shard duration 168h
create retention policy infinite on status duration 0s replication 1 shard duration 720h
select time,usage into realtime.RasPI_aggregated from autogen.RasPI where time > now()-1w group by *
select time,voltage into realtime.iss_aggregated from autogen.iss where time > now()-1w group by *
--
SELECT NON_NEGATIVE_DERIVATIVE(max(*)) as traffic INTO "monthly"."net_aggregated" FROM autogen.net WHERE time > now()-2w GROUP BY time(30s)
CQ
--
CREATE CONTINUOUS QUERY "cq_net_1m" ON "status" BEGIN
SELECT NON_NEGATIVE_DERIVATIVE(max(*)) as traffic
INTO "monthly"."net_aggregated"
FROM realtime.net
WHERE time > now()-1m
GROUP BY time(30s)
END
alter retention policy realtime on status default

31
doc/build/_sources/examples.rst.txt vendored Normal file
View File

@@ -0,0 +1,31 @@
.. Plutonium reporter documentation master file, created by
sphinx-quickstart on Wed Apr 3 15:53:15 2019.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
==============================================
!
==============================================
.. toctree::
:maxdepth: 3
:caption: Contents:
Dynamic data
=====================
.. automodule:: modules.dynamic
:members:
Dynamic Weather
================
.. autoclass:: modules.dynamic.DynamicWeather
:members:
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

95
doc/build/_sources/index.rst.txt vendored Normal file
View File

@@ -0,0 +1,95 @@
.. Plutonium reporter documentation master file, created by
sphinx-quickstart on Wed Apr 3 15:53:15 2019.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
==============================================
DOC: Plutonium reporter
==============================================
.. toctree::
:maxdepth: 3
:caption: Contents:
introduction
Scope
=====
This document covers the **software part** of the reporter, although it consists
of a multitude of hw technologies, please keep that in mind.
Purpose
========
Delivering aggregated and comprehensive representation of data-value pairs
in such a way, that even a complete idiot can read them. *This project is
created by AND for me.*
In short, this application spins up a web server and on its address plots and
displays values gathered from various sources.
An example granted: https://bastart.spoton.cz
Sources
--------
The sources for feeding the **Plutonium** include:
- Davis Vantage vue weather station (with a couple HW mods)
- Victron MPPT solar converter (Utilizing the Victron Direct RS232 protocol)
- CPU, MEM, DISK, (W)LAN statistics, plotted
- Custom ESP8266 data loggers
- Temp / Humidity + battery logging
- Current monitoring for LED lighting
Discrepancies and hardware dependencies
---------------------------------------
Obviously, all the monitoring cannot be done without proper HW equipment.
Although this server is primarily aimed at use on a Raspberry PI, it can be
installed on an old notebook, or similar, as the platform is Python3 and thus
independent of the OS.
RasPI statistics
++++++++++++++++
- Just the RasPI, should work out of the box
Davis Vantage Vue
+++++++++++++++++
- Obviously the Davis Vantage Vue weather station
- The CC1101 / wireless version
- arduino mini / Uno @ 3.3V
- CC1101 receiver with a couple other components
- Data structure received from davis:
2 = Supercap voltage (Vue only)
3 = ?
4 = UV Index
5 = Rain rate
6 = Solar radiation
7 = Solar Cell output (Vue only)
8 = Temperature
9 = Wind gust
a = Humidity
e = Rain
{'nxt': 64, 'P0': 1020.43, 'lqi': 6, 'b2': 3, 'P': 969.29, 'h': 144, 'Ti': 24.49,
'cnt': 1, 'Hhtu': 28.68, 'b4': 129, 'b5': 247, 'b6': 36, 'b7': 255, 'b0': 1, 'b1': 10,
'hop': 0, 'b3': 225, 'Thtu': 24.28, 'b8': 255, 'b9': 182, 'rssi': 45}
Solar / MPPT
++++++++++++
- Victron MPPT solar charge controller (Bluesolar)
- RS232 -> USB or similar, to get the data to RasPi
ESP8266 stuff
+++++++++++++
- basically anything that can feed into the influxDB.
Indices and tables
===================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

134
doc/build/_sources/introduction.rst.txt vendored Normal file
View File

@@ -0,0 +1,134 @@
.. Plutonium reporter documentation master file, created by
sphinx-quickstart on Wed Apr 3 15:53:15 2019.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Introduction to Plutonium
+++++++++++++++++++++++++
.. toctree::
:maxdepth: 5
:caption: Contents:
Directory structure
===================
Following structure is applied to this project. Some directories are
minified in this view on purpose.
::
.
├── chttpd.py
├── config
│   └── plutonium.ini
├── config.py
├── doc ... (documentation in sphinx)
├── index.py
├── localdeploy.sh
├── modules
│   ├── dynamic.py
│   ├── status.py
│   ├── temphumi.py
│   ├── voltage.py
│   └── weather.py
├── static
│   ├── css
│   │   ├── bootstrap.css
│   │   └── dygraph.css ...
│   ├── img
│   │   ├── battery_0.png ...
│   └── js
│   ├── solar_graph.js
│   ├── status_graph.js
│   ├── temphum_graph.js
│   └── weather_graph.js ...
├── templates
│   ├── footer.html
│   ├── header.html
│   ├── landing_page.html
│   ├── status_admin.html
│   ├── temphumi_admin.html
│   ├── top_menu.html
│   ├── voltage_admin.html
│   └── weather_admin.html
└── TODO.txt
CherryPy configuration (config.py)
==================================
Configuration is stored in a separate file statically, so each submodule can
load the same configuration. This should be variables, that are project-wide.
CherryPy configuration file (plutonium.ini)
-------------------------------------------
Configuration file, .ini style. Option = value. File resides in ./config
directory. It is read by confi.py and parsed into a dict(), available
throughout the project.
::
_server_protocol = https
_server_name = bastart.spoton.cz
_server_port = 80
_server_bind_ip = 0.0.0.0
_influx_host = localhost
_influx_port = 8086
_influx_user = pi
_influx_pwd = password
_influx_weather_db = weather_v2
_influx_status_db = status
_influx_voltage_db = voltage
_influx_IoT_db = weather_v2
Configuration classes and functions
------------------------------------
.. automodule:: config
:members:
CherryPy server (chttpd.py)
===========================
The server uses CherryPy module. For more information, please consult the
Cherrypy documentation.
CHTTPD.py is also the executable, that can be launched as a standalone
application by simply typing ./chttpd.py, or python3 chttpd.py
.. automodule:: chttpd
:members:
Modules and web paths
---------------------
Modules are located in the `modules` directory, hence the imports from a
subdirectory
::
from modules import voltage
from modules import weather
from modules import dynamic
from modules import status
from modules import temphumi
As can be seen, each class / module is mounted under a specific web path. This
is the preferred way of future expansion modules.
::
cherrypy.tree.mount(voltage.EnergyInfo(), "/", conf)
cherrypy.tree.mount(voltage.EnergyInfo(), "/energy", conf)
cherrypy.tree.mount(weather.WeatherInfo(), "/weather", conf)
cherrypy.tree.mount(status.StatusInfo(), "/status", conf)
cherrypy.tree.mount(dynamic.Expose(), "/data", conf)
cherrypy.tree.mount(temphumi.PuerhInfo(), "/temphumi", conf)
Index (index.py)
================
Reserved for future use. Currently not displayed, as the EnergyInfo() class is
mounted under root(/) of the web, defined in chttpd.py
::
cherrypy.tree.mount(voltage.EnergyInfo(), "/", conf)
.. automodule:: index
:members:
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

438
doc/build/db_structure.html vendored Normal file
View File

@@ -0,0 +1,438 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Structure of InfluxDB &mdash; Plutonium reporter 1.0 documentation</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Plutonium reporter
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="introduction.html">Introduction to Plutonium</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Plutonium reporter</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Structure of InfluxDB</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/db_structure.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="structure-of-influxdb">
<h1>Structure of InfluxDB<a class="headerlink" href="#structure-of-influxdb" title="Permalink to this headline"></a></h1>
<blockquote>
<div><p>influxDB SCHEMA:</p>
<p>DB weather
measure wind
—————-</p>
<blockquote>
<div><p>field tag</p>
</div></blockquote>
<blockquote>
<div><p>field field tag field</p>
</div></blockquote>
<blockquote>
<div><p>field tag field(int)</p>
</div></blockquote>
<p>DB status</p>
<blockquote>
<div><p>field tag field tag</p>
</div></blockquote>
<blockquote>
<div><p>field | tag</p>
</div></blockquote>
<p>SQLite SCHEMA:</p>
<p>DB status</p>
<blockquote>
<div><p>INT | INT | VARCHAR(50) | VARCHAR(20)</p>
<blockquote>
<div><dl class="simple">
<dt>CREATE TABLE raspi(</dt><dd><p>t_stamp INT,
usage INT,
host VARCHAR(50),
type VARCHAR(20));</p>
</dd>
</dl>
</div></blockquote>
</div></blockquote>
<blockquote>
<div><p>INT | INT | VARCHAR(20) | VARCHAR(20) | VARCHAR(50)</p>
<blockquote>
<div><dl class="simple">
<dt>CREATE TABLE network(</dt><dd><p>t_stamp INT,
count INT,
type VARCHAR(20),
nic VARCHAR(20),
host VARCHAR(50));</p>
</dd>
</dl>
<p>TABLE vantage_vue_iss</p>
</div></blockquote>
</div></blockquote>
<blockquote>
<div><p>INT | INT | VARCHAR(20) | TINYINT | TINYINT | BOOL</p>
</div></blockquote>
</div></blockquote>
<div class="section" id="energy">
<h2>ENERGY<a class="headerlink" href="#energy" title="Permalink to this headline"></a></h2>
<dl>
<dt>CREATE CONTINUOUS QUERY cq_power_1m on voltage BEGIN</dt><dd><dl class="simple">
<dt>SELECT max(power) AS p_max, min(power) AS p_min,</dt><dd><p>mean(power) as power, mean(voltage) AS voltage</p>
</dd>
</dl>
<p>INTO voltage.monthly.mppt_aggregated
FROM voltage.realtime.mppt
GROUP BY time(1m),type</p>
</dd>
</dl>
<p>END
CREATE CONTINUOUS QUERY “cq_power_1h” ON “voltage” BEGIN</p>
<blockquote>
<div><dl class="simple">
<dt>SELECT max(“power”) AS p_max,min(power) AS p_min,</dt><dd><p>mean(power) as power, mean(voltage) AS voltage</p>
</dd>
</dl>
<p>INTO “yearly”.”mppt_aggregated”
FROM realtime.mppt
GROUP BY time(1h), type</p>
</div></blockquote>
<p>END
CREATE CONTINUOUS QUERY “cq_power_6h” ON “voltage” BEGIN</p>
<blockquote>
<div><dl class="simple">
<dt>SELECT max(“power”) AS p_max,min(power) AS p_min,</dt><dd><p>mean(power) as power, mean(voltage) AS voltage</p>
</dd>
</dl>
<p>INTO “infinite”.”mppt_aggregated”
FROM realtime.mppt
GROUP BY time(6h), type</p>
</div></blockquote>
<p>END</p>
<p>drop continuous query cq_power_30m on voltage
show retention policies on weather_v2</p>
<p>create retention policy realtime on weather_v2 duration 168h replication 1 shard duration 1h
create retention policy monthly on weather_v2 duration 720h replication 1 shard duration 24h
create retention policy yearly on weather_v2 duration 8760h replication 1 shard duration 168h
create retention policy infinite on weather_v2 duration 0s replication 1 shard duration 720h</p>
<p>select time,value into realtime.rain from autogen.rain where time &gt; now()-1w group by *
select time,humidity,pressure,temperature into realtime.temphumi from autogen.temphumi where time &gt; now()-1w group by *
select time,humidity,temperature into realtime.usense from autogen.usense where time &gt; now()-1w group by *
select time,value into realtime.wind from autogen.wind where time &gt; now()-1w group by *</p>
<p>alter retention policy realtime on weather_v2 default</p>
</div>
<div class="section" id="wind-done">
<h2>WIND - DONE<a class="headerlink" href="#wind-done" title="Permalink to this headline"></a></h2>
<dl class="simple">
<dt>CREATE CONTINUOUS QUERY “cq_rain_10m” ON “weather_v2” BEGIN</dt><dd><p>SELECT max(“rainrate”) AS rrate_max, mean(rainrate) AS rrate, max(rain_bucket_tips) AS rain_tips
INTO “monthly”.”rainrate_aggregated”
FROM realtime.rain
GROUP BY time(10m)</p>
</dd>
</dl>
<p>END
CREATE CONTINUOUS QUERY “cq_rain_1h” ON “weather_v2” BEGIN</p>
<blockquote>
<div><p>SELECT max(“rainrate”) AS rrate_max, mean(rainrate) AS rrate, max(rain_bucket_tips) AS rain_tips
INTO “yealy”.”rainrate_aggregated”
FROM realtime.rain
GROUP BY time(10m)</p>
</div></blockquote>
<p>END</p>
</div>
<div class="section" id="rain-done">
<h2>RAIN - DONE<a class="headerlink" href="#rain-done" title="Permalink to this headline"></a></h2>
<dl class="simple">
<dt>CREATE CONTINUOUS QUERY “cq_rain_10m” ON “weather_v2” BEGIN</dt><dd><p>SELECT max(“value”) AS val_max, mean(value) AS value
INTO “monthly”.”rainrate_aggregated”
FROM realtime.rain
GROUP BY type,time(10m)</p>
</dd>
</dl>
<p>END
CREATE CONTINUOUS QUERY “cq_rain_1h” ON “weather_v2” BEGIN</p>
<blockquote>
<div><p>SELECT max(“value”) AS val_max, mean(value) AS value
INTO “yearly”.”rainrate_aggregated”
FROM realtime.rain
GROUP BY type,time(1h)</p>
</div></blockquote>
<p>END
CREATE CONTINUOUS QUERY “cq_rain_6h” ON “weather_v2” BEGIN</p>
<blockquote>
<div><p>SELECT max(“value”) AS val_max, mean(value) AS value
INTO “infinite”.”rainrate_aggregated”
FROM realtime.rain
GROUP BY type,time(6h)</p>
</div></blockquote>
<div class="section" id="end">
<h3>END<a class="headerlink" href="#end" title="Permalink to this headline"></a></h3>
</div>
<div class="section" id="temphumi-done">
<h3>TEMPHUMI - DONE<a class="headerlink" href="#temphumi-done" title="Permalink to this headline"></a></h3>
<dl>
<dt>CREATE CONTINUOUS QUERY “cq_temphumi_10m” ON “weather_v2” BEGIN</dt><dd><dl class="simple">
<dt>SELECT</dt><dd><p>max(“humidity”) AS humidity_max,
min(“humidity”) AS humidity_min,
mean(“humidity”) AS humidity,
max(“temperature”) AS temperature_max,
min(“temperature”) AS temperature_min,
mean(“temperature”) AS temperature</p>
</dd>
</dl>
<p>INTO “monthly”.”temphumi_aggregated”
FROM realtime.temphumi
GROUP BY type, time(10m)</p>
</dd>
</dl>
<p>END</p>
<dl>
<dt>CREATE CONTINUOUS QUERY “cq_temphumi_1h” ON “weather_v2” BEGIN</dt><dd><dl class="simple">
<dt>SELECT</dt><dd><p>max(“humidity”) AS humidity_max,
min(“humidity”) AS humidity_min,
mean(“humidity”) AS humidity,
max(“temperature”) AS temperature_max,
min(“temperature”) AS temperature_min,
mean(“temperature”) AS temperature</p>
</dd>
</dl>
<p>INTO “yearly”.”temphumi_aggregated”
FROM realtime.temphumi
GROUP BY type, time(1h)</p>
</dd>
</dl>
<p>END</p>
<dl>
<dt>CREATE CONTINUOUS QUERY “cq_temphumi_6h” ON “weather_v2” BEGIN</dt><dd><dl class="simple">
<dt>SELECT</dt><dd><p>max(“humidity”) AS humidity_max,
min(“humidity”) AS humidity_min,
mean(“humidity”) AS humidity,
max(“temperature”) AS temperature_max,
min(“temperature”) AS temperature_min,
mean(“temperature”) AS temperature</p>
</dd>
</dl>
<p>INTO “infinite”.”temphumi_aggregated”
FROM realtime.temphumi
GROUP BY type, time(6h)</p>
</dd>
</dl>
<p>END</p>
</div>
</div>
<div class="section" id="usense-done">
<h2>USENSE - DONE<a class="headerlink" href="#usense-done" title="Permalink to this headline"></a></h2>
<dl class="simple">
<dt>CREATE CONTINUOUS QUERY “cq_usense_6h” ON “weather_v2” BEGIN</dt><dd><p>SELECT mean(“battery”) AS battery, mean(humidity) AS humidity, mean(temperature) AS temperature
INTO “yearly”.”usense_aggregated”
FROM realtime.usense
GROUP BY type,time(6h)</p>
</dd>
</dl>
<p>END</p>
<dl class="simple">
<dt>CREATE CONTINUOUS QUERY “cq_usense_12h” ON “weather_v2” BEGIN</dt><dd><p>SELECT mean(“battery”) AS battery, mean(humidity) AS humidity, mean(temperature) AS temperature
INTO “infinite”.”usense_aggregated”
FROM realtime.usense
GROUP BY type,time(12h)</p>
</dd>
</dl>
<p>END</p>
</div>
<div class="section" id="wind">
<h2>WIND<a class="headerlink" href="#wind" title="Permalink to this headline"></a></h2>
</div>
<div class="section" id="status">
<h2>STATUS<a class="headerlink" href="#status" title="Permalink to this headline"></a></h2>
<blockquote>
<div></div></blockquote>
<p>create retention policy realtime on status duration 168h replication 1 shard duration 1h
create retention policy monthly on status duration 720h replication 1 shard duration 24h
create retention policy yearly on status duration 8760h replication 1 shard duration 168h
create retention policy infinite on status duration 0s replication 1 shard duration 720h</p>
<p>select time,usage into realtime.RasPI_aggregated from autogen.RasPI where time &gt; now()-1w group by *
select time,voltage into realtime.iss_aggregated from autogen.iss where time &gt; now()-1w group by *</p>
<p>
SELECT NON_NEGATIVE_DERIVATIVE(max(*)) as traffic INTO “monthly”.”net_aggregated” FROM autogen.net WHERE time &gt; now()-2w GROUP BY time(30s)
CQ
CREATE CONTINUOUS QUERY “cq_net_1m” ON “status” BEGIN</p>
<blockquote>
<div><p>SELECT NON_NEGATIVE_DERIVATIVE(max(*)) as traffic
INTO “monthly”.”net_aggregated”
FROM realtime.net
WHERE time &gt; now()-1m
GROUP BY time(30s)</p>
</div></blockquote>
<p>END</p>
<p>alter retention policy realtime on status default</p>
</div>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, Milan &#39;Ventil&#39; Toman
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

206
doc/build/examples.html vendored Normal file
View File

@@ -0,0 +1,206 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dynamic data &mdash; Plutonium reporter 1.0 documentation</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Plutonium reporter
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="introduction.html">Introduction to Plutonium</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Plutonium reporter</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Dynamic data</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/examples.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<hr class="docutils" />
<div class="toctree-wrapper compound">
</div>
<div class="section" id="dynamic-data">
<h1>Dynamic data<a class="headerlink" href="#dynamic-data" title="Permalink to this headline"></a></h1>
</div>
<div class="section" id="dynamic-weather">
<h1>Dynamic Weather<a class="headerlink" href="#dynamic-weather" title="Permalink to this headline"></a></h1>
</div>
<div class="section" id="indices-and-tables">
<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h1>
<ul class="simple">
<li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li>
<li><p><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></p></li>
<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>
</ul>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, Milan &#39;Ventil&#39; Toman
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

194
doc/build/genindex.html vendored Normal file
View File

@@ -0,0 +1,194 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Index &mdash; Plutonium reporter 1.0 documentation</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="#" />
<link rel="search" title="Search" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Plutonium reporter
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="introduction.html">Introduction to Plutonium</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Plutonium reporter</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Index</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<h1 id="index">Index</h1>
<div class="genindex-jumpbox">
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, Milan &#39;Ventil&#39; Toman
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

311
doc/build/index.html vendored Normal file
View File

@@ -0,0 +1,311 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DOC: Plutonium reporter &mdash; Plutonium reporter 1.0 documentation</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Introduction to Plutonium" href="introduction.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="#" class="icon icon-home"> Plutonium reporter
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="introduction.html">Introduction to Plutonium</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="#">Plutonium reporter</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="#">Docs</a> &raquo;</li>
<li>DOC: Plutonium reporter</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/index.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="doc-plutonium-reporter">
<h1>DOC: Plutonium reporter<a class="headerlink" href="#doc-plutonium-reporter" title="Permalink to this headline"></a></h1>
<div class="toctree-wrapper compound">
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="introduction.html">Introduction to Plutonium</a><ul>
<li class="toctree-l2"><a class="reference internal" href="introduction.html#directory-structure">Directory structure</a></li>
<li class="toctree-l2"><a class="reference internal" href="introduction.html#cherrypy-configuration-config-py">CherryPy configuration (config.py)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="introduction.html#cherrypy-configuration-file-plutonium-ini">CherryPy configuration file (plutonium.ini)</a></li>
<li class="toctree-l3"><a class="reference internal" href="introduction.html#configuration-classes-and-functions">Configuration classes and functions</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="introduction.html#cherrypy-server-chttpd-py">CherryPy server (chttpd.py)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="introduction.html#modules-and-web-paths">Modules and web paths</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="introduction.html#index-index-py">Index (index.py)</a></li>
<li class="toctree-l2"><a class="reference internal" href="introduction.html#indices-and-tables">Indices and tables</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="scope">
<h2>Scope<a class="headerlink" href="#scope" title="Permalink to this headline"></a></h2>
<p>This document covers the <strong>software part</strong> of the reporter, although it consists
of a multitude of hw technologies, please keep that in mind.</p>
</div>
<div class="section" id="purpose">
<h2>Purpose<a class="headerlink" href="#purpose" title="Permalink to this headline"></a></h2>
<p>Delivering aggregated and comprehensive representation of data-value pairs
in such a way, that even a complete idiot can read them. <em>This project is
created by AND for me.</em></p>
<p>In short, this application spins up a web server and on its address plots and
displays values gathered from various sources.</p>
<p>An example granted: <a class="reference external" href="https://bastart.spoton.cz">https://bastart.spoton.cz</a></p>
<div class="section" id="sources">
<h3>Sources<a class="headerlink" href="#sources" title="Permalink to this headline"></a></h3>
<p>The sources for feeding the <strong>Plutonium</strong> include:</p>
<ul class="simple">
<li><p>Davis Vantage vue weather station (with a couple HW mods)</p></li>
<li><p>Victron MPPT solar converter (Utilizing the Victron Direct RS232 protocol)</p></li>
<li><p>CPU, MEM, DISK, (W)LAN statistics, plotted</p></li>
<li><dl class="simple">
<dt>Custom ESP8266 data loggers</dt><dd><ul>
<li><p>Temp / Humidity + battery logging</p></li>
<li><p>Current monitoring for LED lighting</p></li>
</ul>
</dd>
</dl>
</li>
</ul>
</div>
<div class="section" id="discrepancies-and-hardware-dependencies">
<h3>Discrepancies and hardware dependencies<a class="headerlink" href="#discrepancies-and-hardware-dependencies" title="Permalink to this headline"></a></h3>
<p>Obviously, all the monitoring cannot be done without proper HW equipment.
Although this server is primarily aimed at use on a Raspberry PI, it can be
installed on an old notebook, or similar, as the platform is Python3 and thus
independent of the OS.</p>
<div class="section" id="raspi-statistics">
<h4>RasPI statistics<a class="headerlink" href="#raspi-statistics" title="Permalink to this headline"></a></h4>
<ul class="simple">
<li><p>Just the RasPI, should work out of the box</p></li>
</ul>
</div>
<div class="section" id="davis-vantage-vue">
<h4>Davis Vantage Vue<a class="headerlink" href="#davis-vantage-vue" title="Permalink to this headline"></a></h4>
<ul>
<li><p>Obviously the Davis Vantage Vue weather station</p></li>
<li><p>The CC1101 / wireless version</p></li>
<li><p>arduino mini / Uno &#64; 3.3V</p></li>
<li><p>CC1101 receiver with a couple other components</p></li>
<li><p>Data structure received from davis:</p>
<blockquote>
<div><p>2 = Supercap voltage (Vue only)
3 = ?
4 = UV Index
5 = Rain rate
6 = Solar radiation
7 = Solar Cell output (Vue only)
8 = Temperature
9 = Wind gust
a = Humidity
e = Rain</p>
<p>{nxt: 64, P0: 1020.43, lqi: 6, b2: 3, P: 969.29, h: 144, Ti: 24.49,
cnt: 1, Hhtu: 28.68, b4: 129, b5: 247, b6: 36, b7: 255, b0: 1, b1: 10,
hop: 0, b3: 225, Thtu: 24.28, b8: 255, b9: 182, rssi: 45}</p>
</div></blockquote>
</li>
</ul>
</div>
<div class="section" id="solar-mppt">
<h4>Solar / MPPT<a class="headerlink" href="#solar-mppt" title="Permalink to this headline"></a></h4>
<ul class="simple">
<li><p>Victron MPPT solar charge controller (Bluesolar)</p></li>
<li><p>RS232 -&gt; USB or similar, to get the data to RasPi</p></li>
</ul>
</div>
<div class="section" id="esp8266-stuff">
<h4>ESP8266 stuff<a class="headerlink" href="#esp8266-stuff" title="Permalink to this headline"></a></h4>
<ul class="simple">
<li><p>basically anything that can feed into the influxDB.</p></li>
</ul>
</div>
</div>
</div>
<div class="section" id="indices-and-tables">
<h2>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li>
<li><p><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></p></li>
<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>
</ul>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="introduction.html" class="btn btn-neutral float-right" title="Introduction to Plutonium" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, Milan &#39;Ventil&#39; Toman
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

331
doc/build/introduction.html vendored Normal file
View File

@@ -0,0 +1,331 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Introduction to Plutonium &mdash; Plutonium reporter 1.0 documentation</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="prev" title="DOC: Plutonium reporter" href="index.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Plutonium reporter
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Introduction to Plutonium</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#directory-structure">Directory structure</a></li>
<li class="toctree-l2"><a class="reference internal" href="#cherrypy-configuration-config-py">CherryPy configuration (config.py)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#cherrypy-configuration-file-plutonium-ini">CherryPy configuration file (plutonium.ini)</a></li>
<li class="toctree-l3"><a class="reference internal" href="#configuration-classes-and-functions">Configuration classes and functions</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#cherrypy-server-chttpd-py">CherryPy server (chttpd.py)</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#modules-and-web-paths">Modules and web paths</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#index-index-py">Index (index.py)</a></li>
<li class="toctree-l2"><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Plutonium reporter</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Introduction to Plutonium</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/introduction.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="introduction-to-plutonium">
<h1>Introduction to Plutonium<a class="headerlink" href="#introduction-to-plutonium" title="Permalink to this headline"></a></h1>
<div class="toctree-wrapper compound">
</div>
<div class="section" id="directory-structure">
<h2>Directory structure<a class="headerlink" href="#directory-structure" title="Permalink to this headline"></a></h2>
<p>Following structure is applied to this project. Some directories are
minified in this view on purpose.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>.
├── chttpd.py
├── config
│   └── plutonium.ini
├── config.py
├── doc ... (documentation in sphinx)
├── index.py
├── localdeploy.sh
├── modules
│   ├── dynamic.py
│   ├── status.py
│   ├── temphumi.py
│   ├── voltage.py
│   └── weather.py
├── static
│   ├── css
│   │   ├── bootstrap.css
│   │   └── dygraph.css ...
│   ├── img
│   │   ├── battery_0.png ...
│   └── js
│   ├── solar_graph.js
│   ├── status_graph.js
│   ├── temphum_graph.js
│   └── weather_graph.js ...
├── templates
│   ├── footer.html
│   ├── header.html
│   ├── landing_page.html
│   ├── status_admin.html
│   ├── temphumi_admin.html
│   ├── top_menu.html
│   ├── voltage_admin.html
│   └── weather_admin.html
└── TODO.txt
</pre></div>
</div>
</div>
<div class="section" id="cherrypy-configuration-config-py">
<h2>CherryPy configuration (config.py)<a class="headerlink" href="#cherrypy-configuration-config-py" title="Permalink to this headline"></a></h2>
<p>Configuration is stored in a separate file statically, so each submodule can
load the same configuration. This should be variables, that are project-wide.</p>
<div class="section" id="cherrypy-configuration-file-plutonium-ini">
<h3>CherryPy configuration file (plutonium.ini)<a class="headerlink" href="#cherrypy-configuration-file-plutonium-ini" title="Permalink to this headline"></a></h3>
<p>Configuration file, .ini style. Option = value. File resides in ./config
directory. It is read by confi.py and parsed into a dict(), available
throughout the project.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">_server_protocol</span> <span class="o">=</span> <span class="n">https</span>
<span class="n">_server_name</span> <span class="o">=</span> <span class="n">bastart</span><span class="o">.</span><span class="n">spoton</span><span class="o">.</span><span class="n">cz</span>
<span class="n">_server_port</span> <span class="o">=</span> <span class="mi">80</span>
<span class="n">_server_bind_ip</span> <span class="o">=</span> <span class="mf">0.0</span><span class="o">.</span><span class="mf">0.0</span>
<span class="n">_influx_host</span> <span class="o">=</span> <span class="n">localhost</span>
<span class="n">_influx_port</span> <span class="o">=</span> <span class="mi">8086</span>
<span class="n">_influx_user</span> <span class="o">=</span> <span class="n">pi</span>
<span class="n">_influx_pwd</span> <span class="o">=</span> <span class="n">password</span>
<span class="n">_influx_weather_db</span> <span class="o">=</span> <span class="n">weather_v2</span>
<span class="n">_influx_status_db</span> <span class="o">=</span> <span class="n">status</span>
<span class="n">_influx_voltage_db</span> <span class="o">=</span> <span class="n">voltage</span>
<span class="n">_influx_IoT_db</span> <span class="o">=</span> <span class="n">weather_v2</span>
</pre></div>
</div>
</div>
<div class="section" id="configuration-classes-and-functions">
<h3>Configuration classes and functions<a class="headerlink" href="#configuration-classes-and-functions" title="Permalink to this headline"></a></h3>
</div>
</div>
<div class="section" id="cherrypy-server-chttpd-py">
<h2>CherryPy server (chttpd.py)<a class="headerlink" href="#cherrypy-server-chttpd-py" title="Permalink to this headline"></a></h2>
<p>The server uses CherryPy module. For more information, please consult the
Cherrypy documentation.</p>
<p>CHTTPD.py is also the executable, that can be launched as a standalone
application by simply typing ./chttpd.py, or python3 chttpd.py</p>
<div class="section" id="modules-and-web-paths">
<h3>Modules and web paths<a class="headerlink" href="#modules-and-web-paths" title="Permalink to this headline"></a></h3>
<p>Modules are located in the <cite>modules</cite> directory, hence the imports from a
subdirectory</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">modules</span> <span class="k">import</span> <span class="n">voltage</span>
<span class="kn">from</span> <span class="nn">modules</span> <span class="k">import</span> <span class="n">weather</span>
<span class="kn">from</span> <span class="nn">modules</span> <span class="k">import</span> <span class="n">dynamic</span>
<span class="kn">from</span> <span class="nn">modules</span> <span class="k">import</span> <span class="n">status</span>
<span class="kn">from</span> <span class="nn">modules</span> <span class="k">import</span> <span class="n">temphumi</span>
</pre></div>
</div>
<p>As can be seen, each class / module is mounted under a specific web path. This
is the preferred way of future expansion modules.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cherrypy</span><span class="o">.</span><span class="n">tree</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="n">voltage</span><span class="o">.</span><span class="n">EnergyInfo</span><span class="p">(),</span> <span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
<span class="n">cherrypy</span><span class="o">.</span><span class="n">tree</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="n">voltage</span><span class="o">.</span><span class="n">EnergyInfo</span><span class="p">(),</span> <span class="s2">&quot;/energy&quot;</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
<span class="n">cherrypy</span><span class="o">.</span><span class="n">tree</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="n">weather</span><span class="o">.</span><span class="n">WeatherInfo</span><span class="p">(),</span> <span class="s2">&quot;/weather&quot;</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
<span class="n">cherrypy</span><span class="o">.</span><span class="n">tree</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="n">status</span><span class="o">.</span><span class="n">StatusInfo</span><span class="p">(),</span> <span class="s2">&quot;/status&quot;</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
<span class="n">cherrypy</span><span class="o">.</span><span class="n">tree</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="n">dynamic</span><span class="o">.</span><span class="n">Expose</span><span class="p">(),</span> <span class="s2">&quot;/data&quot;</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
<span class="n">cherrypy</span><span class="o">.</span><span class="n">tree</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="n">temphumi</span><span class="o">.</span><span class="n">PuerhInfo</span><span class="p">(),</span> <span class="s2">&quot;/temphumi&quot;</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="index-index-py">
<h2>Index (index.py)<a class="headerlink" href="#index-index-py" title="Permalink to this headline"></a></h2>
<p>Reserved for future use. Currently not displayed, as the EnergyInfo() class is
mounted under root(/) of the web, defined in chttpd.py</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">cherrypy</span><span class="o">.</span><span class="n">tree</span><span class="o">.</span><span class="n">mount</span><span class="p">(</span><span class="n">voltage</span><span class="o">.</span><span class="n">EnergyInfo</span><span class="p">(),</span> <span class="s2">&quot;/&quot;</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="indices-and-tables">
<h2>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline"></a></h2>
<ul class="simple">
<li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li>
<li><p><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></p></li>
<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>
</ul>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="index.html" class="btn btn-neutral float-left" title="DOC: Plutonium reporter" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, Milan &#39;Ventil&#39; Toman
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>

7
doc/build/objects.inv vendored Normal file
View File

@@ -0,0 +1,7 @@
# Sphinx inventory version 2
# Project: Plutonium reporter
# Version:
# The remainder of this file is compressed using zlib.
x<EFBFBD>m<EFBFBD>M
<EFBFBD>0<10><>9<EFBFBD>\<5C>B<EFBFBD>.[7.J<><1E><>d<EFBFBD>@~$N@o_mL<6D><4C><EFBFBD><EFBFBD><EFBFBD>}o#<23><>D>
a"YJ'<27><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@F<><46>gsԶ<>a<EFBFBD>n gnF<6E>S<EFBFBD>&-r<>b<EFBFBD>Q$'<27>z<EFBFBD><7A>J<EFBFBD><4A>v<EFBFBD>[<5B><1B><><08><><EFBFBD>۞<>9<EFBFBD>罄FrVG<> <09>ʐwrm<72><6D>=<3D><><EFBFBD>ndNrG3N<33>i8.EZĀ<5A>JkܻNȽ<18>D<EFBFBD><44><EFBFBD><EFBFBD>}<7D>{d<1F>b<EFBFBD>

207
doc/build/search.html vendored Normal file
View File

@@ -0,0 +1,207 @@
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Search &mdash; Plutonium reporter 1.0 documentation</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/searchtools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="#" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Plutonium reporter
</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="#" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<p class="caption"><span class="caption-text">Contents:</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="introduction.html">Introduction to Plutonium</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Plutonium reporter</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Search</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<noscript>
<div id="fallback" class="admonition warning">
<p class="last">
Please activate JavaScript to enable the search
functionality.
</p>
</div>
</noscript>
<div id="search-results">
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2019, Milan &#39;Ventil&#39; Toman
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
<script type="text/javascript">
jQuery(function() { Search.loadIndex("searchindex.js"); });
</script>
<script type="text/javascript" id="searchindexloader"></script>
</body>
</html>

1
doc/build/searchindex.js vendored Normal file
View File

@@ -0,0 +1 @@
Search.setIndex({docnames:["db_structure","examples","index","introduction"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,"sphinx.ext.intersphinx":1,"sphinx.ext.viewcode":1,sphinx:56},filenames:["db_structure.rst","examples.rst","index.rst","introduction.rst"],objects:{},objnames:{},objtypes:{},terms:{"10m":0,"12h":0,"168h":0,"24h":0,"30s":0,"720h":0,"8760h":0,"class":2,"default":0,"function":2,"import":3,"int":0,"short":2,"static":3,AND:2,For:3,INTO:0,The:[2,3],_influx_host:3,_influx_iot_db:3,_influx_port:3,_influx_pwd:3,_influx_status_db:3,_influx_us:3,_influx_voltage_db:3,_influx_weather_db:3,_server_bind_ip:3,_server_nam:3,_server_port:3,_server_protocol:3,address:2,aggreg:2,aim:2,all:2,also:3,alter:0,although:2,anyth:2,appli:3,applic:[2,3],arduino:2,autogen:0,avail:3,basic:2,bastart:[2,3],batteri:[0,2],battery_0:3,begin:0,bluesolar:2,bool:0,bootstrap:3,box:2,can:[2,3],cannot:2,cc1101:2,cell:2,charg:2,cherrypi:2,chttpd:2,cnt:2,complet:2,compon:2,comprehens:2,conf:3,confi:3,config:2,configur:2,consist:2,consult:3,content:2,continu:0,control:2,convert:2,count:0,coupl:2,cover:2,cpu:2,cq_net_1m:0,cq_power_1h:0,cq_power_1m:0,cq_power_30m:0,cq_power_6h:0,cq_rain_10m:0,cq_rain_1h:0,cq_rain_6h:0,cq_temphumi_10m:0,cq_temphumi_1h:0,cq_temphumi_6h:0,cq_usense_12h:0,cq_usense_6h:0,creat:[0,2],css:3,current:[2,3],custom:2,data:[2,3],defin:3,deliv:2,dict:3,direct:2,directori:2,disk:2,displai:[2,3],doc:3,document:[2,3],done:2,drop:0,durat:0,dygraph:3,dynam:3,each:3,energi:3,energyinfo:3,equip:2,even:2,exampl:2,execut:3,expans:3,expos:3,feed:2,field:0,file:2,follow:3,footer:3,from:[0,2,3],futur:3,gather:2,get:2,grant:2,group:0,gust:2,header:3,henc:3,hhtu:2,hop:2,host:0,html:3,http:[2,3],humid:[0,2],humidity_max:0,humidity_min:0,idiot:2,img:3,includ:2,independ:2,index:[1,2],infinit:0,influxdb:2,inform:3,ini:2,instal:2,introduct:2,iss:0,iss_aggreg:0,its:2,just:2,keep:2,lan:2,landing_pag:3,launch:3,led:2,light:2,load:3,localdeploi:3,localhost:3,locat:3,log:2,logger:2,lqi:2,max:0,mean:0,measur:0,mem:2,min:0,mind:2,mini:2,minifi:3,mod:2,modul:[1,2],monitor:2,monthli:0,more:3,mount:3,mppt:0,mppt_aggreg:0,multitud:2,net:0,net_aggreg:0,network:0,nic:0,non_negative_deriv:0,notebook:2,now:0,nxt:2,obvious:2,old:2,onli:2,option:3,other:2,out:2,output:2,p_max:0,p_min:0,page:[1,2,3],pair:2,pars:3,part:2,password:3,path:2,platform:2,pleas:[2,3],plot:2,png:3,polici:0,power:0,prefer:3,pressur:0,primarili:2,project:[2,3],proper:2,protocol:2,puerhinfo:3,purpos:3,python3:[2,3],queri:0,radiat:2,rain:2,rain_bucket_tip:0,rain_tip:0,rainrat:0,rainrate_aggreg:0,raspberri:2,raspi:0,raspi_aggreg:0,rate:2,read:[2,3],realtim:0,receiv:2,replic:0,represent:2,reserv:3,resid:3,retent:0,root:3,rrate:0,rrate_max:0,rs232:2,rssi:2,same:3,schema:0,search:[1,2,3],seen:3,select:0,separ:3,server:2,shard:0,should:[2,3],show:0,similar:2,simpli:3,softwar:2,solar_graph:3,some:3,specif:3,sphinx:3,spin:2,spoton:[2,3],sqlite:0,standalon:3,station:2,statu:3,status_admin:3,status_graph:3,statusinfo:3,store:3,structur:2,style:3,subdirectori:3,submodul:3,supercap:2,t_stamp:0,tabl:0,tag:0,technolog:2,temp:2,temperatur:[0,2],temperature_max:0,temperature_min:0,temphum_graph:3,temphumi:3,temphumi_admin:3,temphumi_aggreg:0,templat:3,them:2,thi:[2,3],throughout:3,thtu:2,thu:2,time:0,tinyint:0,todo:3,top_menu:3,traffic:0,tree:3,txt:3,type:[0,3],under:3,uno:2,usag:0,usb:2,use:[2,3],usense_aggreg:0,uses:3,util:2,val_max:0,valu:[0,2,3],vantage_vue_iss:0,varchar:0,variabl:3,variou:2,version:2,victron:2,view:3,voltag:[0,2,3],voltage_admin:3,wai:[2,3],weather:[0,2,3],weather_admin:3,weather_graph:3,weather_v2:[0,3],weatherinfo:3,web:2,where:0,wide:3,wind:2,wireless:2,without:2,work:2,yeali:0,yearli:0},titles:["Structure of InfluxDB","Dynamic data","DOC: Plutonium reporter","Introduction to Plutonium"],titleterms:{"class":3,"function":3,cherrypi:3,chttpd:3,config:3,configur:3,data:1,davi:2,depend:2,directori:3,discrep:2,doc:2,done:0,dynam:1,end:0,energi:0,esp8266:2,file:3,hardwar:2,index:3,indic:[1,2,3],influxdb:0,ini:3,introduct:3,modul:3,mppt:2,path:3,plutonium:[2,3],purpos:2,rain:0,raspi:2,report:2,scope:2,server:3,solar:2,sourc:2,statist:2,statu:0,structur:[0,3],stuff:2,tabl:[1,2,3],temphumi:0,usens:0,vantag:2,vue:2,weather:1,web:3,wind:0}})