RaspyRFM/influx.py

192 lines
4.4 KiB
Python
Raw Normal View History

#!/usr/bin/env python2.7
from rfm69 import Rfm69
import rfm69
import sensors
from sensors import rawsensor
import sys
import time
import threading
import math
import json
from datetime import datetime
import os
nodes = {
"0": "Kuehlschrank",
"c0": "Kueche",
"b0": "Kinderzimmer",
"4c": "Aussen",
"50": "Aussen 2",
"54": "Schlafzimmer",
"70": "Wohnzimmer",
"e0": "Badezimmer",
"f0": "MuFu",
"f8": "Musikzimmer"
}
if Rfm69.Test(1):
print("Found RaspyRFM twin")
rfm = Rfm69(1, 24) #when using the RaspyRFM twin
elif Rfm69.Test(0):
print("Found RaspyRFM single")
rfm = Rfm69() #when using a single single 868 MHz RaspyRFM
else:
print("No RFM69 module found!")
exit()
try:
from influxdb import InfluxDBClient
influxClient = InfluxDBClient(host='localhost', port=8086, username='admin', password='admin')
influxClient.switch_database("sensors")
except:
print("influx init error")
try:
import paho.mqtt.client as mqtt
mqttClient = mqtt.Client()
mqttClient.connect("localhost", 1883, 60)
mqttClient.loop_start()
except:
print("mqtt init error")
rfm.SetParams(
Freq = 868.300, #MHz center frequency
Datarate = 9.579, #kbit/s baudrate
ModulationType = rfm69.FSK, #modulation
Deviation = 30, #kHz frequency deviation OBW = 69.6/77.2 kHz, h = 6.3/3.5
SyncPattern = [0x2d, 0xd4], #syncword
Bandwidth = 100, #kHz bandwidth
#AfcBandwidth = 150,
#AfcFei = 0x0E,
RssiThresh = -100, #-100 dB RSSI threshold
)
class BaudChanger(threading.Thread):
baud = False
def __init__(self):
threading.Thread.__init__(self)
def run(self):
while True:
time.sleep(15)
print "Change"
if self.baud:
rfm.SetParams(Datarate = 9.579)
else:
rfm.SetParams(Datarate = 17.241)
self.baud = not self.baud
baudChanger = BaudChanger()
baudChanger.daemon = True
baudChanger.start()
def writeInflux(payload):
T = payload["T"]
wr = {
"measurement": "lacrosse",
"fields": {
"T": T
},
"tags": {"sensor": payload["ID"] if not ("room" in payload) else payload["room"]}
}
if ("RH" in payload):
wr["fields"]["RH"] = payload['RH']
wr["fields"]["DEW"] = payload["DEW"]
wr["fields"]["AH"] = payload["AH"]
wr["fields"]["RSSI"] = payload["rssi"]
wr["fields"]["AFC"] = payload["afc"]
influxClient.write_points([wr])
print "Waiting for sensors..."
cache = {}
while 1:
rxObj = rfm.ReceivePacket(7)
try:
sensorObj = rawsensor.CreateSensor(rxObj)
sensorData = sensorObj.GetData()
payload = {}
payload["ID"] = sensorData["ID"]
T = sensorData["T"][0]
payload["T"] = T
except:
continue
payload["rssi"] = rxObj[1]
payload["afc"] = rxObj[2]
payload["batlo"] = sensorData['batlo']
payload["init"] = sensorData["init"]
if (sensorData['ID'] in nodes):
payload["room"] = nodes[sensorData['ID']]
else:
print("Unnassigned sensor:")
if 'RH' in sensorData:
RH = int(sensorData['RH'][0])
payload["RH"] = RH
a = 7.5
b = 237.4
SDD = 6.1078 * 10**(a*T/(b+T))
DD = RH / 100.0 * SDD
v = math.log10(DD/6.1078)
payload["DEW"] = round(b*v/(a-v), 1)
payload["AH"] = round(10**5 * 18.016/8314.3 * DD/(T+273.15), 1)
DD = RH / 80.0 * SDD
v = math.log10(DD/6.1078)
payload["DEW80"] = round(b*v/(a-v), 1)
DD = RH / 60.0 * SDD
v = math.log10(DD/6.1078)
payload["DEW60"] = round(b*v/(a-v), 1)
if not payload["ID"] in cache:
cache[payload["ID"]] = {}
cache[payload["ID"]]["count"] = 1
cache[payload["ID"]]["payload"] = payload;
cache[payload["ID"]]["ts"] = datetime.now();
cache[payload["ID"]]["count"] += 1
os.system('clear');
print("|ID| ROOM | TIMESTAMP |COUNT| RSSI| AFC |BAT|INI| T |RH| AH | DEW | TF80| TF60|")
for key in cache:
line = "|";
s = cache[key]
p = cache[key]["payload"]
line += '{:2}|'.format(key)
line += '{:12}|'.format("" if (not "room" in p) else p["room"][:12])
line += s["ts"].strftime("%Y-%m-%d %H:%M:%S|")
line += '{:5}'.format(s["count"]) + '|'
line += '{:5}'.format(p["rssi"]) + '|'
line += '{:5}'.format(p["afc"]) + '|'
line += "LO!|" if p["batlo"] else "OK |"
line += " ! |" if p["init"] else " |"
line += '{:5}|'.format(p["T"])
if "RH" in p:
line += '{:2}|'.format(p["RH"])
line += '{:4}|'.format(p["AH"])
line += '{:5}|'.format(p["DEW"])
line += '{:5}|'.format(p["DEW80"])
line += '{:5}|'.format(p["DEW60"])
else:
line += '--|----|-----|-----|-----|'
print(line)
print(payload)
try:
writeInflux(payload)
except:
pass
try:
mqttClient.publish('home/lacrosse/'+ payload['ID'], json.dumps(payload))
except:
pass