Compare commits

..

1 Commits

Author SHA1 Message Date
6c14800a02 Add mqtt-collect script 2020-03-30 20:23:14 +02:00
2 changed files with 14 additions and 31 deletions

View File

@@ -1,12 +1,10 @@
{ python3 }: { python3 }:
with python3.pkgs; with python3.pkgs;
buildPythonPackage rec { buildPythonPackage rec {
name = "mqtt-tools"; name = "mqtt-config";
src = ./.; src = ./.;
propagatedBuildInputs = [ pyyaml paho-mqtt ]; propagatedBuildInputs = [ pyyaml paho-mqtt ];
buildInputs = []; buildInputs = [];
doCheck = false; doCheck = false;
shellHook = ""; shellHook = "";
pyproject = true;
build-system = [ setuptools ];
} }

View File

@@ -7,10 +7,17 @@ import paho.mqtt.client
import sqlite3 import sqlite3
import datetime import datetime
MAX_VALUE_CACHE_SIZE = 1024
def init_db(path, topics): def init_db(path, topics):
db = sqlite3.connect(path) db = sqlite3.connect(path)
c = db.cursor()
for topic in topics:
table = topic.replace('/', '_')
c.execute(
f'CREATE TABLE IF NOT EXISTS {table} (timestamp timestamp, value real)'
)
db.commit()
return db return db
@@ -32,37 +39,15 @@ def main():
def on_disconnect(client, userdata, rc): def on_disconnect(client, userdata, rc):
client.reconnect() client.reconnect()
current_values = {}
def on_message(client, userdata, msg): def on_message(client, userdata, msg):
try: try:
c = db.cursor() c = db.cursor()
table = msg.topic.replace("/", "_") table = msg.topic.replace("/", "_")
ts = datetime.datetime.now() ts = datetime.datetime.now()
textual = {
b"on": 1.,
b"off": 0.,
b"yes": 1.,
b"no": 0.
}
if msg.payload.lower() in textual:
value = textual[msg.payload.lower()]
else:
value = float(msg.payload) value = float(msg.payload)
print(f"{table}: {value} ") c.execute(f'INSERT INTO {table} VALUES (?, ?)', (ts, value))
c.execute(f'SELECT * from {table}')
if current_values.get(table, None) != value:
current_values[table] = value
if len(current_values) > MAX_VALUE_CACHE_SIZE:
first_entry = current_values.keys().next()
del current_values[first_entry]
c.execute(f'CREATE TABLE IF NOT EXISTS "{table}" '
'(timestamp timestamp, value real)')
c.execute(f'INSERT INTO "{table}" VALUES (?, ?)', (ts, value))
db.commit() db.commit()
except Exception as e: except Exception as e:
print(f'Error writing to database: {e}') print(f'Error writing to database: {e}')