def set_lcd_address(): adr = cbpi.get_config_parameter('LCD_Address', None) if adr is None: cbpi.add_config_parameter('LCD_Address', '0x27', 'string', 'Address of the LCD, CBPi reboot required') adr = cbpi.get_config_parameter('LCD_Address', None) return adr
def plugins(): """ Read the central plugin yaml to get a list of all official plugins :return: """ mergedPlugins = "" #response = requests.get("https://raw.githubusercontent.com/Manuel83/craftbeerpi-plugins/master/plugins.yaml") parameterName = "Plugins_Repository" pluginsFileOnRepository = cbpi.get_config_parameter(parameterName, None) parameterName = "Plugins_Repository_MergeWithOriginal" parameterToVerify = cbpi.get_config_parameter(parameterName, None) # Make request to plugins file on repository response = requests.get(pluginsFileOnRepository) mergedPlugins = yaml.load(response.text) if parameterToVerify is not None and parameterToVerify == "Yes": # Make request to plugins file on repository if pluginsFileOnRepository != "https://raw.githubusercontent.com/Manuel83/craftbeerpi-plugins/master/plugins.yaml": responseToOriginal = requests.get( "https://raw.githubusercontent.com/Manuel83/craftbeerpi-plugins/master/plugins.yaml" ) mergedPlugins = merge(yaml.load(responseToOriginal.text), mergedPlugins) cbpi.cache["plugins"] = merge(mergedPlugins, cbpi.cache["plugins"]) for key, value in cbpi.cache["plugins"].iteritems(): value["installed"] = os.path.isdir("./modules/plugins/%s/" % (key)) return json.dumps(cbpi.cache["plugins"])
def init(cbpi): cbpi.app.logger.info("brewstat.us plugin Initialize") log("Brewstat.us params") global brewstatus_comment global brewstatus_url brewstatus_comment = cbpi.get_config_parameter("brewstatus_comment", None) log("Brewstat.us brewstatus_comment %s" % brewstatus_comment) brewstatus_url = cbpi.get_config_parameter("brewstatus_url", None) log("Brewstat.us brewstatus_url %s" % brewstatus_url) if brewstatus_comment is None: log("Init brewstat.us config Comment") try: # TODO: is param2 a default value? cbpi.add_config_parameter("brewstatus_comment", "", "text", "Brewstat.us comment") except: cbpi.notify("Brewstat.us Error", "Unable to update config parameter", type="danger") if brewstatus_url is None: log("Init brewstat.us config url") try: # TODO: is param2 a default value? cbpi.add_config_parameter("brewstatus_url", "", "text", "Brewstat.us url") except: cbpi.notify("Brewstat.us Error", "Unable to update config parameter", type="danger") log("Brewstat.us params ends")
def set_TFTw(): TFTbr = (cbpi.get_config_parameter("TFT_Width", None)) if TFTbr is None: cbpi.add_config_parameter("TFT_Width", 388, "number", "Choose TFTDisplay width [pixel], default 388, NO! CBPi reboot required") TFTbr = (cbpi.get_config_parameter("TFT_Width", None)) cbpi.app.logger.info("TFTDisplay - TFTbr added: %s" % (TFTbr)) return TFTbr
def init(cbpi): gpio = cbpi.get_config_parameter("buzzer", 16) beep_level = cbpi.get_config_parameter("buzzer_beep_level", "HIGH") cbpi.buzzer = Buzzer(gpio, beep_level) cbpi.beep() cbpi.app.logger.info("INIT OK")
def init(cbpi): log("Brefather Fermenter plugin Initialize", True) global brewfather_fermenter_comment global brewfather_custom_stream brewfather_fermenter_comment = cbpi.get_config_parameter( "brewfather_fermenter_comment", None) brewfather_custom_stream = cbpi.get_config_parameter( "brewfather_custom_stream", None) if brewfather_fermenter_comment is None: try: cbpi.add_config_parameter("brewfather_fermenter_comment", "", "text", "Brefather Fermenter Comment") except: cbpi.notify("Brefather Error", "Unable to update Brefather comment parameter", type="danger") if brewfather_custom_stream is None: try: cbpi.add_config_parameter("brewfather_custom_stream", "", "text", "Brefather custom data string") except: cbpi.notify("Brefather Error", "Unable to update Brefather custom data string", type="danger") pass
def init(cbpi): cbpi.app.logger.info("JSONServer: start init") try: cbpi.app.logger.info("JSONServer: initiate parameters") # setup json server parameters param = cbpi.get_config_parameter('json_server_port', None) if param is None: cbpi.app.logger.info("JSONServer: create json_server_port system parameter") try: cbpi.add_config_parameter('json_server_port', DEFAULT_SERVER_PORT, 'number', "JSON Server Port") except Exception as e: cbpi.app.logger.error("JSONServer: {}".format(e)) param = cbpi.get_config_parameter('json_cache_age', None) if param is None: cbpi.app.logger.info("JSONServer: create json_cache_age system parameter") try: cbpi.add_config_parameter('json_cache_age', DEFAULT_CACHE_AGE, 'number', "JSON Data Cache Age (Seconds)") except Exception as e: cbpi.app.logger.error("JSONServer: {}".format(e)) cbpi.app.logger.info("JSONServer: initiate http server") port = int(cbpi.get_config_parameter('json_server_port', DEFAULT_SERVER_PORT)) httpd = HTTPServer(('',port), cbpi_json_request_handler) server_thread = Thread(target=httpd.serve_forever) server_thread.daemon = True server_thread.start() cbpi.app.logger.info("JSONServer: end init") except Exception as e: cbpi.app.logger.error(repr(e))
def brewfather_temp_background_task(api): log("brewfather temperature background task") global drop_first if drop_first is None: drop_first = False return False if brewfather_custom_stream is None: return False now = datetime.datetime.now() for key, value in cbpi.cache.get("sensors").iteritems(): log("key %s value.name %s value.instance.last_value %s" % (key, value.name, value.instance.last_value)) if (value.type == "ONE_WIRE_SENSOR"): payload = "{ " payload += " \"name\": \"CraftBeerPi\",\r\n" temp = value.instance.last_value unit = cbpi.get_config_parameter("unit",None) payload += " \"temp\": \"%s\",\r\n" % temp payload += " \"temp_unit\": \"%s\",\r\n" % unit payload += " \"comment\": \"%s\" }" % cbpi.get_config_parameter("brewfather_comment", None) log("Payload %s" % payload) url = "http://log.brewfather.net/stream" headers = { 'Content-Type': "application/json", 'Cache-Control': "no-cache" } id = cbpi.get_config_parameter("brewfather_custom_stream", None) querystring = {"id":id} r = requests.request("POST", url, data=payload, headers=headers, params=querystring) log("Result %s" % r.text) log("brewfather done")
def set_TFTh(): TFThoehe = (cbpi.get_config_parameter("TFT_Hight", None)) if TFThoehe is None: cbpi.add_config_parameter("TFT_Hight", 400, "number", "Choose TFTDisplay hight [pixel], default 400, NO! CBPi reboot required") TFThoehe = (cbpi.get_config_parameter("TFT_Hight", None)) cbpi.app.logger.info("TFTDisplay - TFThoehe added: %s" % (TFThoehe)) return TFThoehe
def set_parameter_id1(): kid1 = cbpi.get_config_parameter("LCD_Singledisplay", None) if kid1 is None: cbpi.add_config_parameter( "LCD_Singledisplay", 1, "number", "Choose Kettle (Number), NO! CBPi reboot required") kid1 = cbpi.get_config_parameter('LCD_Singledisplay', None) return kid1
def set_parameter_refresh(): ref = cbpi.get_config_parameter('LCD_Refresh', None) if ref is None: cbpi.add_config_parameter( 'LCD_Refresh', 3, 'select', 'Time to remain till next display in sec, NO! CBPi reboot required', [1, 2, 3, 4, 5, 6]) ref = cbpi.get_config_parameter('LCD_Refresh', None) return ref
def set_parameter_multidisplay(): multi = cbpi.get_config_parameter('LCD_Multidisplay', None) if multi is None: cbpi.add_config_parameter( 'LCD_Multidisplay', 'on', 'select', 'Toggle between all Kettles or show only one Kette constantly, NO! CBPi reboot required', ['on', 'off']) multi = cbpi.get_config_parameter('LCD_Multidisplay', None) return multi
def set_time_between_display_change(): ref = cbpi.get_config_parameter('LCD_Show_temp_time', None) if ref is None: cbpi.add_config_parameter( 'LCD_Show_temp_time', 2, 'select', 'Time to remain till next temperature display in sec, NO! CBPi reboot required', [1, 2, 3, 4, 5, 6]) ref = cbpi.get_config_parameter('LCD_Refresh', None) return ref
def init(cbpi): cbpi.app.logger.info("INIT buzz") pwmchip = cbpi.get_config_parameter("buzzer_pwmchip", 0) pwm = cbpi.get_config_parameter("buzzer_pwm", 0) beep_level = cbpi.get_config_parameter("buzzer_beep_level", "HIGH") cbpi.buzzer = Buzzer(pwm, pwmchip, beep_level) cbpi.beep() cbpi.app.logger.info("INIT OK")
def getUser(): cbpi.app.logger.info("Get User") global username, password username = cbpi.get_config_parameter("tplink_username", None) password = cbpi.get_config_parameter("tplink_password", None) if username is None: try: cbpi.add_config_parameter("tplink_username", "", "text", "TPLink Username") cbpi.add_config_parameter("tplink_password", "", "text", "TPLink Password") except: pass
def init(cbpi): gpio = cbpi.get_config_parameter("buzzer", 22) beep_level = cbpi.get_config_parameter("buzzer_beep_level", "HIGH") cbpi.buzzer = Buzzer(gpio, beep_level) cbpi.beep() cbpi.MashStepEndBeep() cbpi.MashInStepEndBeep() cbpi.ChilStepEndBeep() cbpi.PumpStepEndBeep() cbpi.BoilStepEndBeep() cbpi.HopAddBeep() cbpi.app.logger.info("INIT OK")
def brewstatus_background_task(api): log("brewstat.us background task") global drop_first if drop_first is None: drop_first = False return False if brewstatus_url is None: return False now = datetime.datetime.now() for key, value in cbpi.cache.get("sensors").iteritems(): log("key %s value.name %s value.instance.last_value %s" % (key, value.name, value.instance.last_value)) # # TODO: IMPORTANT - Temp sensor must be defined preceeding Gravity sensor and # each Tilt must be defined as a pair without another Tilt # defined between them, e.g. # RED Temperature # RED Gravity # PINK Temperature # PINK Gravity # if (value.type == "TiltHydrometer"): if (value.instance.sensorType == "Temperature"): # A Tilt Temperature device is the first of the Tilt pair of sensors so # reset the data block to empty data = {} # generate timestamp in "Excel" format data['Timepoint'] = now.toordinal() - 693594 + ( 60 * 60 * now.hour + 60 * now.minute + now.second) / float( 24 * 60 * 60) data['Color'] = value.instance.color data['Temp'] = value.instance.last_value # brewstat.us expects *F so convert back if we use C if (cbpi.get_config_parameter("unit", None) == "C"): data['Temp'] = value.instance.last_value * 1.8 + 32 if (value.instance.sensorType == "Gravity"): data['SG'] = value.instance.last_value data['Comment'] = cbpi.get_config_parameter( "brewstatus_comment", None) log("Data %s" % data) headers = { 'content-type': '"application/x-www-form-urlencoded; charset=utf-8"' } url = cbpi.get_config_parameter("brewstatus_url", None) r = requests.post(url, headers=headers, data=data) log("Result %s" % r.text) log("brewstat.us done")
def init(self): unit = cbpi.get_config_parameter("flowunit", None) if unit is None: print("INIT FLOW DB") try: cbpi.add_config_parameter( "flowunit", "L", "select", "Flowmeter unit", options=["L", "gal(us)", "gal(uk)", "qt"]) except: cbpi.notify("Flowmeter Error", "Unable to update database.", type="danger", timeout=None) try: GPIO.setup(int(self.gpio), GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.add_event_detect(int(self.gpio), GPIO.RISING, callback=self.doAClick, bouncetime=20) self.fms[int(self.gpio)] = FlowMeterData() except Exception as e: print(e)
def get_unit(self): unit = cbpi.get_config_parameter("flowunit", None) if self.sensorShow == "Flow, unit/s": unit = unit + "/s" if self.sensorShow == "Pulse": unit = "Pulses" return unit
def auth_password(): password = cbpi.get_config_parameter('auth_password', None) if password is None: cbpi.add_config_parameter("auth_password", "password", "text", "HTTP Auth password") return "password" else: return password
def init(cbpi): print "INIT BUZZER" cbpi.app.logger.info("INIT BUZZER") gpio = cbpi.get_config_parameter("buzzer", 16) cbpi.buzzer = Buzzer(gpio) cbpi.beep() cbpi.app.logger.info("INIT OK")
def execute(self): brew_name = cbpi.get_config_parameter("brew_name", "") if brew_name: brew_name = "_".join(brew_name.split()) brew_name = brew_name + time.strftime("_%Y_%m_%d") else: brew_name = time.strftime("Brew_%Y_%m_%d") brew_name = brew_name.replace('%', '') brew_name = brew_name.replace("#", "") brew_name = brew_name.replace("'", "") brew_name = brew_name.replace("$", "") brew_name = brew_name.replace("´", "") log_names = os.listdir(LOG_DIR) for log_name in log_names: if (log_name[-4:] == ".log") and (log_name != APP_LOG) and (LOG_SEP not in log_name): if os.path.isfile(LOG_DIR + log_name): os.system("cp {} {}".format( LOG_DIR + log_name, LOG_DIR + brew_name + LOG_SEP + log_name)) self.notify("Logfiles Saved!", "Name: %s Starting the next step" % brew_name) next(self)
def thingspeakFields(): global thingspeak_ok global thingspeak_api global thingspeak_api_write url = "api.thingspeak.com" if (thingspeak_api == "" or thingspeak_chnid == ""): log("ThingSpeak Config error") cbpi.notify("ThingSpeak Error", "Please update config parameter", type="danger") return False brewery_name = cbpi.get_config_parameter("brewery_name", "CraftBeerPi") data_api = "{'api_key':'%s'" % thingspeak_api path = "/channels/%s.json" % thingspeak_chnid result = httpCon(url, path, data_api+"}") log("JSON: %s" % result) data = "" data += Fillfield(result, "tags", "Brew, CraftBeerPi, Beer, RaspBerryPi") data += Fillfield(result, "description", "The CraftBeerPi temperature sensor logging for the brewery %s." % brewery_name) path = "/channels/%s/feeds.json" % thingspeak_chnid result = httpCon(url, path, data_api+", 'results':'0'}") log("JSON: %s" % result) path = "/channels/%s.json" % thingspeak_chnid cnt = 1 for key, value in cbpi.cache.get("sensors").iteritems(): field = 'field%s' % cnt try: data += Fillfield(result["channel"], field, value.name) except: data += Fillfield({}, field, value.name) cnt += 1 data += "}" data = data_api + data result = httpCon(url, path, data, 'PUT') thingspeak_api_write = result["api_keys"][0]["api_key"] log("API Write: %s" % thingspeak_api_write)
def set_DigitOn(): digit = cbpi.get_config_parameter("TFT_digitOn", None) if digit is None: digit = "off" cbpi.add_config_parameter ("TFT_digitOn", "off", "select", "No graph just big digits showing temperature, NO! CBPi reboot required", ["on", "off"]) cbpi.app.logger.info("TFTDisplay - TFT_digitOn added: %s" % (digit)) return digit
def set_FermentationOn(): fermon = cbpi.get_config_parameter("TFT_Fermenter_ID", None) if fermon is None: fermon = 1 cbpi.add_config_parameter ("TFT_Fermenter_ID", 1, "number", "Choose fermenter (Number) NO! CBPi reboot required") cbpi.app.logger.info("TFTDisplay - TFT_Fermenter_ID added: %s" % (fermon)) return fermon
def set_StartscreenOn(): startsc = cbpi.get_config_parameter("TFT_StartscreenOn", None) if startsc is None: startsc = "on" cbpi.add_config_parameter ("TFT_StartscreenOn", "on", "select", "Skip the CBPI Logo and start chart of kettle at power on, NO! CBPi reboot required", ["on", "off"]) cbpi.app.logger.info("TFTDisplay - TFT_StartscreenOn added: %s" % (startsc)) return startsc
def set_fontsize(): fosi = cbpi.get_config_parameter("TFT_Fontsize", None) if fosi is None: fosi = 16 cbpi.add_config_parameter ("TFT_Fontsize", 16, "number", "Choose fontsize of grid default is 16, NO! CBPi reboot required") cbpi.app.logger.info("TFTDisplay - TFT_Fontsize added: %s" % (fosi)) return fosi
def set_parameter_id3(): TFTid3 = cbpi.get_config_parameter("TFT_Kettle_ID", None) if TFTid3 is None: TFTid3 = 1 cbpi.add_config_parameter ("TFT_Kettle_ID", 1, "number", "Choose kettle (Number), NO! CBPi reboot required") cbpi.app.logger.info("TFTDisplay - TFTid added: %s" % (TFTid3)) return TFTid3
def init(cbpi): cbpi.app.logger.info("LogLimiter: initialize") # setup max lines parameter for sensor etc logs param = cbpi.get_config_parameter("max_log_lines", None) if param is None: cbpi.app.logger.info("LogLimiter: create system parameter") try: cbpi.add_config_parameter("max_log_lines", DEFAULT_LOG_LINES, "number", "Max Log Lines") except Exception as e: cbpi.app.logger.error("LogLimiter: {}".format(e)) update_max_log_globals() # replace default file handler with rotating handler for main app.log try: new_file_handler = logging.handlers.TimedRotatingFileHandler( APP_LOG, when='midnight', interval=1, backupCount=7) new_file_handler.setFormatter(logging.Formatter(LOG_FORMAT)) root_logger = logging.getLogger() for one_handler in root_logger.handlers: if isinstance(one_handler, logging.FileHandler): root_logger.removeHandler(one_handler) root_logger.addHandler(new_file_handler) cbpi.app.logger.info("LogLimiter: logger file handler replaced") except Exception as e: cbpi.app.logger.error("LogLimiter: {}".format(e))
def brewersfriend_background_task(api): api_key = bf_api_key() if api_key == "": cbpi.notify( "Brewer's Friend Error", "API key not set. Update brewersfriend_api_key parameter within System > Parameters.", type="danger", timeout=None) return for i, fermenter in cbpi.cache.get("fermenter").items(): if fermenter.state is not False: try: name = fermenter.name temp = fermenter.instance.get_temp() unit = cbpi.get_config_parameter("unit", "C") data = {"name": name, "temp": temp, "temp_unit": unit} response = requests.post(bf_uri + api_key, json=data) if response.status_code != 200: cbpi.notify( "Brewer's Friend Error", "Received unsuccessful response. Ensure API key is correct. HTTP Error Code: " + str(response.status_code), type="danger", timeout=None) except: cbpi.notify("Brewer's Friend Error", "Unable to send message.", type="danger", timeout=None) pass