diff --git a/floatpump/Core/Src/main.cpp b/floatpump/Core/Src/main.cpp index 4d0e409..7805fff 100644 --- a/floatpump/Core/Src/main.cpp +++ b/floatpump/Core/Src/main.cpp @@ -115,6 +115,12 @@ void CheckRefillConditions(Config_Store &cfg, io::PressureChannel &tankLevel, io } } +void SendUartString(UART_HandleTypeDef *huart, char out[]) { + HAL_UART_Transmit(huart, (uint8_t *) out, strlen(out), 500); + char newline[1] = {'\n'}; + HAL_UART_Transmit(huart, (uint8_t *) newline, 1, 100); +} + int main(void) { // Step 1: Initialize HAL @@ -128,7 +134,7 @@ int main(void) { //MX_RTC_Init(); MX_TIM2_Init(); MX_TIM3_Init(); - MX_USB_DEVICE_Init(); + //MX_USB_DEVICE_Init(); MX_ADC1_Init(); MX_I2C1_Init(); MX_USART1_UART_Init(); @@ -183,7 +189,8 @@ int main(void) { //Instantiate Input and Output modules io::PressureChannel tankLevel0(&hadc1, MPWR0_GPIO_Port, MPWR0_Pin, 50); - tankLevel0.LinkCalibConfig(Config_Store::getInstance().TankCalibLow.getLink(), Config_Store::getInstance().TankCalibHigh.getLink()); + tankLevel0.LinkCalibConfig(Config_Store::getInstance().TankCalibLow.getLink(), + Config_Store::getInstance().TankCalibHigh.getLink()); io::GPIChannel refillBlocker0(GPI0_GPIO_Port, GPI0_Pin); io::RelayChannel tankPump(OCHAN0_GPIO_Port, OCHAN0_Pin, true, io::RelayChannel::state::OFF); @@ -202,8 +209,13 @@ int main(void) { static int8_t history_h[59]; static int8_t history_d[23]; + static int8_t diff_hist_hour = 0; + static int8_t diff_hist_day = 0; + static uint16_t old_minute_counter = minute_counter; + SendUartString(&huart1, "Hello from FloatPUMP Controller"); + SendUartString(&huart1, {"Revision: " GIT_HASH}); while (1) { @@ -334,14 +346,42 @@ int main(void) { CheckRefillConditions(Config_Store::getInstance(), tankLevel0, refillBlocker0, refillPump); //Create history - if(old_minute_counter < minute_counter) { + if (old_minute_counter < minute_counter) { old_minute_counter = minute_counter; - history_h[minute_counter%60] = tankLevel0.getPercent(); - history_d[minute_counter/60] = tankLevel0.getPercent(); + history_h[minute_counter % 60] = tankLevel0.getPercent(); + history_d[minute_counter / 60] = tankLevel0.getPercent(); + + //Calculate diff to value 1h ago -> minute_counter+1's entry is always 60mins ago ! + diff_hist_hour = history_h[minute_counter % 60] - history_h[(minute_counter + 1) % 60]; + //Same here for daily history + diff_hist_day = history_d[minute_counter / 60] - history_d[(minute_counter + 60) / 60]; } HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET); HAL_Delay(1000); + + //Periodically send stats via uart in json format: + + char buffer[400]; + sprintf(buffer, "{" + "\"Status\": true, " + "\"TankLevel\": %hhd, " + "\"TankPump\": %s, " + "\"RefillPump\": %s, " + "\"RefillEmpty\": %s, " + "\"RefillCooldown\": %hhd, " + "\"HourlyHist\": %hhd, " + "\"DailyHist\": %hhd, " + "}", + tankLevel0.getPercent(), + (S_tankempty) ? "false" : "true", + (S_refilling) ? "true" : "false", + (S_refillempty) ? "true" : "false", + S_refillcooldown, + diff_hist_hour, + diff_hist_day); + SendUartString(&huart1, buffer); + //HAL_UART_Transmit(&huart1, (uint8_t*) buffer, sizeof(buffer), 100); } @@ -349,6 +389,45 @@ int main(void) { void SystemClock_Config(void) { + /*RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + *//** Configure the main internal regulator output voltage + *//* + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + *//** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + *//* + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSI; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 12; + RCC_OscInitStruct.PLL.PLLN = 144; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV6; + RCC_OscInitStruct.PLL.PLLQ = 3; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + Error_Handler(); + } + + *//** Initializes the CPU, AHB and APB buses clocks + *//* + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK + | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { + Error_Handler(); + }*/ + + //Workaround by using internal oscillator + //TODO: Fix this issue later, must work with HSE as well RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; @@ -360,15 +439,15 @@ void SystemClock_Config(void) { /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_LSI; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.LSEState = RCC_LSI_ON; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 12; - RCC_OscInitStruct.PLL.PLLN = 144; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV6; - RCC_OscInitStruct.PLL.PLLQ = 3; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 192; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV8; + RCC_OscInitStruct.PLL.PLLQ = 4; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } @@ -604,7 +683,7 @@ static void MX_USART1_UART_Init(void) { /* USER CODE END USART1_Init 1 */ huart1.Instance = USART1; - huart1.Init.BaudRate = 115200; + huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; diff --git a/net/tastmota-rules.txt b/net/tastmota-rules.txt new file mode 100644 index 0000000..99a05c4 --- /dev/null +++ b/net/tastmota-rules.txt @@ -0,0 +1,30 @@ +rule1 + ON SerialReceived#Status DO var1 %value% ENDON + ON SerialReceived#TankLevel DO var2 %value% ENDON + ON SerialReceived#TankPump DO var3 %value% ENDON + ON SerialReceived#RefillPump DO var4 %value% ENDON + ON SerialReceived#RefillEmpty DO var5 %value% ENDON + ON SerialReceived#RefillCooldown DO var6 %value% ENDON + ON SerialReceived#HourlyHist DO var7 %value% ENDON + ON SerialReceived#DailyHist DO var8 %value% ENDON + ON SerialReceived#Status DO publish /floatpump-stats {"Status": "%var1%", "TankLevel": "%var2%", "TankPump": "%var3%", "RefillPump": "%var4%", "RefillEmpty": "%var5%", "RefillCooldown": "%var6%", "HourlyHist": "%var7%", "DailyHist": "%var8%"} ENDON + +rule1 1 + +rule2 + ON System#Boot DO SerialBuffer 520 ENDON + +rule2 1 + +rule3 + ON System#Boot DO publish homeassistant/binary_sensor/floatpump1/config {"name": "FloatPump Controller Status", "unique_id": "floatpump-status", "state_topic": "/floatpump-stats", "payload_on": "TRUE", "payload_off": "FALSE", "value_template": "{{ value_json.Status }}", "device": { "name": "FloatPUMP Controller", "mf": "Robin Dietzel (robtor.de)", "cns": [["mac", "BC:DD:C2:26:39:36"]] }} ENDON + ON System#Boot DO publish homeassistant/binary_sensor/floatpump2/config {"name": "Tank Pump", "unique_id": "floatpump-tankpump-status", "icon": "mdi:water-pump", "state_topic": "/floatpump-stats", "payload_on": "TRUE", "payload_off": "FALSE", "value_template": "{{ value_json.TankPump }}", "device": { "name": "FloatPUMP Controller", "mf": "Robin Dietzel (robtor.de)", "cns": [["mac", "BC:DD:C2:26:39:36"]] }} ENDON + ON System#Boot DO publish homeassistant/binary_sensor/floatpump3/config {"name": "Refill Pump", "unique_id": "floatpump-refillpump-status", "icon": "mdi:water-sync", "state_topic": "/floatpump-stats", "payload_on": "TRUE", "payload_off": "FALSE", "value_template": "{{ value_json.RefillPump }}", "device": { "name": "FloatPUMP Controller", "mf": "Robin Dietzel (robtor.de)", "cns":[["mac", "BC:DD:C2:26:39:36"]] }} ENDON + ON System#Boot DO publish homeassistant/binary_sensor/floatpump4/config {"name": "Refill Source Empty", "unique_id": "floatpump-refillempty-status", "icon": "mdi:water-alert-outline", "state_topic": "/floatpump-stats", "payload_on": "TRUE", "payload_off": "FALSE", "value_template": "{{ value_json.RefillEmpty }}", "device": { "name": "FloatPUMP Controller", "mf": "Robin Dietzel (robtor.de)", "cns": [["mac", "BC:DD:C2:26:39:36"]] }} ENDON + ON System#Boot DO publish homeassistant/sensor/floatpump5/config {"name": "Tank Water Level", "unique_id": "floatpump-tanklevel", "icon": "mdi:car-coolant-level", "unit_of_measurement": "%", "state_topic": "/floatpump-stats", "value_template": "{{ value_json.TankLevel }}", "device": { "name": "FloatPUMP Controller", "mf": "Robin Dietzel (robtor.de)", "cns": [["mac", "BC:DD:C2:26:39:36"]] }} ENDON + ON System#Boot DO publish homeassistant/sensor/floatpump6/config {"name": "Refill Cooldown", "unique_id": "floatpump-refillcooldown", "icon": "mdi:clock-alert-outline", "unit_of_measurement": "min", "state_topic": "/floatpump-stats", "value_template": "{{ value_json.RefillCooldown }}", "device": { "name": "FloatPUMP Controller", "mf": "Robin Dietzel (robtor.de)", "cns": [["mac", "BC:DD:C2:26:39:36"]] }} ENDON + ON System#Boot DO publish homeassistant/sensor/floatpump7/config {"name": "Hourly Stats", "unique_id": "floatpump-hourly-stats", "icon": "mdi:chart-line", "unit_of_measurement": "%", "state_topic": "/floatpump-stats", "value_template": "{{ value_json.HourlyHist }}", "device": { "name": "FloatPUMP Controller", "mf": "Robin Dietzel (robtor.de)", "cns": [["mac", "BC:DD:C2:26:39:36"]] }} ENDON + ON System#Boot DO publish homeassistant/sensor/floatpump8/config {"name": "Daily Stats", "unique_id": "floatpump-daily-stats", "icon": "mdi:chart-line", "unit_of_measurement": "%", "state_topic": "/floatpump-stats", "value_template": "{{ value_json.DailyHist }}", "device": { "name": "FloatPUMP Controller", "mf": "Robin Dietzel (robtor.de)", "cns": [["mac", "BC:DD:C2:26:39:36"]] }} ENDON + + +rule3 1 \ No newline at end of file