# !/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', '/gv', 'plugins.mqtt.getgv']) # 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, 10)) # Sleep some time to prevent printing before startup information datamq = get_mqtt_options() # load data from file self.mqtlgmsg = datamq['mqtlgmsg'] self.add_status('MQTT plugin is started') self.add_status(self.mqtlgmsg) ################################################################################ # Helper functions: # ################################################################################ checker=MqttSender() def get_mqtt_options(): """Returns the defaults data from file.""" datamq = { 'mqtlg' :'on', # Someone logged in 'mqtlgtopic':'OSPI/lg', 'mqtlgmsg' :'{U"Someone logged in at : ":time.asctime(time.localtime(gv.now))}', 'mqtzc' : 'on', # zones changed 'mqtzctopic':'OSPI/zc', 'mqtzcmsg' :'file', 'mqtcc' : 'on', # controller changed 'mqtcctopic':'OSPI/cc', 'mqtccmsg' :'{U"Time : ":time.asctime(time.localtime(gv.now)),U"gv.sd":gv.sd}', 'mqtoc' :'on', # options change 'mqtoctopic':'OSPI/oc', 'mqtocmsg' :'{U"Time : ":time.asctime(time.localtime(gv.now)),U"gv.sd":gv.sd}', 'mqtrb' :'on', # reboot 'mqtrbtopic':'OSPI/rb', 'mqtrbmsg' :'{U"System rebooted at : ":time.asctime(time.localtime(gv.now))}', 'mqtsc' :'on', # Station names changed 'mqtsctopic':'OSPI/sc', 'mqtscmsg' :'file', 'mqtpc' :'on', # Programs changed 'mqtpctopic':'OSPI/pc', 'mqtpcmsg' :'{U"Time : ":time.asctime(time.localtime(gv.now)),U"gv.ps":gv.ps}', # Future use (so I don't have to change the code when a plugin # author wants to incorporate this feature) 'mqtp1' :'off', # Plugin 1 'mqtp1topic':'OSPI/p1', 'mqtp1msg' :'Plugin 1 changes', 'mqtp2' :'off', # Plugin 2 'mqtp2topic':'OSPI/p2', 'mqtp2msg' :'Plugin 2 changes', 'mqtp3' :'off', # Plugin 3 'mqtp3topic':'OSPI/p3', 'mqtp3msg' :'Plugin 3 changes', 'mqthost' : 'localhost', 'mqtport' : '1883', 'mqtqos' : '0', 'mqtretain' : 'false', '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 getgv(ProtectedPage): # /gv """Returns current settings as json.""" def GET(self): web.header('Access-Control-Allow-Origin', '*') web.header('Content-Type', 'application/json') web.header('Cache-Control', 'no-cache') jsettings = { "gmtnow" : gv.gmtnow, "lrun" : gv.lrun, "now" : gv.now, "pd" : gv.pd, "pon" : gv.pon, "rovals" : gv.rovals, "ps" : gv.ps, "rs" : gv.rs, "sbits" : gv.sbits, "scount" : gv.scount, "sd" : gv.sd, "snames" : gv.snames, "srvals" : gv.srvals } return json.dumps(jsettings) 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' if 'mqtqos' not in qdict: qdict['mqtqos'] = '0' if 'mqtretain' not in qdict: qdict['mqtretain'] = 'false' # 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 'mqtlg' not in qdict: qdict['mqtlg'] = 'off' if 'mqtp1' not in qdict: qdict['mqtp1'] = 'off' if 'mqtp2' not in qdict: qdict['mqtp2'] = 'off' if 'mqtp3' not in qdict: qdict['mqtp3'] = '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 'mqtlgtopic' not in qdict: qdict['mqtlgtopic'] = gv.sd['name']+'/lg' if 'mqtp1topic' not in qdict: qdict['mqtp1topic'] = gv.sd['name']+'/p1' if 'mqtp2topic' not in qdict: qdict['mqtp2topic'] = gv.sd['name']+'/p2' if 'mqtp3topic' not in qdict: qdict['mqtp3topic'] = gv.sd['name']+'/p3' # topic messages if 'mqtzcmsg' not in qdict: qdict['mqtzcmsg']='file' if 'mqtccmsg' not in qdict: qdict['mqtccmsg'] = '{U"Time : ":time.asctime(time.localtime(gv.now)),U"gv.sd":gv.sd}' if 'mqtocmsg' not in qdict: qdict['mqtocmsg'] = '{U"Time : ":time.asctime(time.localtime(gv.now)),U"gv.sd":gv.sd}' if 'mqtrbmsg' not in qdict: qdict['mqtrbmsg'] = '{"System rebooted at : ": U"Time : ":time.asctime(time.localtime(gv.now)),U"gv.sd":gv.sd}' if 'mqtscmsg' not in qdict: qdict['mqtscmsg'] = {U"Time : ":time.asctime(time.localtime(gv.now)),U"snames":gv.snames} if 'mqtpcmsg' not in qdict: qdict['mqtpcmsg'] = '{U"Time : ":time.asctime(time.localtime(gv.now)),U"gv.ps":gv.ps}' if 'mqtlgmsg' not in qdict: qdict['mqtlgmsg'] = '{U"Someone logged in at : ":time.asctime(time.localtime(gv.now))}' if 'mqtp1msg' not in qdict: qdict['mqtp1msg'] = 'Plugin 1' if 'mqtp2msg' not in qdict: qdict['mqtp2msg'] = 'Plugin 2' if 'mqtp3msg' not in qdict: qdict['mqtp3msg'] = 'Plugin 3' with open('./data/mqtt.json', 'w') as f: # write the settings to file json.dump(qdict, f) raise web.seeother('/')