| @@ -85,6 +85,7 @@ INSERT OR IGNORE INTO config VALUES ('sensor_cols', 4, 'select', 'Adjust the wid | |||||
| INSERT OR IGNORE INTO config VALUES ('unit', 'C', 'select', 'Temperature Unit', '["C","F"]'); | INSERT OR IGNORE INTO config VALUES ('unit', 'C', 'select', 'Temperature Unit', '["C","F"]'); | ||||
| INSERT OR IGNORE INTO config VALUES ('brewery_name', 'My Home Brewery', 'text', 'Your brewery name', NULL ); | INSERT OR IGNORE INTO config VALUES ('brewery_name', 'My Home Brewery', 'text', 'Your brewery name', NULL ); | ||||
| INSERT OR IGNORE INTO config VALUES ('buzzer', 16, 'select', 'Buzzer GPIO', '[16,17,18,19,20]'); | INSERT OR IGNORE INTO config VALUES ('buzzer', 16, 'select', 'Buzzer GPIO', '[16,17,18,19,20]'); | ||||
| INSERT OR IGNORE INTO config VALUES ('buzzer_beep_level', 'HIGH', 'select', 'Buzzer Logic Beep Level', '["HIGH", "LOW"]'); | |||||
| INSERT OR IGNORE INTO config VALUES ('setup', 'YES', 'select', 'Show the Setup dialog', '["YES","NO"]'); | INSERT OR IGNORE INTO config VALUES ('setup', 'YES', 'select', 'Show the Setup dialog', '["YES","NO"]'); | ||||
| INSERT OR IGNORE INTO config VALUES ('brew_name', '', 'text', 'Brew Name', NULL); | INSERT OR IGNORE INTO config VALUES ('brew_name', '', 'text', 'Brew Name', NULL); | ||||
| INSERT OR IGNORE INTO config VALUES ('donation_notification', 'YES', 'select', 'Disable Donation Notification', '["YES","NO"]'); | INSERT OR IGNORE INTO config VALUES ('donation_notification', 'YES', 'select', 'Disable Donation Notification', '["YES","NO"]'); | ||||
| @@ -19,7 +19,8 @@ show_menu () { | |||||
| "7" "Software Update (git pull)" \ | "7" "Software Update (git pull)" \ | ||||
| "8" "Reset File Changes (git reset --hard)" \ | "8" "Reset File Changes (git reset --hard)" \ | ||||
| "9" "Clear all logs" \ | "9" "Clear all logs" \ | ||||
| "10" "Reboot Raspberry Pi" 3>&1 1>&2 2>&3) | |||||
| "10" "Reboot Raspberry Pi" \ | |||||
| "11" "Stop CraftBeerPi, Clear logs, Start CraftBeerPi" 3>&1 1>&2 2>&3) | |||||
| BUTTON=$? | BUTTON=$? | ||||
| # Exit if user pressed cancel or escape | # Exit if user pressed cancel or escape | ||||
| @@ -143,6 +144,17 @@ show_menu () { | |||||
| show_menu | show_menu | ||||
| fi | fi | ||||
| ;; | ;; | ||||
| 11) | |||||
| confirmAnswer "Are you sure you want to reboot CraftBeerPi and delete all log files?" | |||||
| if [ $? = 0 ]; then | |||||
| sudo /etc/init.d/craftbeerpiboot stop | |||||
| sudo rm -rf logs/*.log | |||||
| sudo /etc/init.d/craftbeerpiboot start | |||||
| show_menu | |||||
| else | |||||
| show_menu | |||||
| fi | |||||
| ;; | |||||
| esac | esac | ||||
| fi | fi | ||||
| } | } | ||||
| @@ -160,18 +160,16 @@ class BoilStep(StepBase): | |||||
| temp = Property.Number("Temperature", configurable=True, default_value=100, description="Target temperature for boiling") | temp = Property.Number("Temperature", configurable=True, default_value=100, description="Target temperature for boiling") | ||||
| kettle = StepProperty.Kettle("Kettle", description="Kettle in which the boiling step takes place") | kettle = StepProperty.Kettle("Kettle", description="Kettle in which the boiling step takes place") | ||||
| timer = Property.Number("Timer in Minutes", configurable=True, default_value=90, description="Timer is started when target temperature is reached") | timer = Property.Number("Timer in Minutes", configurable=True, default_value=90, description="Timer is started when target temperature is reached") | ||||
| hop_1 = Property.Number("Hop 1 Addition", configurable=True, description="First Hop alert") | |||||
| hop_1 = Property.Number("Hop 1 Addition", configurable=True, description="Fist Hop alert") | |||||
| hop_1_added = Property.Number("",default_value=None) | hop_1_added = Property.Number("",default_value=None) | ||||
| hop_2 = Property.Number("Hop 2 Addition", configurable=True, description="Second Hop alert") | hop_2 = Property.Number("Hop 2 Addition", configurable=True, description="Second Hop alert") | ||||
| hop_2_added = Property.Number("", default_value=None) | hop_2_added = Property.Number("", default_value=None) | ||||
| hop_3 = Property.Number("Hop 3 Addition", configurable=True, description="Third Hop alert") | |||||
| hop_3_added = Property.Number("", default_value=None) | |||||
| hop_4 = Property.Number("Hop 4 Addition", configurable=True, description="Fourth Hop alert") | |||||
| hop_4_added = Property.Number("", default_value=None) | |||||
| hop_5 = Property.Number("Hop 5 Addition", configurable=True, description="Fifth Hop alert") | |||||
| hop_5_added = Property.Number("", default_value=None) | |||||
| fining = Property.Number("Fining Addition", configurable=True, default_value=15) | |||||
| fining_added = Property.Number("",default_value=None, description="Fining Agent Alert") | |||||
| hop_3 = Property.Number("Hop 3 Addition", configurable=True) | |||||
| hop_3_added = Property.Number("", default_value=None, description="Third Hop alert") | |||||
| hop_4 = Property.Number("Hop 4 Addition", configurable=True) | |||||
| hop_4_added = Property.Number("", default_value=None, description="Fourth Hop alert") | |||||
| hop_5 = Property.Number("Hop 5 Addition", configurable=True) | |||||
| hop_5_added = Property.Number("", default_value=None, description="Fives Hop alert") | |||||
| def init(self): | def init(self): | ||||
| ''' | ''' | ||||
| @@ -204,18 +202,11 @@ class BoilStep(StepBase): | |||||
| def check_hop_timer(self, number, value): | def check_hop_timer(self, number, value): | ||||
| if self.__getattribute__("hop_%s_added" % number) is not True and (int(value) * 60) == ( | |||||
| self.timer_end - int(time.time())): | |||||
| if self.__getattribute__("hop_%s_added" % number) is not True and time.time() > ( | |||||
| self.timer_end - (int(self.timer) * 60 - int(value) * 60)): | |||||
| self.__setattr__("hop_%s_added" % number, True) | self.__setattr__("hop_%s_added" % number, True) | ||||
| self.notify("Hop Alert", "Please add Hop %s" % number, timeout=None) | self.notify("Hop Alert", "Please add Hop %s" % number, timeout=None) | ||||
| def check_fining_timer(self, value): | |||||
| if self.__getattribute__("fining_added") is not True and (int(value) * 60) == ( | |||||
| self.timer_end - int(time.time())): | |||||
| self.__setattr__("fining_added", True) | |||||
| self.notify("Fining Alert", "Please add fining agent", timeout=None) | |||||
| def execute(self): | def execute(self): | ||||
| ''' | ''' | ||||
| This method is execute in an interval | This method is execute in an interval | ||||
| @@ -225,7 +216,6 @@ class BoilStep(StepBase): | |||||
| if self.get_kettle_temp(self.kettle) >= float(self.temp): | if self.get_kettle_temp(self.kettle) >= float(self.temp): | ||||
| # Check if Timer is Running | # Check if Timer is Running | ||||
| if self.is_timer_finished() is None: | if self.is_timer_finished() is None: | ||||
| self.notify("Boil Temp Reached", "Starting the boil timer") | |||||
| self.start_timer(int(self.timer) * 60) | self.start_timer(int(self.timer) * 60) | ||||
| else: | else: | ||||
| self.check_hop_timer(1, self.hop_1) | self.check_hop_timer(1, self.hop_1) | ||||
| @@ -233,8 +223,6 @@ class BoilStep(StepBase): | |||||
| self.check_hop_timer(3, self.hop_3) | self.check_hop_timer(3, self.hop_3) | ||||
| self.check_hop_timer(4, self.hop_4) | self.check_hop_timer(4, self.hop_4) | ||||
| self.check_hop_timer(5, self.hop_5) | self.check_hop_timer(5, self.hop_5) | ||||
| self.check_fining_timer(self.fining) | |||||
| # Check if timer finished and go to next step | # Check if timer finished and go to next step | ||||
| if self.is_timer_finished() == True: | if self.is_timer_finished() == True: | ||||
| self.notify("Boil Step Completed!", "Starting the next step", timeout=None) | self.notify("Boil Step Completed!", "Starting the next step", timeout=None) | ||||
| @@ -10,10 +10,11 @@ except Exception as e: | |||||
| class Buzzer(object): | class Buzzer(object): | ||||
| sound = ["H", 0.1, "L", 0.1, "H", 0.1, "L", 0.1, "H", 0.1, "L"] | sound = ["H", 0.1, "L", 0.1, "H", 0.1, "L", 0.1, "H", 0.1, "L"] | ||||
| def __init__(self, gpio): | |||||
| def __init__(self, gpio, beep_level): | |||||
| try: | try: | ||||
| cbpi.app.logger.info("INIT BUZZER NOW GPIO%s" % gpio) | cbpi.app.logger.info("INIT BUZZER NOW GPIO%s" % gpio) | ||||
| self.gpio = int(gpio) | self.gpio = int(gpio) | ||||
| self.beep_level = beep_level | |||||
| GPIO.setmode(GPIO.BCM) | GPIO.setmode(GPIO.BCM) | ||||
| GPIO.setup(self.gpio, GPIO.OUT) | GPIO.setup(self.gpio, GPIO.OUT) | ||||
| self.state = True | self.state = True | ||||
| @@ -31,10 +32,14 @@ class Buzzer(object): | |||||
| try: | try: | ||||
| for i in sound: | for i in sound: | ||||
| if (isinstance(i, str)): | if (isinstance(i, str)): | ||||
| if i == "H": | |||||
| if i == "H" and self.beep_level == "HIGH": | |||||
| GPIO.output(int(self.gpio), GPIO.HIGH) | GPIO.output(int(self.gpio), GPIO.HIGH) | ||||
| else: | |||||
| elif i == "H" and self.beep_level != "HIGH": | |||||
| GPIO.output(int(self.gpio), GPIO.LOW) | |||||
| elif i == "L" and self.beep_level == "HIGH": | |||||
| GPIO.output(int(self.gpio), GPIO.LOW) | GPIO.output(int(self.gpio), GPIO.LOW) | ||||
| else: | |||||
| GPIO.output(int(self.gpio), GPIO.HIGH) | |||||
| else: | else: | ||||
| time.sleep(i) | time.sleep(i) | ||||
| except Exception as e: | except Exception as e: | ||||
| @@ -45,6 +50,8 @@ class Buzzer(object): | |||||
| @cbpi.initalizer(order=1) | @cbpi.initalizer(order=1) | ||||
| def init(cbpi): | def init(cbpi): | ||||
| gpio = cbpi.get_config_parameter("buzzer", 16) | gpio = cbpi.get_config_parameter("buzzer", 16) | ||||
| cbpi.buzzer = Buzzer(gpio) | |||||
| beep_level = cbpi.get_config_parameter("buzzer_beep_level", "HIGH") | |||||
| cbpi.buzzer = Buzzer(gpio, beep_level) | |||||
| cbpi.beep() | cbpi.beep() | ||||
| cbpi.app.logger.info("INIT OK") | cbpi.app.logger.info("INIT OK") | ||||
| @@ -51,8 +51,6 @@ class BeerXMLImport(FlaskView): | |||||
| name = self.getRecipeName(id) | name = self.getRecipeName(id) | ||||
| self.api.set_config_parameter("brew_name", name) | self.api.set_config_parameter("brew_name", name) | ||||
| boil_time = self.getBoilTime(id) | boil_time = self.getBoilTime(id) | ||||
| infuse = self.getMashinTemp(id) | |||||
| mashinstep_type = cbpi.get_config_parameter("step_mashin", "MashInStep") | |||||
| mashstep_type = cbpi.get_config_parameter("step_mash", "MashStep") | mashstep_type = cbpi.get_config_parameter("step_mash", "MashStep") | ||||
| mash_kettle = cbpi.get_config_parameter("step_mash_kettle", None) | mash_kettle = cbpi.get_config_parameter("step_mash_kettle", None) | ||||
| @@ -66,13 +64,11 @@ class BeerXMLImport(FlaskView): | |||||
| try: | try: | ||||
| ## Add Mashin step | |||||
| Step.insert(**{"name": "MashIn", "type": mashinstep_type, "config": {"kettle": mash_kettle, "temp": infuse}}) | |||||
| for row in steps: | for row in steps: | ||||
| Step.insert(**{"name": row.get("name"), "type": mashstep_type, "config": {"kettle": mash_kettle, "temp": float(row.get("temp")), "timer": row.get("timer")}}) | Step.insert(**{"name": row.get("name"), "type": mashstep_type, "config": {"kettle": mash_kettle, "temp": float(row.get("temp")), "timer": row.get("timer")}}) | ||||
| Step.insert(**{"name": "ChilStep", "type": "ChilStep", "config": {"timer": 15}}) | |||||
| ## Add cooking step | ## Add cooking step | ||||
| Step.insert(**{"name": "Boil", "type": boilstep_type, "config": {"kettle": boil_kettle, "temp": boil_temp, "timer": boil_time}}) | Step.insert(**{"name": "Boil", "type": boilstep_type, "config": {"kettle": boil_kettle, "temp": boil_temp, "timer": boil_time}}) | ||||
| Step.insert(**{"name": "ChilStep", "type": "ChilStep", "config": {"timer": 15}}) | |||||
| ## Add Whirlpool step | ## Add Whirlpool step | ||||
| Step.insert(**{"name": "Whirlpool", "type": "ChilStep", "config": {"timer": 15}}) | Step.insert(**{"name": "Whirlpool", "type": "ChilStep", "config": {"timer": 15}}) | ||||
| self.api.emit("UPDATE_ALL_STEPS", Step.get_all()) | self.api.emit("UPDATE_ALL_STEPS", Step.get_all()) | ||||
| @@ -91,14 +87,6 @@ class BeerXMLImport(FlaskView): | |||||
| e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() | e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() | ||||
| return float(e.find('./RECIPE[%s]/BOIL_TIME' % (str(id))).text) | return float(e.find('./RECIPE[%s]/BOIL_TIME' % (str(id))).text) | ||||
| def getMashinTemp(self, id): | |||||
| e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() | |||||
| tempstr = e.find('./RECIPE[%s]/MASH/MASH_STEPS/MASH_STEP/INFUSE_TEMP' % (str(id))).text | |||||
| val = tempstr[:-1] | |||||
| infuse = float(val.rstrip()) | |||||
| return infuse | |||||
| def getSteps(self, id): | def getSteps(self, id): | ||||