# !/usr/bin/env python # this plugin sends MQTT from threading import Thread from random import randint import json import time import os import sys import traceback import web import gv # Get access to ospi's settings from urls import urls # Get access to ospi's URLs from ospi import template_render from webpages import ProtectedPage from helpers import timestr # MQTT import paho.mqtt.publish as publish # Add a new url to open the data entry page. urls.extend(['/mqta', 'plugins.mqtt.settings', '/mqtj', 'plugins.mqtt.settings_json', '/umqta', 'plugins.mqtt.update']) # Add this plugin to the home page plugins menu gv.plugin_menu.append(['MQTT settings', '/mqta']) ################################################################################ # Main function loop: # ################################################################################ class MqttSender(Thread): def __init__(self): Thread.__init__(self) self.daemon = True self.start() self.status = '' self._sleep_time = 0 def add_status(self, msg): if self.status: self.status += '\n' + msg else: self.status = msg def update(self): self._sleep_time = 0 def _sleep(self, secs): self._sleep_time = secs while self._sleep_time > 0: time.sleep(1) self._sleep_time -= 1 def run(self): time.sleep(randint(2, 5)) # Sleep some time to prevent printing before startup information datamq = get_mqtt_options() # load data from file self.add_status('MQTT plugin is started') ################################################################################ # Helper functions: # ################################################################################ checker=MqttSender() def get_mqtt_options(): """Returns the defaults data from file.""" datamq = { 'mqthost': 'localhost', 'mqtport': '1883', 'mqtzc': 'on', # zones changed 'mqtzctopic':'OSPI/zc', 'mqtcc': 'on', # controller changed 'mqtcctopic':'OSPI/cc', 'mqtoc':'on', # options change 'mqtoctopic':'OSPI/oc', 'mqtrb':'on', # reboot 'mqtrbtopic':'OSPI/rb', 'mqtsc':'on', # Station names changed 'mqtsctopic':'OSPI/sc', 'mqtpc':'on', # Programs changed 'mqtpctopic':'OSPI/pc', 'mqtlg':'on', # Someone logged in 'mqtlgtopic':'OSPI/lg', 'status': checker.status } try: with open('./data/mqtt.json', 'r') as f: # Read the settings from file file_data = json.load(f) for key, value in file_data.iteritems(): if key in datamq: datamq[key] = value except Exception: pass return datamq ################################################################################ # Web pages: # ################################################################################ class settings(ProtectedPage): """Load an html page for entering mqtt options.""" def GET(self): return template_render.mqtt(get_mqtt_options()) class settings_json(ProtectedPage): """Returns plugin settings in JSON format.""" def GET(self): web.header('Access-Control-Allow-Origin', '*') web.header('Content-Type', 'application/json') return json.dumps(get_mqtt_options()) class update(ProtectedPage): """Save user input to mqtt.json file.""" def GET(self): qdict = web.input() # mqtt broker address if 'mqthost' not in qdict: qdict['mqthost'] = 'localhost' if 'mqtport' not in qdict: qdict['mqtport'] = '1880' # check boxes if 'mqtzc' not in qdict: qdict['mqtzc'] = 'off' if 'mqtcc' not in qdict: qdict['mqtcc'] = 'off' if 'mqtoc' not in qdict: qdict['mqtoc'] = 'off' if 'mqtrb' not in qdict: qdict['mqtrb'] = 'off' if 'mqtsc' not in qdict: qdict['mqtsc'] = 'off' if 'mqtpc' not in qdict: qdict['mqtpc'] = 'off' if 'mqtpd' not in qdict: qdict['mqtpd'] = 'off' if 'mqtpt' not in qdict: qdict['mqtpt'] = 'off' if 'mqtlg' not in qdict: qdict['mqtlg'] = 'off' # topic names if 'mqtzctopic' not in qdict: qdict['mqtzctopic'] = gv.sd['name']+'/zc' if 'mqtcctopic' not in qdict: qdict['mqtcctopic'] = gv.sd['name']+'/cc' if 'mqtoctopic' not in qdict: qdict['mqtoctopic'] = gv.sd['name']+'/oc' if 'mqtrbtopic' not in qdict: qdict['mqtrbtopic'] = gv.sd['name']+'/rb' if 'mqtsctopic' not in qdict: qdict['mqtsctopic'] = gv.sd['name']+'/sc' if 'mqtpctopic' not in qdict: qdict['mqtpctopic'] = gv.sd['name']+'/pc' if 'mqtpdtopic' not in qdict: qdict['mqtpdtopic'] = gv.sd['name']+'/pd' if 'mqtpttopic' not in qdict: qdict['mqtpttopic'] = gv.sd['name']+'/pt' if 'mqtlgtopic' not in qdict: qdict['mqtlgtopic'] = gv.sd['name']+'/pt' with open('./data/mqtt.json', 'w') as f: # write the settings to file json.dump(qdict, f) raise web.seeother('/')