From eda8b8311a93a2e9d381f6ba6dfa460338e3f4d6 Mon Sep 17 00:00:00 2001 From: LKosoj Date: Sun, 21 Apr 2024 20:50:29 +0300 Subject: [PATCH] optimization & add lua variable --- BK.h | 6 +- .../btn_button1.lua" | 14 + .../btn_button4.lua" | 2 + .../btn_button5.lua" | 2 + .../script.lua" | 41 +++ Samovar.h | 2 +- beer.h | 20 +- distiller.h | 8 +- logic.h | 28 +- lua.h | 16 +- .../Brewfather_BeerXML_HERMS_20240421.xml" | 233 ++++++++++++ ...genes Chocolate Cherry Stout 20240421.xml" | 338 ++++++++++++++++++ .../Sample Blonde Ale 20240421.xml" | 245 +++++++++++++ 13 files changed, 918 insertions(+), 37 deletions(-) create mode 100644 "Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button1.lua" create mode 100644 "Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button4.lua" create mode 100644 "Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button5.lua" create mode 100644 "Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/script.lua" create mode 100644 "\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Brewfather_BeerXML_HERMS_20240421.xml" create mode 100644 "\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Diogenes Chocolate Cherry Stout 20240421.xml" create mode 100644 "\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Sample Blonde Ale 20240421.xml" diff --git a/BK.h b/BK.h index 5af9cec6..c39e46ec 100644 --- a/BK.h +++ b/BK.h @@ -5,7 +5,7 @@ void bk_finish(); void set_power_mode(String Mode); void set_power(bool On); void create_data(); -void open_valve(bool Val); +void open_valve(bool Val, bool msg); void set_pump_pwm(float duty); void set_pump_speed_pid(float temp); void SendMsg(String m, MESSAGE_TYPE msg_type); @@ -61,7 +61,7 @@ void check_alarm_bk() { if (alarm_t_min > 0 && alarm_t_min <= millis()) alarm_t_min = 0; if (PowerOn && !valve_status && TankSensor.avgTemp >= OPEN_VALVE_TANK_TEMP) { - open_valve(true); + open_valve(true, true); #ifdef USE_WATER_PUMP set_pump_pwm(bk_pwm); #endif @@ -82,7 +82,7 @@ void check_alarm_bk() { } if (!PowerOn && !is_self_test && valve_status && WaterSensor.avgTemp <= TARGET_WATER_TEMP - 20) { - open_valve(false); + open_valve(false, true); #ifdef USE_WATER_PUMP if (pump_started) set_pump_pwm(0); #endif diff --git "a/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button1.lua" "b/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button1.lua" new file mode 100644 index 00000000..167b3b52 --- /dev/null +++ "b/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button1.lua" @@ -0,0 +1,14 @@ +--|Start/Stop^ +--setNumVariable("show_lua_script",0) -- включаем отладку в сом порт +if (getNumVariable("loop_lua_fl", "NUMERIC") + 0) == 0 then +setObject("ManPw",0) --ручной задатчик ТЭНа +setObject("R",0) --включить режим поиска давления захлёба +setObject("Pz",55) --давление захлёба, предварительно +setObject("Pold",0) --предыдущий замер давления для фильтра +setObject("t",0) --таймер +setNumVariable("loop_lua_fl", 1) +--setObject("otl",60) -- отладочная +else +setNumVariable("loop_lua_fl",0) -- выключаем циклическое исполнение луа-скриптов +print ("Ручной останов скрипта") +end diff --git "a/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button4.lua" "b/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button4.lua" new file mode 100644 index 00000000..74de3a4c --- /dev/null +++ "b/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button4.lua" @@ -0,0 +1,2 @@ + --|ТЭН ++^ +setObject("ManPw",100) \ No newline at end of file diff --git "a/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button5.lua" "b/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button5.lua" new file mode 100644 index 00000000..12961a94 --- /dev/null +++ "b/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/btn_button5.lua" @@ -0,0 +1,2 @@ + --|ТЭН --^ +setObject("ManPw",-100) \ No newline at end of file diff --git "a/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/script.lua" "b/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/script.lua" new file mode 100644 index 00000000..11cea828 --- /dev/null +++ "b/Lua_script/\320\227\320\260\321\205\320\273\320\265\320\261 \320\277\320\276 \320\264\320\260\321\202\321\207\320\270\320\272\321\203 \320\264\320\260\320\262\320\273\320\265\320\275\320\270\321\217/script.lua" @@ -0,0 +1,41 @@ +ManPw = getObject("ManPw","NUMERIC")+0 --читаем команды от кнопок +PwRd =getNumVariable("target_power_volt")+0 --читаем мощность/напряжение +-- Rten=16 Pw=Pw*Pw/Rten --перевод напряжения в мощность для не Stab AVR +Pw=PwRd +if getStrVariable("program_type")=="B" then --если работает строка отбора тела + S="" PS="" k=1 --масштаб воздействия + R = getObject("R","NUMERIC")+0 --режим + CP=getNumVariable("pressure_value")+0 --текущее давление + DZ=digitalRead(27) --датчик захлёба + Pz=getObject("Pz","NUMERIC")+0 --запомненное давление захлёба + t=getObject("t","NUMERIC")+0 if t>0 then setObject("t",t-1) end --таймер + --Pold=getObject("Pold","NUMERIC")+0 CP=(CP+Pold)/2 setObject("Pold",CP) --фильтр скачков датчика давления + + Pmin=Pz*0.4 --минимальное давление предзахлёба + if getState()==40 then Pmax=Pz*0.8 else --если пауза загрубляем верхний предел + Pmax=Pz*0.5 end -- максимальное давление, при паузе 80% от захлебного, при отборе 50% + dP=5 if CP>Pmax then dP=(CP-Pmax)*k elseif CP5 then dP=5 end + if R==0 then S=S.."Поиск P захлёба," + if DZ==0 then Pw=Pw+1 else setObject("R",1) setObject("Pz",CP) S=S.."Захлёб," end + elseif R==1 then + if DZ==1 then S=S.."Захлёб," setObject("Pz",CP) else S=S.."Предзахлёб," end + if CPPmax then --при давлении выше максимальной уставки + S=S.."Высокое давление," + if t<1 then --если таймер не взведен + Pw=Pw-dP setObject("t",20) end PS="-" end --убавляем мощность пропорционально отклонению давлениия и взводим таймер на 20 сек + end + S1=string.format("P=%.2f(%.1f-%.1f),", CP, Pmin, Pmax) + S2=string.format("ТЭН %d%sВт,", math.floor(PwRd), PS ) + --print("@clear@") + --print(S1..S2..S) + setLuaStatus(S1..S2.." "..S) +end +if ManPw ~= 0 then Pw=Pw+ManPw setObject("ManPw",0) end --реализуем команды от кнопок +if Pw~=PwRd and Pw>40 and Pw<2000 then --при условии, что на ТЭНе 40-2000Вт и исходную мощность надо менять +-- Pw=(Pw*Rten)^0.5 --перевод мощности в напряжение для не Stab AVR +setCurrentPower(Pw) end --регулируем ТЭН \ No newline at end of file diff --git a/Samovar.h b/Samovar.h index 5d07da50..14c051bd 100644 --- a/Samovar.h +++ b/Samovar.h @@ -5,7 +5,7 @@ #error This code is designed to run on ESP32 platform, not Arduino nor ESP8266! Please check your Tools->Board setting. #endif -#define SAMOVAR_VERSION F("6.18") +#define SAMOVAR_VERSION F("6.19") //#define __SAMOVAR_DEBUG diff --git a/beer.h b/beer.h index 7110d92b..40161354 100644 --- a/beer.h +++ b/beer.h @@ -67,7 +67,7 @@ void run_beer_program(byte num) { void beer_finish() { if (valve_status) { - open_valve(false); + open_valve(false, true); } #ifdef USE_WATER_PUMP if (pump_started) set_pump_pwm(0); @@ -110,8 +110,7 @@ void check_alarm_beer() { //Проверяем, что клапан воды охлаждения не открыт, когда не нужно if (program[ProgramNum].WType != "C" and program[ProgramNum].WType != "F" and valve_status && PowerOn) { //Закрываем клапан воды - open_valve(false); - SendMsg(("Закрыт клапан воды охлаждения!"), NOTIFY_MSG); + open_valve(false, false); } //Если программа - ожидание - ждем, ничего не делаем @@ -143,8 +142,7 @@ void check_alarm_beer() { if (temp <= program[ProgramNum].Temp - TankSensor.SetTemp) { if (valve_status) { //Закрываем клапан воды - open_valve(false); - SendMsg(("Закрыт клапан воды охлаждения!"), NOTIFY_MSG); + open_valve(false, false); } //Поддерживаем целевую температуру set_heater_state(program[ProgramNum].Temp, temp); @@ -154,8 +152,7 @@ void check_alarm_beer() { //Отключаем нагреватель setHeaterPosition(false); //Открываем клапан воды - open_valve(true); - SendMsg(("Открыт клапан воды охлаждения!"), NOTIFY_MSG); + open_valve(true, false); } } } else { @@ -164,8 +161,7 @@ void check_alarm_beer() { setHeaterPosition(false); //Закрываем клапан воды, если температура в кубе чуть меньше температурной уставки, чтобы часто не щелкать клапаном if ((temp < program[ProgramNum].Temp + TankSensor.SetTemp - 0.1) && valve_status && PowerOn) { - open_valve(false); - SendMsg(("Закрыт клапан воды охлаждения!"), NOTIFY_MSG); + open_valve(false, false); } } } @@ -198,8 +194,7 @@ void check_alarm_beer() { begintime = millis(); setHeaterPosition(false); //Открываем клапан воды - open_valve(true); - SendMsg(("Открыт клапан воды охлаждения!"), NOTIFY_MSG); + open_valve(true, false); #ifdef USE_WATER_PUMP if (pump_started) set_pump_pwm(1023); #endif @@ -207,8 +202,7 @@ void check_alarm_beer() { if (temp <= program[ProgramNum].Temp) { //Если температура упала //Закрываем клапан воды - open_valve(false); - SendMsg(("Закрыт клапан воды охлаждения!"), NOTIFY_MSG); + open_valve(false, false); //запускаем следующую программу run_beer_program(ProgramNum + 1); } diff --git a/distiller.h b/distiller.h index 436d8d8d..ba03e179 100644 --- a/distiller.h +++ b/distiller.h @@ -5,7 +5,7 @@ void distiller_finish(); void set_power_mode(String Mode); void set_power(bool On); void create_data(); -void open_valve(bool Val); +void open_valve(bool Val, bool msg); void set_pump_pwm(float duty); void set_pump_speed_pid(float temp); void set_dist_program(String WProgram); @@ -91,15 +91,15 @@ void check_alarm_distiller() { if (alarm_t_min > 0 && alarm_t_min <= millis()) alarm_t_min = 0; if (PowerOn && !valve_status && TankSensor.avgTemp >= OPEN_VALVE_TANK_TEMP) { - open_valve(true); + open_valve(true, true); } if (!valve_status) { - if (ACPSensor.avgTemp >= MAX_ACP_TEMP - 5) open_valve(true); + if (ACPSensor.avgTemp >= MAX_ACP_TEMP - 5) open_valve(true, true); } if (!PowerOn && !is_self_test && valve_status && WaterSensor.avgTemp <= SamSetup.SetWaterTemp - DELTA_T_CLOSE_VALVE) { - open_valve(false); + open_valve(false, true); #ifdef USE_WATER_PUMP if (pump_started) set_pump_pwm(0); #endif diff --git a/logic.h b/logic.h index bc176717..67c03d10 100644 --- a/logic.h +++ b/logic.h @@ -21,7 +21,7 @@ float get_temp_by_pressure(float start_pressure, float start_temp, float current unsigned int hexToDec(String hexString); void set_current_power(float Volt); void set_power_mode(String Mode); -void open_valve(bool Val); +void open_valve(bool Val, bool msg); void stopService(void); void startService(void); void reset_sensor_counter(void); @@ -105,7 +105,7 @@ void set_alarm() { } set_power(false); alarm_event = true; - open_valve(false); + open_valve(false, true); #ifdef USE_WATER_PUMP set_pump_pwm(0); #endif @@ -708,15 +708,15 @@ void check_alarm() { #endif if (!valve_status) { - if (ACPSensor.avgTemp >= MAX_ACP_TEMP - 5) open_valve(true); + if (ACPSensor.avgTemp >= MAX_ACP_TEMP - 5) open_valve(true, true); else if (TankSensor.avgTemp >= OPEN_VALVE_TANK_TEMP && PowerOn) { set_buzzer(true); - open_valve(true); + open_valve(true, true); } } if (!PowerOn && !is_self_test && valve_status && WaterSensor.avgTemp <= SamSetup.SetWaterTemp - DELTA_T_CLOSE_VALVE && ACPSensor.avgTemp <= MAX_ACP_TEMP - 10) { - open_valve(false); + open_valve(false, true); set_buzzer(true); #ifdef USE_WATER_PUMP if (pump_started) set_pump_pwm(0); @@ -836,14 +836,22 @@ void check_alarm() { #endif } -void open_valve(bool Val) { +void open_valve(bool Val, bool msg = true) { if (Val && !alarm_event) { valve_status = true; - SendMsg(("Откройте подачу воды!"), WARNING_MSG); + if (msg) { + SendMsg(("Откройте подачу воды!"), WARNING_MSG); + } else { + SendMsg(("Открыт клапан воды охлаждения!"), NOTIFY_MSG); + } digitalWrite(RELE_CHANNEL3, SamSetup.rele3); } else { valve_status = false; - SendMsg(("Закройте подачу воды!"), WARNING_MSG); + if (msg) { + SendMsg(("Закройте подачу воды!"), WARNING_MSG); + } else { + SendMsg(("Закрыт клапан воды охлаждения!"), NOTIFY_MSG); + } digitalWrite(RELE_CHANNEL3, !SamSetup.rele3); } } @@ -1101,7 +1109,7 @@ bool check_boiling() { void start_self_test(void) { is_self_test = true; SendMsg(("Запуск самотестирования."), NOTIFY_MSG); - open_valve(true); + open_valve(true, true); #ifdef USE_WATER_PUMP //включаем насос воды set_pump_pwm((PWM_START_VALUE + 20) * 10); @@ -1130,7 +1138,7 @@ void stop_self_test(void) { //выключаем насос воды set_pump_pwm(0); #endif - open_valve(false); + open_valve(false, true); set_capacity(0); stopService(); is_self_test = false; diff --git a/lua.h b/lua.h index 216b388f..89f81b1b 100644 --- a/lua.h +++ b/lua.h @@ -39,7 +39,7 @@ void load_lua_script(); void set_power(bool On); void SendMsg(String m, MESSAGE_TYPE msg_type); String get_global_variables(); -void open_valve(bool Val); +void open_valve(bool Val, bool msg); void set_current_power(float Volt); void set_body_temp(); void set_mixer(bool On); @@ -213,7 +213,7 @@ static int lua_wrapper_set_mixer(lua_State *lua_state) { static int lua_wrapper_open_valve(lua_State *lua_state) { vTaskDelay(5 / portTICK_PERIOD_MS); bool a = luaL_checkinteger(lua_state, 1); - open_valve(a); + open_valve(a, false); return 0; } @@ -425,6 +425,10 @@ static int lua_wrapper_get_num_variable(lua_State *lua_state) { a = water_pump_speed; } else if (Var == "pressure_value") { a = pressure_value; + } else if (Var == "PauseOn") { + a = PauseOn; + } else if (Var == "program_Wait") { + a = program_Wait; } else if (Var == "test_num_val") { a = test_num_val; } else if (Var != "") { @@ -909,10 +913,10 @@ String run_lua_string(String lstr) { WriteConsoleLog(F("--END LUA SCRIPT--")); } #ifdef USE_MQTT - String MsgPl = lstr; - MsgPl.replace(",", ";"); - MqttSendMsg(MsgPl + "," + NOTIFY_MSG, "msg"); -#endif + String MsgPl = lstr; + MsgPl.replace(",", ";"); + MqttSendMsg(MsgPl + "," + NOTIFY_MSG, "msg"); +#endif sr = lua.Lua_dostring(&lstr); sr.trim(); if (sr != "") { diff --git "a/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Brewfather_BeerXML_HERMS_20240421.xml" "b/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Brewfather_BeerXML_HERMS_20240421.xml" new file mode 100644 index 00000000..7ffa0afc --- /dev/null +++ "b/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Brewfather_BeerXML_HERMS_20240421.xml" @@ -0,0 +1,233 @@ + + + + Светлый лагер типа Урквела. Тест HERMS + 1 + All Grain + + + Tyranus Brewery + 43 + 51.5 + 60 + 90 + 1.048 + 1.013 + 4.59 % + 4.59 % + 37.5 + 1.048 SG + 1.013 SG + 5.1 SRM + 2.7 + + + default-5b932476 + Hallertau Magnum + 1 + 13 + 0.04 + Boil + +
Pellet
+ + +
+ + default-074d6898 + Saaz + 1 + 4.02 + 0.1 + Boil + +
Pellet
+ + +
+ + default-074d6898 + Saaz + 1 + 4.02 + 0.1 + Boil + +
Pellet
+ + +
+
+ + + sXoDRib0QkI3I9J4UDfvnsoXUH7Zai + Pilsner Premium + Grainrus + Russia + 1 + Grain + 6 + 80 + 1.878173 + false + false + NaN + + + default-901ce81 + Chateau Munich Light + Castle Malting + Belgium + 1 + Grain + 1 + 80 + 7.6 + false + false + 0 + + + tvoAwbmOj88qKVHVpIsPXLL1cDCOva + Vienna + Grainrus + Russia + 1 + Grain + 1 + 76.29 + 4.060914 + false + false + NaN + + + default-1c33f70 + Chateau Melano + Castle Malting + Belgium + 1 + Grain + 0.3 + 78 + 40.61 + false + false + 0 + + + + + default-3b1827 + Calcium Chloride (CaCl2) + 1 + Water Agent + Mash + + 0.0021 + 2.1 g + true + + + default-1f88df + Gypsum (CaSO4) + 1 + Water Agent + Mash + + 0.0021 + 2.1 g + true + + + default-07adb1 + Lactic Acid + 1 + Water Agent + Mash + + 0.009 + 9 ml + false + + + + + default-04d760 + Saflager Lager + 1 + Lager +
Dry
+ 4 + Fermentis + W-34/70 + 4 pkg + 75 + 12 + 15 +
+
+ + default-hf-mo + High fermentability plus mash out + 1 + 20 + + + Temperature + 1 + Temperature + 68 + 120 + 29.56 + + + Mash Out + 1 + Temperature + 78 + 10 + + + + + Grain Smasher Mk II 10G + 1 + 51.5 + 43 + 5 + 3 + 60 + 100 + 2.912621359223301 + true + + default-lager + Lager (Quick Method) + 5 + 5 + 10 + 2 + 13 + 1 + 17 + 1 + 19 +
+
\ No newline at end of file diff --git "a/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Diogenes Chocolate Cherry Stout 20240421.xml" "b/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Diogenes Chocolate Cherry Stout 20240421.xml" new file mode 100644 index 00000000..025872b5 --- /dev/null +++ "b/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Diogenes Chocolate Cherry Stout 20240421.xml" @@ -0,0 +1,338 @@ + + + + Diogenes Chocolate Cherry Stout + 1 + All Grain + Soak the cacao nibs in vodka for about a week. Add vodka and nibs to secondary. Add 150 ml tart cherry concentrate to secondary as well (I used Stanton Orchard’s Montmorency Tart Cherry Concentrate - available at Whole Foods Markets in the US). + + Warren L + 21 + 27.42 + 60 + 76.4 + 1.062 + 1.017 + 5.91 % + 5.91 % + 31.1 + 1.062 SG + 1.017 SG + 30.7 SRM + 2.4 + + + default-7f820fa1 + East Kent Goldings (EKG) + 1 + 4.5 + 0.0313 + Boil + +
Pellet
+ + +
+ + default-f158a0af + Fuggle + 1 + 4.3 + 0.0313 + Boil + +
Pellet
+ + +
+
+ + + default-5d5dbc5 + Pale Ale Malt 2-Row + Briess + US + 1 + Grain + 3.7 + 80 + 3.5 + false + false + 0 + + + default-f43f861 + Barley, Flaked + Briess + US + 1 + Grain + 0.82 + 77 + 1.7 + false + false + 0 + + + default-db3b872 + Chateau Special B + Castle Malting + Belgium + 1 + Grain + 0.31 + 77 + 152.4 + false + false + 0 + + + default-0035a11 + Munich Malt + Bairds + UK + 1 + Grain + 0.31 + 80.5 + 5 + false + false + 0 + + + default-a84cbb8 + Chocolate + Briess + US + 1 + Grain + 0.21 + 75 + 350 + false + false + 0 + + + default-56a32ca + Roasted Barley + Bairds + UK + 1 + Grain + 0.21 + 75 + 600 + false + false + 0 + + + default-1fe90ce + Carafa III + Weyermann + Germany + 1 + Grain + 0.05 + 77.9 + 525 + false + false + 0 + + + + + default-3b1827 + Calcium Chloride (CaCl2) + 1 + Water Agent + Mash + + 0.004336 + 4.336 g + true + + + default-1f88df + Gypsum (CaSO4) + 1 + Water Agent + Mash + + 0.004336 + 4.336 g + true + + + default-3b1827 + Calcium Chloride (CaCl2) + 1 + Water Agent + Sparge + + 0.001304 + 1.304 g + true + + + default-1f88df + Gypsum (CaSO4) + 1 + Water Agent + Sparge + + 0.001304 + 1.304 g + true + + + default-c70fea + Fermcap-S + 1 + Water Agent + Boil + + 6.472 + 6.472 drops + false + + + default-8mv12 + Whirlfloc + 1 + Fining + Boil + + 0.925 + 0.925 items + false + + + default-yn1j28sf + Yeast Nutrients + 1 + Other + Boil + + 0.0065487399 + 0.231 oz + true + + + default-6e6de6 + Clarity Ferm + 1 + Fining + Primary + + 0.925 + 0.925 items + false + + + default-c70fea + Fermcap-S + 1 + Water Agent + Primary + + 5.548 + 5.548 drops + false + + + default-54dcdb + Cacao Nibs + 1 + Flavor + Secondary + + 0.1048365367 + 3.698 oz + true + + + default-659bc2 + Montmorency Tart Cherry Concentrate + 1 + Flavor + Secondary + + 0.13869 + 138.69 ml + false + + + + + default-e294c5 + SafAle English Ale + 1 + Ale +
Dry
+ 1.8 + Fermentis + S-04 + 1.8 pkg + 75 + 15 + 20 +
+
+ + default-md + Moderate dextrinous + 1 + 20 + + + Temperature + 1 + Temperature + 68.9 + 45 + 20.45 + + + + + BrewZilla 35L Gen4 + 1 + 27.42 + 21 + 1 + 2.5 + 60 + 100 + 16.411378555798688 + true + + default + Ale + 1 + 14 + 20 +
+
\ No newline at end of file diff --git "a/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Sample Blonde Ale 20240421.xml" "b/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Sample Blonde Ale 20240421.xml" new file mode 100644 index 00000000..cfeb9b25 --- /dev/null +++ "b/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265 \321\200\320\265\321\206\320\265\320\277\321\202\321\213 \320\277\320\270\320\262\320\260/Sample Blonde Ale 20240421.xml" @@ -0,0 +1,245 @@ + + + + Sample Blonde Ale + 1 + All Grain + This is a sample recipe from Brewfather + + Brewfather + 23 + 29.5 + 90 + 72 + 1.044 + 1.008 + 4.73 % + 4.73 % + 19.8 + 1.044 SG + 1.008 SG + 4.3 SRM + 2.5 + + + default-0a53be2d + Summit + 1 + 17 + 0.005 + Boil + +
Pellet
+ + +
+ + default-074d6898 + Saaz + 1 + 3.75 + 0.02 + Boil + +
Pellet
+ + +
+ + default-620d1be4 + Amarillo + 1 + 9.2 + 0.005 + Boil + +
Pellet
+ + +
+ + default-074d6898 + Saaz + 1 + 3.75 + 0.02 + Aroma + +
Pellet
+ 80 + 80 +
+ + default-620d1be4 + Amarillo + 1 + 9.2 + 0.005 + Aroma + +
Pellet
+ 80 + 80 +
+ + default-620d1be4 + Amarillo + 1 + 9.2 + 0.02 + Dry Hop + +
Pellet
+ + +
+
+ + + default-592f3ac + Pale Ale + BestMalz + Germany + 1 + Grain + 2 + 78.26 + 2.5380711 + false + false + NaN + + + default-724b650 + Pilsen + BestMalz + Germany + 1 + Grain + 2 + 78.26 + 1.5228426 + false + false + NaN + + + default-1a4fffc + Caramel Pils + BestMalz + Germany + 1 + Grain + 0.57 + 71.74 + 2.5380711 + false + false + NaN + + + default-5b92ec4 + Pale Crystal Malt + Thomas Fawcett + United Kingdom + 1 + Grain + 0.1 + 74.4 + 38.071066 + false + false + NaN + + + + + default-9mb13 + Servomyces + 1 + Other + Boil + + 0.0002 + 0.2 g + true + + + default-8mv12 + Whirlfloc + 1 + Fining + Boil + + 0.5 + 0.5 items + false + + + + + default-016efc + Safale American + 1 + Ale +
Dry
+ 1 + Fermentis + US-05 + 1 pkg + 81 + 16 + 28 +
+
+ + default + High fermentability + 1 + 20 + + + Temperature + 1 + Temperature + 65 + 60 + 16.11 + + + + + Grainfather + 1 + 29.5 + 23 + 1 + 3.5 + 90 + 100 + 10.16949152542373 + true + + default + Ale + 1 + 14 + 20 +
+
\ No newline at end of file