|
|
@@ -48,6 +48,7 @@ class BeerXMLImport(FlaskView): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
steps = self.getSteps(id) |
|
|
steps = self.getSteps(id) |
|
|
|
|
|
boil_time_alerts = self.getBoilAlerts(id) |
|
|
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) |
|
|
@@ -67,8 +68,26 @@ class BeerXMLImport(FlaskView): |
|
|
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}}) |
|
|
Step.insert(**{"name": "ChilStep", "type": "ChilStep", "config": {"timer": 15}}) |
|
|
## Add cooking step |
|
|
|
|
|
Step.insert(**{"name": "Boil", "type": boilstep_type, "config": {"kettle": boil_kettle, "temp": boil_temp, "timer": boil_time}}) |
|
|
|
|
|
|
|
|
## Add boiling step |
|
|
|
|
|
Step.insert(**{ |
|
|
|
|
|
"name": "Boil", |
|
|
|
|
|
"type": boilstep_type, |
|
|
|
|
|
"config": { |
|
|
|
|
|
"kettle": boil_kettle, |
|
|
|
|
|
"temp": boil_temp, |
|
|
|
|
|
"timer": boil_time, |
|
|
|
|
|
## Beer XML defines additions as the total time spent in boiling, |
|
|
|
|
|
## CBP defines it as time-until-alert |
|
|
|
|
|
|
|
|
|
|
|
## Also, The model supports five boil-time additions. |
|
|
|
|
|
## Set the rest to None to signal them being absent |
|
|
|
|
|
"hop_1": boil_time - boil_time_alerts[0] if len(boil_time_alerts) >= 1 else None, |
|
|
|
|
|
"hop_2": boil_time - boil_time_alerts[1] if len(boil_time_alerts) >= 2 else None, |
|
|
|
|
|
"hop_3": boil_time - boil_time_alerts[2] if len(boil_time_alerts) >= 3 else None, |
|
|
|
|
|
"hop_4": boil_time - boil_time_alerts[3] if len(boil_time_alerts) >= 4 else None, |
|
|
|
|
|
"hop_5": boil_time - boil_time_alerts[4] if len(boil_time_alerts) >= 5 else None |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
## 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()) |
|
|
@@ -87,18 +106,40 @@ 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 getSteps(self, id): |
|
|
|
|
|
|
|
|
def getBoilAlerts(self, id): |
|
|
|
|
|
e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() |
|
|
|
|
|
|
|
|
|
|
|
recipe = e.find('./RECIPE[%s]' % (str(id))) |
|
|
|
|
|
alerts = [] |
|
|
|
|
|
for e in recipe.findall('./HOPS/HOP'): |
|
|
|
|
|
use = e.find('USE').text |
|
|
|
|
|
## Hops which are not used in the boil step should not cause alerts |
|
|
|
|
|
if use != 'Aroma' and use != 'Boil': |
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
alerts.append(float(e.find('TIME').text)) |
|
|
|
|
|
|
|
|
|
|
|
## There might also be miscelaneous additions during boild time |
|
|
|
|
|
for e in recipe.findall('MISCS/MISC[USE="Boil"]'): |
|
|
|
|
|
alerts.append(float(e.find('TIME').text)) |
|
|
|
|
|
|
|
|
|
|
|
## Dedupe and order the additions by their time, to prevent multiple alerts at the same time |
|
|
|
|
|
alerts = sorted(list(set(alerts))) |
|
|
|
|
|
|
|
|
|
|
|
## CBP should have these additions in reverse |
|
|
|
|
|
alerts.reverse() |
|
|
|
|
|
|
|
|
|
|
|
return alerts |
|
|
|
|
|
|
|
|
|
|
|
def getSteps(self, id): |
|
|
e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() |
|
|
e = xml.etree.ElementTree.parse(self.BEER_XML_FILE).getroot() |
|
|
steps = [] |
|
|
steps = [] |
|
|
for e in e.findall('./RECIPE[%s]/MASH/MASH_STEPS/MASH_STEP' % (str(id))): |
|
|
for e in e.findall('./RECIPE[%s]/MASH/MASH_STEPS/MASH_STEP' % (str(id))): |
|
|
|
|
|
|
|
|
if self.api.get_config_parameter("unit", "C") == "C": |
|
|
if self.api.get_config_parameter("unit", "C") == "C": |
|
|
temp = float(e.find("STEP_TEMP").text) |
|
|
temp = float(e.find("STEP_TEMP").text) |
|
|
else: |
|
|
else: |
|
|
temp = round(9.0 / 5.0 * float(e.find("STEP_TEMP").text) + 32, 2) |
|
|
temp = round(9.0 / 5.0 * float(e.find("STEP_TEMP").text) + 32, 2) |
|
|
|
|
|
|
|
|
steps.append({"name": e.find("NAME").text, "temp": temp, "timer": float(e.find("STEP_TIME").text)}) |
|
|
steps.append({"name": e.find("NAME").text, "temp": temp, "timer": float(e.find("STEP_TIME").text)}) |
|
|
|
|
|
|
|
|
return steps |
|
|
return steps |
|
|
|