diff --git a/pytboss/grills.json b/pytboss/grills.json index d5ff04f..320afff 100644 --- a/pytboss/grills.json +++ b/pytboss/grills.json @@ -1427,9 +1427,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2023-06-13T15:09:01.000000Z", @@ -1591,9 +1591,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -1755,9 +1755,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -1919,9 +1919,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2024-09-10T20:26:48.000000Z", @@ -2083,9 +2083,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -2223,9 +2223,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2023-06-13T14:57:42.000000Z", @@ -2387,9 +2387,9 @@ "name": "PBG", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:34:20.000000Z" + "updated_at": "2025-09-17T20:50:05.000000Z" }, "control_board_id": 3, "created_at": "2022-07-13T04:29:24.000000Z", @@ -2551,9 +2551,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -2715,9 +2715,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -2879,9 +2879,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -3043,9 +3043,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -3207,9 +3207,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -3371,9 +3371,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -3535,9 +3535,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -3699,9 +3699,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -3863,9 +3863,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -4027,9 +4027,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -4191,9 +4191,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -4355,9 +4355,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -4495,9 +4495,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2025-04-29T22:52:55.000000Z", @@ -4527,6 +4527,182 @@ "temp_increment": "180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420/425/430/435/440/445/450/455/460/465/470/475/480/485/490/495/500", "updated_at": "2025-04-29T22:52:55.000000Z" }, + "PB1020DX": { + "category": null, + "celsius_temp_increment": null, + "control_board": { + "control_board_commands": [ + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0B01FF", + "id": 198, + "name": "Get Grill Status", + "slug": "get-status", + "updated_at": "2025-06-26T21:27:12.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0C01FF", + "id": 199, + "name": "Get Grill/Probes Temperatures", + "slug": "get-temperatures", + "updated_at": "2025-06-26T21:27:12.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0902FF", + "id": 200, + "name": "Set Temperature to Celsius", + "slug": "set-celsius", + "updated_at": "2025-06-26T21:27:12.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0901FF", + "id": 201, + "name": "Set Temperature to Fahrenheit", + "slug": "set-fahrenheit", + "updated_at": "2025-06-26T21:27:12.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": "let temp = arguments[1] === false ? Math.round(((arguments[0] * 1.8)+ 32)/5) * 5 : arguments[0]; let _hundreds = Math.floor(temp/100); let _tens = Math.floor((temp % 100) / 10); let _ones = Math.floor(temp % 10); return 'FE0502'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "hexadecimal": null, + "id": 202, + "name": "Set Probe 1 Temperature", + "slug": "set-probe-1-temperature", + "updated_at": "2025-08-14T17:29:11.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": "let temp = arguments[1] === false ? Math.round(((arguments[0] * 1.8)+ 32)/5) * 5 : arguments[0]; let _hundreds = Math.floor(temp/100); let _tens = Math.floor((temp % 100) / 10); let _ones = Math.floor(temp % 10); return 'FE0501'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "hexadecimal": null, + "id": 203, + "name": "Set Grill Temperature", + "slug": "set-temperature", + "updated_at": "2025-08-14T17:29:34.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0202FF", + "id": 204, + "name": "Turn Light Off", + "slug": "turn-light-off", + "updated_at": "2025-06-26T21:27:12.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0201FF", + "id": 205, + "name": "Turn Light On", + "slug": "turn-light-on", + "updated_at": "2025-06-26T21:27:12.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0102FF", + "id": 206, + "name": "Turn Grill Off", + "slug": "turn-off", + "updated_at": "2025-06-26T21:27:12.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0800FF", + "id": 207, + "name": "Turn Primer Motor Off", + "slug": "turn-primer-motor-off", + "updated_at": "2025-06-26T21:27:12.000000Z" + }, + { + "control_board_id": 21, + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0801FF", + "id": 208, + "name": "Turn Primer Motor On", + "slug": "turn-primer-motor-on", + "updated_at": "2025-06-26T21:27:12.000000Z" + } + ], + "created_at": "2025-06-26T21:27:12.000000Z", + "deleted_at": null, + "id": 21, + "name": "PBL3", + "platform_id": 3, + "site_id": 1, + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n} */\r\nreturn status;", + "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nconst temps = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\nconsole.log(\"Temp function\", temps, temps.isFahrenheit);\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n console.log(\"Temp function - converted\", temps);\r\n\r\n}\r\n\r\nreturn temps;", + "updated_at": "2025-09-17T20:58:15.000000Z" + }, + "control_board_id": 21, + "created_at": "2025-09-17T16:51:42.000000Z", + "deleted_at": null, + "description": null, + "enabled": 1, + "friendly_name": null, + "has_fc_functionality": 1, + "has_indicators": 0, + "has_mpc": 0, + "has_recipe_functionality": 0, + "id": 147, + "image": null, + "image_url": "Https://dansons-mobile.s3.dualstack.us-east-1.amazonaws.com/grill-images/PB1020DX.png", + "lights": 0, + "manual_url": "https://dansons-mobile.s3.dualstack.us-east-1.amazonaws.com/grill-manuals/DX-Series/11194_PB1020DX_owners_manual.pdf", + "max_temp": "500", + "meat_probes": 2, + "min_temp": "180", + "name": "PB1020DX", + "name_text_color": "#A1A1A1", + "part_number": "PB1020DX", + "screen_orientation": "Horizontal", + "shopify_product_id": null, + "site_id": 1, + "sku": null, + "temp_increment": "180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420/425/430/435/440/445/450/455/460/465/470/475/480/485/490/495/500", + "updated_at": "2025-09-17T22:53:44.000000Z" + }, "PB1020NXW": { "category": null, "celsius_temp_increment": null, @@ -4635,9 +4811,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2025-04-29T22:49:27.000000Z", @@ -4799,9 +4975,9 @@ "name": "PBE", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 0 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 0 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n /* p1Target: p1Target !== 0 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 0 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),*/\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 0 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 0 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-12-17T18:28:31.000000Z" + "updated_at": "2025-09-17T20:55:09.000000Z" }, "control_board_id": 15, "created_at": "2024-11-14T21:56:38.000000Z", @@ -4963,9 +5139,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -5127,9 +5303,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -5303,9 +5479,9 @@ "name": "PBL", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n// p1Target: convertTemperature(parts, 2),\r\n// p1Temp: convertTemperature(parts, 5),\r\n// p2Temp: convertTemperature(parts, 8),\r\n// p3Temp: convertTemperature(parts, 11),\r\n// p4Temp: convertTemperature(parts, 14),\r\n// smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:45:46.000000Z" + "updated_at": "2025-09-17T20:49:33.000000Z" }, "control_board_id": 1, "created_at": "2022-07-13T04:29:24.000000Z", @@ -5479,9 +5655,9 @@ "name": "PBL", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n// p1Target: convertTemperature(parts, 2),\r\n// p1Temp: convertTemperature(parts, 5),\r\n// p2Temp: convertTemperature(parts, 8),\r\n// p3Temp: convertTemperature(parts, 11),\r\n// p4Temp: convertTemperature(parts, 14),\r\n// smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:45:46.000000Z" + "updated_at": "2025-09-17T20:49:33.000000Z" }, "control_board_id": 1, "created_at": "2023-10-16T22:32:12.000000Z", @@ -5643,9 +5819,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -5807,9 +5983,9 @@ "name": "PBC2", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) { return null; } const parts = parseHexMessage(message); if (parts < 44) { return null; } const status = { /*p1Target: convertTemperature(parts, 2),*/ p1Temp: convertTemperature(parts, 5), p2Temp: convertTemperature(parts, 8), p3Temp: convertTemperature(parts, 11), p4Temp: convertTemperature(parts, 14), smokerActTemp: convertTemperature(parts, 17), moduleIsOn: parts[24] === 1, err1: parts[25] === 1, err2: parts[26] === 1, err3: parts[27] === 1, highTempErr: parts[28] === 1, fanErr: parts[29] === 1, hotErr: parts[30] === 1, motorErr: parts[31] === 1, noPellets: parts[32] === 1, erL: parts[33] === 1, fanState: parts[34] === 1, hotState: parts[35] === 1, motorState: parts[36] === 1, lightState: parts[37] === 1, primeState: parts[38] === 1, isFahrenheit: parts[39] === 1, recipeStep: parts[40], recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43], }; switch (parts[23]) { case 1: status.grillSetTemp = convertTemperature(parts, 20); break; case 2: status.grillTemp = convertTemperature(parts, 20); break; } return status;", - "temperature_function": "if (!message.startsWith(\"FE0C\")) { return null; } const parts = parseHexMessage(message); if (parts < 27) { return null; } return { /* p1Target: convertTemperature(parts, 2),*/ p1Temp: convertTemperature(parts, 5), p2Temp: convertTemperature(parts, 8), p3Temp: convertTemperature(parts, 11), p4Temp: convertTemperature(parts, 14), grillSetTemp: convertTemperature(parts, 20), grillTemp: convertTemperature(parts, 23), smokerActTemp: convertTemperature(parts, 17), isFahrenheit: parts[26] === 1, };", - "updated_at": "2025-09-02T21:50:59.000000Z" + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", + "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", + "updated_at": "2025-09-17T20:56:39.000000Z" }, "control_board_id": 17, "created_at": "2024-09-10T15:33:41.000000Z", @@ -5995,9 +6171,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2023-02-01T16:44:09.000000Z", @@ -6171,9 +6347,9 @@ "name": "PBL3", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n} */\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nconst temps = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\nconsole.log(\"Temp function\", temps, temps.isFahrenheit);\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n console.log(\"Temp function - converted\", temps);\r\n\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-08-14T17:28:36.000000Z" + "updated_at": "2025-09-17T20:58:15.000000Z" }, "control_board_id": 21, "created_at": "2025-07-17T19:32:19.000000Z", @@ -6335,9 +6511,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -6511,9 +6687,9 @@ "name": "PBL", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n// p1Target: convertTemperature(parts, 2),\r\n// p1Temp: convertTemperature(parts, 5),\r\n// p2Temp: convertTemperature(parts, 8),\r\n// p3Temp: convertTemperature(parts, 11),\r\n// p4Temp: convertTemperature(parts, 14),\r\n// smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:45:46.000000Z" + "updated_at": "2025-09-17T20:49:33.000000Z" }, "control_board_id": 1, "created_at": "2022-07-13T04:29:24.000000Z", @@ -6699,9 +6875,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2022-11-09T23:16:07.000000Z", @@ -6863,9 +7039,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -7003,9 +7179,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2022-07-13T04:29:24.000000Z", @@ -7167,9 +7343,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -7331,9 +7507,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -7519,9 +7695,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2025-03-17T22:28:05.000000Z", @@ -7707,9 +7883,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2025-03-17T22:26:24.000000Z", @@ -7895,9 +8071,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2025-03-27T18:59:55.000000Z", @@ -8035,9 +8211,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2022-07-13T04:29:24.000000Z", @@ -8223,9 +8399,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2025-01-22T23:07:04.000000Z", @@ -8411,9 +8587,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2024-11-05T23:07:43.000000Z", @@ -8599,9 +8775,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2024-01-04T20:56:02.000000Z", @@ -8763,9 +8939,9 @@ "name": "PBG", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:34:20.000000Z" + "updated_at": "2025-09-17T20:50:05.000000Z" }, "control_board_id": 3, "created_at": "2022-07-13T04:29:24.000000Z", @@ -8927,9 +9103,9 @@ "name": "PBG", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:34:20.000000Z" + "updated_at": "2025-09-17T20:50:05.000000Z" }, "control_board_id": 3, "created_at": "2024-09-13T21:25:53.000000Z", @@ -9115,9 +9291,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2025-03-17T22:33:33.000000Z", @@ -9303,9 +9479,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2025-03-17T22:37:22.000000Z", @@ -9491,9 +9667,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2024-09-17T21:37:19.000000Z", @@ -9679,9 +9855,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2024-08-27T17:32:23.000000Z", @@ -9819,9 +9995,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2022-07-13T04:29:24.000000Z", @@ -9959,9 +10135,9 @@ "name": "PBM2", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-09-02T21:51:15.000000Z" + "updated_at": "2025-09-17T20:57:56.000000Z" }, "control_board_id": 20, "created_at": "2025-07-28T21:12:43.000000Z", @@ -10099,9 +10275,9 @@ "name": "PBM2", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-09-02T21:51:15.000000Z" + "updated_at": "2025-09-17T20:57:56.000000Z" }, "control_board_id": 20, "created_at": "2025-05-27T22:51:16.000000Z", @@ -10287,9 +10463,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2025-03-17T22:29:41.000000Z", @@ -10475,9 +10651,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2025-03-17T22:35:27.000000Z", @@ -10639,9 +10815,9 @@ "name": "PBD", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n /*p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),*/\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nreturn {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};", - "updated_at": "2023-01-25T12:01:54.000000Z" + "updated_at": "2025-09-17T20:53:27.000000Z" }, "control_board_id": 12, "created_at": "2023-01-25T12:01:10.000000Z", @@ -10827,9 +11003,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2025-04-23T21:44:10.000000Z", @@ -10967,9 +11143,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2022-07-13T04:29:24.000000Z", @@ -11155,9 +11331,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2025-01-22T23:09:48.000000Z", @@ -11319,9 +11495,9 @@ "name": "PBE", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 0 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 0 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n /* p1Target: p1Target !== 0 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 0 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),*/\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 0 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 0 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-12-17T18:28:31.000000Z" + "updated_at": "2025-09-17T20:55:09.000000Z" }, "control_board_id": 15, "created_at": "2023-12-08T17:07:55.000000Z", @@ -11507,9 +11683,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2024-09-17T21:42:01.000000Z", @@ -11683,9 +11859,9 @@ "name": "PBL", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n// p1Target: convertTemperature(parts, 2),\r\n// p1Temp: convertTemperature(parts, 5),\r\n// p2Temp: convertTemperature(parts, 8),\r\n// p3Temp: convertTemperature(parts, 11),\r\n// p4Temp: convertTemperature(parts, 14),\r\n// smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:45:46.000000Z" + "updated_at": "2025-09-17T20:49:33.000000Z" }, "control_board_id": 1, "created_at": "2022-07-13T04:29:24.000000Z", @@ -11859,9 +12035,9 @@ "name": "PBP", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /* p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2023-03-20T11:44:59.000000Z" + "updated_at": "2025-09-17T20:53:56.000000Z" }, "control_board_id": 13, "created_at": "2022-07-13T04:29:24.000000Z", @@ -12047,9 +12223,9 @@ "name": "PBA", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n// p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n// p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n// p1Temp: convertTemperature(parts, 8),\r\n// p2Temp: convertTemperature(parts, 11),\r\n// p3Temp: convertTemperature(parts, 14),\r\n// p4Temp: convertTemperature(parts, 17),\r\n// smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", - "updated_at": "2024-09-26T21:19:14.000000Z" + "updated_at": "2025-09-17T20:48:53.000000Z" }, "control_board_id": 10, "created_at": "2022-11-09T23:18:25.000000Z", @@ -12235,9 +12411,9 @@ "name": "PBT", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2023-01-11T15:19:36.000000Z" + "updated_at": "2025-09-17T20:52:13.000000Z" }, "control_board_id": 7, "created_at": "2023-01-10T11:58:26.000000Z", @@ -12267,193 +12443,381 @@ "temp_increment": "180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420/425/430/435/440/445/450/455/460/465/470/475/480/485/490/495/500", "updated_at": "2024-08-13T16:23:57.000000Z" }, - "PB1600PSE": { + "PB1600PS4": { "category": null, "celsius_temp_increment": null, "control_board": { "control_board_commands": [ { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0B01FF", - "id": 83, + "id": 59, "name": "Get Grill Status", "slug": "get-status", "updated_at": null }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0C01FF", - "id": 84, + "id": 60, "name": "Get Grill/Probes Temperatures", "slug": "get-temperatures", "updated_at": null }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0902FF", - "id": 85, + "id": 61, "name": "Set Temperature to Celsius", "slug": "set-celsius", "updated_at": null }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0901FF", - "id": 86, + "id": 62, "name": "Set Temperature to Fahrenheit", "slug": "set-fahrenheit", "updated_at": null }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, - "function": "let _hundreds = Math.floor(arguments[0]/100); let _tens = Math.floor((arguments[0] % 100) / 10); let _ones = Math.floor(arguments[0] % 10); return 'FE0502'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "function": "let temp = arguments[1] === false ? Math.round(((arguments[0] * 1.8)+ 32)/5) * 5 : arguments[0]; let _hundreds = Math.floor(temp/100); let _tens = Math.floor((temp % 100) / 10); let _ones = Math.floor(temp % 10); return 'FE0502'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", "hexadecimal": null, - "id": 87, + "id": 63, "name": "Set Probe 1 Temperature", "slug": "set-probe-1-temperature", - "updated_at": null + "updated_at": "2023-01-11T15:20:42.000000Z" }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, - "function": "let _hundreds = Math.floor(arguments[0]/100); let _tens = Math.floor((arguments[0] % 100) / 10); let _ones = Math.floor(arguments[0] % 10); return 'FE0501'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "function": "let temp = arguments[1] === false ? Math.round(((arguments[0] * 1.8)+ 32)/5) * 5 : arguments[0]; let _hundreds = Math.floor(temp/100); let _tens = Math.floor((temp % 100) / 10); let _ones = Math.floor(temp % 10); return 'FE0501'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", "hexadecimal": null, - "id": 88, + "id": 64, "name": "Set Grill Temperature", "slug": "set-temperature", - "updated_at": null + "updated_at": "2023-01-11T15:21:06.000000Z" }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0200FF", - "id": 89, + "id": 65, "name": "Turn Light Off", "slug": "turn-light-off", "updated_at": null }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0201FF", - "id": 90, + "id": 66, "name": "Turn Light On", "slug": "turn-light-on", "updated_at": null }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0102FF", - "id": 91, + "id": 67, "name": "Turn Grill Off", "slug": "turn-off", "updated_at": null }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0800FF", - "id": 93, + "id": 69, "name": "Turn Primer Motor Off", "slug": "turn-primer-motor-off", "updated_at": null }, { - "control_board_id": 11, + "control_board_id": 7, "created_at": null, "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0801FF", - "id": 94, + "id": 70, "name": "Turn Primer Motor On", "slug": "turn-primer-motor-on", "updated_at": null }, { - "control_board_id": 11, - "created_at": "2023-01-03T10:03:36.000000Z", + "control_board_id": 7, + "created_at": "2023-01-11T15:20:22.000000Z", "deleted_at": null, - "description": "set the target temperature of probe #2", - "function": "let _hundreds = Math.floor(arguments[0]/100); let _tens = Math.floor((arguments[0] % 100) / 10); let _ones = Math.floor(arguments[0] % 10); return 'FE0503'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "description": "Set Probe 2 temperature", + "function": "let temp = arguments[1] === false ? Math.round(((arguments[0] * 1.8)+ 32)/5) * 5 : arguments[0]; let _hundreds = Math.floor(temp/100); let _tens = Math.floor((temp % 100) / 10); let _ones = Math.floor(temp % 10); return 'FE0503'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", "hexadecimal": null, - "id": 116, + "id": 117, "name": "Set Probe 2 Temperature", "slug": "set-probe-2-temperature", - "updated_at": "2023-01-03T10:03:36.000000Z" + "updated_at": "2023-01-11T15:20:22.000000Z" } ], "created_at": "2022-06-27T00:00:00.000000Z", "deleted_at": null, - "id": 11, - "name": "PBB", - "platform_id": 2, + "id": 7, + "name": "PBT", + "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nreturn status;", - "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nreturn {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};", - "updated_at": "2022-12-22T11:45:57.000000Z" + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n/* p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20), */\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*switch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p2Target = ftoc(status.p2Target);\r\n}*/\r\n\r\nreturn status;", + "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst temps = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", + "updated_at": "2025-09-17T20:52:13.000000Z" }, - "control_board_id": 11, - "created_at": "2022-11-09T23:20:07.000000Z", + "control_board_id": 7, + "created_at": "2025-09-17T16:34:30.000000Z", "deleted_at": null, "description": null, "enabled": 1, - "friendly_name": "", + "friendly_name": null, "has_fc_functionality": 1, "has_indicators": 0, "has_mpc": 0, "has_recipe_functionality": 0, - "id": 76, + "id": 145, "image": null, - "image_url": "https://dansons-mobile.s3.us-east-1.amazonaws.com/grill-images/PB1600PS.Elite2024.png", - "lights": 1, - "manual_url": "https://dansons-mobile.s3.us-east-1.amazonaws.com/grill-manuals/Pro-Series/10982_PB1600PSE_manual_110V_EN_FR_ES.pdf", + "image_url": "https://dansons-mobile.s3.dualstack.us-east-1.amazonaws.com/grill-images/PB1600PS4.png", + "lights": 0, + "manual_url": "https://dansons-mobile.s3.dualstack.us-east-1.amazonaws.com/grill-manuals/Pro-Series/11191_PB1600PS4_owners_manual.pdf", "max_temp": "500", "meat_probes": 2, - "min_temp": "150", - "name": "PB1600PSE", + "min_temp": "180", + "name": "PB1600PS4", "name_text_color": "#A1A1A1", - "part_number": "PB1600PSE", + "part_number": "PB1600PS4", "screen_orientation": "Horizontal", "shopify_product_id": null, "site_id": 1, "sku": null, - "temp_increment": "150/155/160/165/170/175/180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420/425/430/435/440/445/450/455/460/465/470/475/480/485/490/495/500", - "updated_at": "2024-08-12T22:55:48.000000Z" + "temp_increment": "180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420/425/430/435/440/445/450/455/460/465/470/475/480/485/490/495/500", + "updated_at": "2025-09-17T22:54:38.000000Z" + }, + "PB1600PSE": { + "category": null, + "celsius_temp_increment": null, + "control_board": { + "control_board_commands": [ + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0B01FF", + "id": 83, + "name": "Get Grill Status", + "slug": "get-status", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0C01FF", + "id": 84, + "name": "Get Grill/Probes Temperatures", + "slug": "get-temperatures", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0902FF", + "id": 85, + "name": "Set Temperature to Celsius", + "slug": "set-celsius", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0901FF", + "id": 86, + "name": "Set Temperature to Fahrenheit", + "slug": "set-fahrenheit", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": "let _hundreds = Math.floor(arguments[0]/100); let _tens = Math.floor((arguments[0] % 100) / 10); let _ones = Math.floor(arguments[0] % 10); return 'FE0502'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "hexadecimal": null, + "id": 87, + "name": "Set Probe 1 Temperature", + "slug": "set-probe-1-temperature", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": "let _hundreds = Math.floor(arguments[0]/100); let _tens = Math.floor((arguments[0] % 100) / 10); let _ones = Math.floor(arguments[0] % 10); return 'FE0501'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "hexadecimal": null, + "id": 88, + "name": "Set Grill Temperature", + "slug": "set-temperature", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0200FF", + "id": 89, + "name": "Turn Light Off", + "slug": "turn-light-off", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0201FF", + "id": 90, + "name": "Turn Light On", + "slug": "turn-light-on", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0102FF", + "id": 91, + "name": "Turn Grill Off", + "slug": "turn-off", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0800FF", + "id": 93, + "name": "Turn Primer Motor Off", + "slug": "turn-primer-motor-off", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": null, + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0801FF", + "id": 94, + "name": "Turn Primer Motor On", + "slug": "turn-primer-motor-on", + "updated_at": null + }, + { + "control_board_id": 11, + "created_at": "2023-01-03T10:03:36.000000Z", + "deleted_at": null, + "description": "set the target temperature of probe #2", + "function": "let _hundreds = Math.floor(arguments[0]/100); let _tens = Math.floor((arguments[0] % 100) / 10); let _ones = Math.floor(arguments[0] % 10); return 'FE0503'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "hexadecimal": null, + "id": 116, + "name": "Set Probe 2 Temperature", + "slug": "set-probe-2-temperature", + "updated_at": "2023-01-03T10:03:36.000000Z" + } + ], + "created_at": "2022-06-27T00:00:00.000000Z", + "deleted_at": null, + "id": 11, + "name": "PBB", + "platform_id": 2, + "site_id": 1, + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n /*p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),*/\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}*/\r\nreturn status;", + "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nreturn {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};", + "updated_at": "2025-09-17T20:52:53.000000Z" + }, + "control_board_id": 11, + "created_at": "2022-11-09T23:20:07.000000Z", + "deleted_at": null, + "description": null, + "enabled": 1, + "friendly_name": "", + "has_fc_functionality": 1, + "has_indicators": 0, + "has_mpc": 0, + "has_recipe_functionality": 0, + "id": 76, + "image": null, + "image_url": "https://dansons-mobile.s3.us-east-1.amazonaws.com/grill-images/PB1600PS.Elite2024.png", + "lights": 1, + "manual_url": "https://dansons-mobile.s3.us-east-1.amazonaws.com/grill-manuals/Pro-Series/10982_PB1600PSE_manual_110V_EN_FR_ES.pdf", + "max_temp": "500", + "meat_probes": 2, + "min_temp": "150", + "name": "PB1600PSE", + "name_text_color": "#A1A1A1", + "part_number": "PB1600PSE", + "screen_orientation": "Horizontal", + "shopify_product_id": null, + "site_id": 1, + "sku": null, + "temp_increment": "150/155/160/165/170/175/180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420/425/430/435/440/445/450/455/460/465/470/475/480/485/490/495/500", + "updated_at": "2024-08-12T22:55:48.000000Z" }, "PB1600SPW": { "category": null, @@ -12563,9 +12927,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2023-09-27T18:20:06.000000Z", @@ -12703,9 +13067,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2024-11-05T23:05:54.000000Z", @@ -12867,9 +13231,9 @@ "name": "PBG", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:34:20.000000Z" + "updated_at": "2025-09-17T20:50:05.000000Z" }, "control_board_id": 3, "created_at": "2022-07-13T04:29:24.000000Z", @@ -13031,9 +13395,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -13195,9 +13559,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -13359,9 +13723,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -13523,9 +13887,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -13687,9 +14051,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -13851,9 +14215,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -14015,9 +14379,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -14179,9 +14543,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -14343,9 +14707,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -14507,9 +14871,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -14671,9 +15035,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -14835,9 +15199,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -14999,9 +15363,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -15163,9 +15527,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -15327,9 +15691,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -15491,9 +15855,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -15655,9 +16019,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -15819,9 +16183,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -15983,9 +16347,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -16147,9 +16511,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -16311,9 +16675,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -16451,9 +16815,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2022-07-13T04:29:24.000000Z", @@ -16615,9 +16979,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -16779,9 +17143,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -16943,9 +17307,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -17107,9 +17471,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -17271,9 +17635,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -17435,9 +17799,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -17599,9 +17963,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -17763,9 +18127,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -17927,9 +18291,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -18091,9 +18455,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-07-13T04:29:24.000000Z", @@ -18255,9 +18619,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -18395,9 +18759,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2025-04-23T21:48:42.000000Z", @@ -18535,9 +18899,9 @@ "name": "PBM", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:51:42.000000Z" }, "control_board_id": 6, "created_at": "2023-07-06T08:48:37.000000Z", @@ -18675,9 +19039,9 @@ "name": "PBM2", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-09-02T21:51:15.000000Z" + "updated_at": "2025-09-17T20:57:56.000000Z" }, "control_board_id": 20, "created_at": "2025-07-28T21:12:02.000000Z", @@ -18851,9 +19215,9 @@ "name": "PBL3", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n} */\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nconst temps = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\nconsole.log(\"Temp function\", temps, temps.isFahrenheit);\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n console.log(\"Temp function - converted\", temps);\r\n\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-08-14T17:28:36.000000Z" + "updated_at": "2025-09-17T20:58:15.000000Z" }, "control_board_id": 21, "created_at": "2025-07-17T19:17:03.000000Z", @@ -19015,9 +19379,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -19053,114 +19417,114 @@ "control_board": { "control_board_commands": [ { - "control_board_id": 6, - "created_at": null, + "control_board_id": 20, + "created_at": "2025-05-27T22:39:50.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0B01FF", - "id": 37, + "id": 190, "name": "Get Grill Status", "slug": "get-status", - "updated_at": null + "updated_at": "2025-05-27T22:39:50.000000Z" }, { - "control_board_id": 6, - "created_at": null, + "control_board_id": 20, + "created_at": "2025-05-27T22:43:48.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0C01FF", - "id": 38, + "id": 191, "name": "Get Grill/Probes Temperatures", "slug": "get-temperatures", - "updated_at": null + "updated_at": "2025-05-27T22:43:48.000000Z" }, { - "control_board_id": 6, - "created_at": null, + "control_board_id": 20, + "created_at": "2025-05-27T22:44:21.000000Z", "deleted_at": null, "description": null, "function": "let temp = arguments[1] === false ? Math.round(((arguments[0] * 1.8)+ 32)/5) * 5 : arguments[0]; let _hundreds = Math.floor(temp/100); let _tens = Math.floor((temp % 100) / 10); let _ones = Math.floor(temp % 10); return 'FE0501'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", "hexadecimal": null, - "id": 40, + "id": 192, "name": "Set Grill Temperature", "slug": "set-temperature", - "updated_at": null + "updated_at": "2025-05-27T22:44:21.000000Z" }, { - "control_board_id": 6, - "created_at": null, + "control_board_id": 20, + "created_at": "2025-05-27T22:45:26.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0200FF", - "id": 41, + "id": 193, "name": "Turn Light Off", "slug": "turn-light-off", - "updated_at": null + "updated_at": "2025-05-27T22:45:26.000000Z" }, { - "control_board_id": 6, - "created_at": null, + "control_board_id": 20, + "created_at": "2025-05-27T22:45:59.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0201FF", - "id": 42, + "id": 194, "name": "Turn Light On", "slug": "turn-light-on", - "updated_at": null + "updated_at": "2025-05-27T22:45:59.000000Z" }, { - "control_board_id": 6, - "created_at": null, + "control_board_id": 20, + "created_at": "2025-05-27T22:46:39.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0102FF", - "id": 43, + "id": 195, "name": "Turn Grill Off", "slug": "turn-off", - "updated_at": null + "updated_at": "2025-05-27T22:46:39.000000Z" }, { - "control_board_id": 6, - "created_at": null, + "control_board_id": 20, + "created_at": "2025-05-27T22:47:26.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0902FF", - "id": 45, + "id": 196, "name": "Set Temperature to Celsius", "slug": "set-celsius", - "updated_at": null + "updated_at": "2025-05-27T22:47:26.000000Z" }, { - "control_board_id": 6, - "created_at": null, + "control_board_id": 20, + "created_at": "2025-05-27T22:48:02.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0901FF", - "id": 46, + "id": 197, "name": "Set Temperature to Fahrenheit", "slug": "set-fahrenheit", - "updated_at": null + "updated_at": "2025-05-27T22:48:02.000000Z" } ], - "created_at": "2022-06-27T00:00:00.000000Z", + "created_at": "2025-05-27T22:38:29.000000Z", "deleted_at": null, - "id": 6, - "name": "PBM", - "platform_id": 1, + "id": 20, + "name": "PBM2", + "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 36) {\r\n return null;\r\n}\r\nconst status = {\r\n // p1Target: convertTemperature(parts, 2),\r\n // p1Temp: convertTemperature(parts, 5),\r\n // p2Temp: convertTemperature(parts, 8),\r\n // p3Temp: convertTemperature(parts, 11),\r\n moduleIsOn: parts[18] === 1,\r\n err1: parts[19] === 1,\r\n err2: parts[20] === 1,\r\n err3: parts[21] === 1,\r\n highTempErr: parts[22] === 1,\r\n fanErr: parts[23] === 1,\r\n hotErr: parts[24] === 1,\r\n motorErr: parts[25] === 1,\r\n noPellets: parts[26] === 1,\r\n fanState: parts[27] === 1,\r\n hotState: parts[28] === 1,\r\n motorState: parts[29] === 1,\r\n lightState: parts[30] === 1,\r\n // isFahrenheit: parts[31] === 1,\r\n recipeStep: parts[32],\r\n recipeTime: parts[33] * 3600 + parts[34] * 60 + parts[35],\r\n};\r\n/*\r\nswitch (parts[17]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 14);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 14);\r\n break;\r\n}\r\n\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 21) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n // p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2022-11-04T07:23:53.000000Z" + "updated_at": "2025-09-17T20:57:56.000000Z" }, - "control_board_id": 6, - "created_at": "2024-09-17T21:34:20.000000Z", + "control_board_id": 20, + "created_at": "2025-09-17T16:44:05.000000Z", "deleted_at": null, "description": null, "enabled": 1, @@ -19169,7 +19533,7 @@ "has_indicators": 0, "has_mpc": 0, "has_recipe_functionality": 0, - "id": 111, + "id": 146, "image": null, "image_url": "https://dansons-mobile.s3.us-east-1.amazonaws.com/grill-images/PB850M.png", "lights": 0, @@ -19185,7 +19549,7 @@ "site_id": 1, "sku": null, "temp_increment": "180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420/425/430/435/440/445/450/455/460/465/470/475/480/485/490/495/500", - "updated_at": "2024-09-17T21:34:20.000000Z" + "updated_at": "2025-09-17T16:53:18.000000Z" }, "PB850PS2": { "category": null, @@ -19331,9 +19695,9 @@ "name": "PBL", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n// p1Target: convertTemperature(parts, 2),\r\n// p1Temp: convertTemperature(parts, 5),\r\n// p2Temp: convertTemperature(parts, 8),\r\n// p3Temp: convertTemperature(parts, 11),\r\n// p4Temp: convertTemperature(parts, 14),\r\n// smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:45:46.000000Z" + "updated_at": "2025-09-17T20:49:33.000000Z" }, "control_board_id": 1, "created_at": "2022-07-13T04:29:24.000000Z", @@ -19495,9 +19859,9 @@ "name": "PBC2", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) { return null; } const parts = parseHexMessage(message); if (parts < 44) { return null; } const status = { /*p1Target: convertTemperature(parts, 2),*/ p1Temp: convertTemperature(parts, 5), p2Temp: convertTemperature(parts, 8), p3Temp: convertTemperature(parts, 11), p4Temp: convertTemperature(parts, 14), smokerActTemp: convertTemperature(parts, 17), moduleIsOn: parts[24] === 1, err1: parts[25] === 1, err2: parts[26] === 1, err3: parts[27] === 1, highTempErr: parts[28] === 1, fanErr: parts[29] === 1, hotErr: parts[30] === 1, motorErr: parts[31] === 1, noPellets: parts[32] === 1, erL: parts[33] === 1, fanState: parts[34] === 1, hotState: parts[35] === 1, motorState: parts[36] === 1, lightState: parts[37] === 1, primeState: parts[38] === 1, isFahrenheit: parts[39] === 1, recipeStep: parts[40], recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43], }; switch (parts[23]) { case 1: status.grillSetTemp = convertTemperature(parts, 20); break; case 2: status.grillTemp = convertTemperature(parts, 20); break; } return status;", - "temperature_function": "if (!message.startsWith(\"FE0C\")) { return null; } const parts = parseHexMessage(message); if (parts < 27) { return null; } return { /* p1Target: convertTemperature(parts, 2),*/ p1Temp: convertTemperature(parts, 5), p2Temp: convertTemperature(parts, 8), p3Temp: convertTemperature(parts, 11), p4Temp: convertTemperature(parts, 14), grillSetTemp: convertTemperature(parts, 20), grillTemp: convertTemperature(parts, 23), smokerActTemp: convertTemperature(parts, 17), isFahrenheit: parts[26] === 1, };", - "updated_at": "2025-09-02T21:50:59.000000Z" + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", + "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", + "updated_at": "2025-09-17T20:56:39.000000Z" }, "control_board_id": 17, "created_at": "2024-09-10T15:28:26.000000Z", @@ -19611,9 +19975,9 @@ "name": "PBV2", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17), */\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-09-02T21:03:13.000000Z" + "updated_at": "2025-09-17T20:57:04.000000Z" }, "control_board_id": 18, "created_at": "2025-06-09T16:32:25.000000Z", @@ -19751,9 +20115,9 @@ "name": "PBVA", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17), */\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nconsole.log('parts', parts, parts.length);\r\nif (parts.length < 22) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n //smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-07-15T17:45:02.000000Z" + "updated_at": "2025-09-17T20:57:32.000000Z" }, "control_board_id": 19, "created_at": "2025-04-24T17:26:07.000000Z", @@ -19891,9 +20255,9 @@ "name": "PBVA", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17), */\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nconsole.log('parts', parts, parts.length);\r\nif (parts.length < 22) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 14),\r\n grillTemp: convertTemperature(parts, 17),\r\n //smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[20] === 1,\r\n};\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if ((typeof temp === \"undefined\") || (temp === 960)) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.p2Target = ftoc(temps.p2Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-07-15T17:45:02.000000Z" + "updated_at": "2025-09-17T20:57:32.000000Z" }, "control_board_id": 19, "created_at": "2025-05-15T18:57:54.000000Z", @@ -20055,9 +20419,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2024-08-29T23:09:07.000000Z", @@ -20093,138 +20457,90 @@ "control_board": { "control_board_commands": [ { - "control_board_id": 4, - "created_at": null, + "control_board_id": 18, + "created_at": "2025-04-24T17:11:26.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0B01FF", - "id": 47, + "id": 176, "name": "Get Grill Status", "slug": "get-status", - "updated_at": null + "updated_at": "2025-04-24T17:11:26.000000Z" }, { - "control_board_id": 4, - "created_at": null, + "control_board_id": 18, + "created_at": "2025-04-24T17:12:04.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0C01FF", - "id": 48, + "id": 177, "name": "Get Grill/Probes Temperatures", "slug": "get-temperatures", - "updated_at": null - }, - { - "control_board_id": 4, - "created_at": null, - "deleted_at": null, - "description": null, - "function": null, - "hexadecimal": "FE0902FF", - "id": 49, - "name": "Set Temperature to Celsius", - "slug": "set-celsius", - "updated_at": null - }, - { - "control_board_id": 4, - "created_at": null, - "deleted_at": null, - "description": null, - "function": null, - "hexadecimal": "FE0901FF", - "id": 50, - "name": "Set Temperature to Fahrenheit", - "slug": "set-fahrenheit", - "updated_at": null + "updated_at": "2025-04-24T17:12:04.000000Z" }, { - "control_board_id": 4, - "created_at": null, + "control_board_id": 18, + "created_at": "2025-04-24T17:13:49.000000Z", "deleted_at": null, "description": null, "function": "let temp = arguments[1] === false ? Math.round(((arguments[0] * 1.8)+ 32)/5) * 5 : arguments[0]; let _hundreds = Math.floor(temp/100); let _tens = Math.floor((temp % 100) / 10); let _ones = Math.floor(temp % 10); return 'FE0501'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", "hexadecimal": null, - "id": 52, + "id": 178, "name": "Set Grill Temperature", "slug": "set-temperature", - "updated_at": null - }, - { - "control_board_id": 4, - "created_at": null, - "deleted_at": null, - "description": null, - "function": null, - "hexadecimal": "FE0200FF", - "id": 53, - "name": "Turn Light Off", - "slug": "turn-light-off", - "updated_at": null - }, - { - "control_board_id": 4, - "created_at": null, - "deleted_at": null, - "description": null, - "function": null, - "hexadecimal": "FE0201FF", - "id": 54, - "name": "Turn Light On", - "slug": "turn-light-on", - "updated_at": null + "updated_at": "2025-04-24T17:13:49.000000Z" }, { - "control_board_id": 4, - "created_at": null, + "control_board_id": 18, + "created_at": "2025-04-24T17:14:44.000000Z", "deleted_at": null, "description": null, "function": null, "hexadecimal": "FE0102FF", - "id": 55, + "id": 179, "name": "Turn Grill Off", "slug": "turn-off", - "updated_at": null + "updated_at": "2025-04-24T17:14:44.000000Z" }, { - "control_board_id": 4, - "created_at": null, + "control_board_id": 18, + "created_at": "2025-04-24T17:15:24.000000Z", "deleted_at": null, "description": null, "function": null, - "hexadecimal": "FE0800FF", - "id": 57, - "name": "Turn Primer Motor Off", - "slug": "turn-primer-motor-off", - "updated_at": null + "hexadecimal": "FE0902FF", + "id": 180, + "name": "Set Temperature to Celsius", + "slug": "set-celsius", + "updated_at": "2025-04-24T17:15:24.000000Z" }, { - "control_board_id": 4, - "created_at": null, + "control_board_id": 18, + "created_at": "2025-04-24T17:16:02.000000Z", "deleted_at": null, "description": null, "function": null, - "hexadecimal": "FE0801FF", - "id": 58, - "name": "Turn Primer Motor On", - "slug": "turn-primer-motor-on", - "updated_at": null + "hexadecimal": "FE0901FF", + "id": 181, + "name": "Set Temperature to Fahrenheit", + "slug": "set-fahrenheit", + "updated_at": "2025-04-24T17:16:02.000000Z" } ], - "created_at": "2022-06-27T00:00:00.000000Z", + "created_at": "2025-04-24T17:09:50.000000Z", "deleted_at": null, - "id": 4, - "name": "PBV", - "platform_id": 5, + "id": 18, + "name": "PBV2", + "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17), */\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:57:04.000000Z" }, - "control_board_id": 4, - "created_at": "2025-04-29T22:43:05.000000Z", + "control_board_id": 18, + "created_at": "2025-09-23T16:19:31.000000Z", "deleted_at": null, "description": null, "enabled": 1, @@ -20233,7 +20549,7 @@ "has_indicators": 0, "has_mpc": 0, "has_recipe_functionality": 0, - "id": 132, + "id": 148, "image": null, "image_url": "https://dansons-mobile.s3.dualstack.us-east-1.amazonaws.com/grill-images/PBV3NX.1.png", "lights": 0, @@ -20249,7 +20565,7 @@ "site_id": 1, "sku": null, "temp_increment": "130/135/140/145/150/155/160/165/170/175/180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420", - "updated_at": "2025-04-29T22:43:05.000000Z" + "updated_at": "2025-09-23T16:20:07.000000Z" }, "PBV4DX": { "category": null, @@ -20395,9 +20711,9 @@ "name": "PBL3", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n} */\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nconst temps = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\nconsole.log(\"Temp function\", temps, temps.isFahrenheit);\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n console.log(\"Temp function - converted\", temps);\r\n\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-08-14T17:28:36.000000Z" + "updated_at": "2025-09-17T20:58:15.000000Z" }, "control_board_id": 21, "created_at": "2025-06-26T21:32:02.000000Z", @@ -20559,9 +20875,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2024-09-10T22:40:49.000000Z", @@ -20735,9 +21051,9 @@ "name": "PBL", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n// p1Target: convertTemperature(parts, 2),\r\n// p1Temp: convertTemperature(parts, 5),\r\n// p2Temp: convertTemperature(parts, 8),\r\n// p3Temp: convertTemperature(parts, 11),\r\n// p4Temp: convertTemperature(parts, 14),\r\n// smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:45:46.000000Z" + "updated_at": "2025-09-17T20:49:33.000000Z" }, "control_board_id": 1, "created_at": "2022-07-13T04:29:24.000000Z", @@ -20851,9 +21167,9 @@ "name": "PBV2", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17), */\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-09-02T21:03:13.000000Z" + "updated_at": "2025-09-17T20:57:04.000000Z" }, "control_board_id": 18, "created_at": "2025-06-03T20:43:35.000000Z", @@ -20867,7 +21183,7 @@ "has_recipe_functionality": 0, "id": 137, "image": null, - "image_url": "https://dansons-mobile.s3.us-east-1.amazonaws.com/grill-images/V5%20Competition.png", + "image_url": "https://dansons-mobile.s3.dualstack.us-east-1.amazonaws.com/grill-images/ghost%20vertical.png", "lights": 0, "manual_url": "https://dansons-mobile.s3.us-east-1.amazonaws.com/grill-manuals/Competition/10903_10904_PBV5P2_owners_manual.pdf", "max_temp": "420", @@ -20881,7 +21197,7 @@ "site_id": 1, "sku": null, "temp_increment": "130/135/140/145/150/155/160/165/170/175/180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420", - "updated_at": "2025-06-03T20:43:35.000000Z" + "updated_at": "2025-09-24T17:36:29.000000Z" }, "PBV5CS": { "category": null, @@ -21015,9 +21331,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z", @@ -21179,9 +21495,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2022-11-30T12:05:56.000000Z", @@ -21343,9 +21659,9 @@ "name": "PBG", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2024-06-03T12:34:20.000000Z" + "updated_at": "2025-09-17T20:50:05.000000Z" }, "control_board_id": 3, "created_at": "2022-07-13T04:29:24.000000Z", @@ -21459,9 +21775,9 @@ "name": "PBV2", "platform_id": 8, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17), */\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2025-09-02T21:03:13.000000Z" + "updated_at": "2025-09-17T20:57:04.000000Z" }, "control_board_id": 18, "created_at": "2025-06-09T16:34:42.000000Z", @@ -21623,9 +21939,9 @@ "name": "PBD", "platform_id": 3, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n /*p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),*/\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n // isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nreturn {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};", - "updated_at": "2023-01-25T12:01:54.000000Z" + "updated_at": "2025-09-17T20:53:27.000000Z" }, "control_board_id": 12, "created_at": "2023-02-01T16:41:44.000000Z", @@ -21787,9 +22103,9 @@ "name": "PBV", "platform_id": 5, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n// isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*switch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}*/\r\n\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", - "updated_at": "2024-09-17T22:06:07.000000Z" + "updated_at": "2025-09-17T20:50:32.000000Z" }, "control_board_id": 4, "created_at": "2024-09-17T22:03:15.000000Z", @@ -21975,9 +22291,9 @@ "name": "PBB", "platform_id": 2, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 47) {\r\n return null;\r\n}\r\n//const p1Target = convertTemperature(parts, 2);\r\n//const p2Target = convertTemperature(parts, 5);\r\n\r\nconst status = {\r\n /*p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n smokerActTemp: convertTemperature(parts, 20),*/\r\n moduleIsOn: parts[27] === 1,\r\n err1: parts[28] === 1,\r\n err2: parts[29] === 1,\r\n err3: parts[30] === 1,\r\n highTempErr: parts[31] === 1,\r\n fanErr: parts[32] === 1,\r\n hotErr: parts[33] === 1,\r\n motorErr: parts[34] === 1,\r\n noPellets: parts[35] === 1,\r\n erL: parts[36] === 1,\r\n fanState: parts[37] === 1,\r\n hotState: parts[38] === 1,\r\n motorState: parts[39] === 1,\r\n lightState: parts[40] === 1,\r\n primeState: parts[41] === 1,\r\n// isFahrenheit: parts[42] === 1,\r\n recipeStep: parts[43],\r\n recipeTime: parts[44] * 3600 + parts[45] * 60 + parts[46],\r\n};\r\n/*\r\nswitch (parts[26]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 23);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 23);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts.length < 30) {\r\n return null;\r\n}\r\n\r\nconst p1Target = convertTemperature(parts, 2);\r\nconst p2Target = convertTemperature(parts, 5);\r\nreturn {\r\n p1Target: p1Target !== 000 && p1Target !== 960 ? p1Target : null,\r\n p2Target: p2Target !== 000 && p2Target !== 960 ? p2Target : null,\r\n p1Temp: convertTemperature(parts, 8),\r\n p2Temp: convertTemperature(parts, 11),\r\n p3Temp: convertTemperature(parts, 14),\r\n p4Temp: convertTemperature(parts, 17),\r\n grillSetTemp: convertTemperature(parts, 23),\r\n grillTemp: convertTemperature(parts, 26),\r\n smokerActTemp: convertTemperature(parts, 20),\r\n isFahrenheit: parts[29] === 1,\r\n};", - "updated_at": "2022-12-22T11:45:57.000000Z" + "updated_at": "2025-09-17T20:52:53.000000Z" }, "control_board_id": 11, "created_at": "2022-11-09T23:21:31.000000Z", @@ -22007,6 +22323,122 @@ "temp_increment": "130/135/140/145/150/155/160/165/170/175/180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420", "updated_at": "2024-08-12T22:56:03.000000Z" }, + "PBV7P2": { + "category": null, + "celsius_temp_increment": null, + "control_board": { + "control_board_commands": [ + { + "control_board_id": 18, + "created_at": "2025-04-24T17:11:26.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0B01FF", + "id": 176, + "name": "Get Grill Status", + "slug": "get-status", + "updated_at": "2025-04-24T17:11:26.000000Z" + }, + { + "control_board_id": 18, + "created_at": "2025-04-24T17:12:04.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0C01FF", + "id": 177, + "name": "Get Grill/Probes Temperatures", + "slug": "get-temperatures", + "updated_at": "2025-04-24T17:12:04.000000Z" + }, + { + "control_board_id": 18, + "created_at": "2025-04-24T17:13:49.000000Z", + "deleted_at": null, + "description": null, + "function": "let temp = arguments[1] === false ? Math.round(((arguments[0] * 1.8)+ 32)/5) * 5 : arguments[0]; let _hundreds = Math.floor(temp/100); let _tens = Math.floor((temp % 100) / 10); let _ones = Math.floor(temp % 10); return 'FE0501'+formatHex(_hundreds)+formatHex(_tens)+formatHex(_ones) + 'FF';", + "hexadecimal": null, + "id": 178, + "name": "Set Grill Temperature", + "slug": "set-temperature", + "updated_at": "2025-04-24T17:13:49.000000Z" + }, + { + "control_board_id": 18, + "created_at": "2025-04-24T17:14:44.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0102FF", + "id": 179, + "name": "Turn Grill Off", + "slug": "turn-off", + "updated_at": "2025-04-24T17:14:44.000000Z" + }, + { + "control_board_id": 18, + "created_at": "2025-04-24T17:15:24.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0902FF", + "id": 180, + "name": "Set Temperature to Celsius", + "slug": "set-celsius", + "updated_at": "2025-04-24T17:15:24.000000Z" + }, + { + "control_board_id": 18, + "created_at": "2025-04-24T17:16:02.000000Z", + "deleted_at": null, + "description": null, + "function": null, + "hexadecimal": "FE0901FF", + "id": 181, + "name": "Set Temperature to Fahrenheit", + "slug": "set-fahrenheit", + "updated_at": "2025-04-24T17:16:02.000000Z" + } + ], + "created_at": "2025-04-24T17:09:50.000000Z", + "deleted_at": null, + "id": 18, + "name": "PBV2", + "platform_id": 8, + "site_id": 1, + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n //not a grill status messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17), */\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nif (!status.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n status.p1Target = ftoc(status.p1Target);\r\n status.p1Temp = ftoc(status.p1Temp);\r\n status.p2Temp = ftoc(status.p2Temp);\r\n status.p3Temp = ftoc(status.p3Temp);\r\n status.p4Temp = ftoc(status.p4Temp);\r\n status.grillSetTemp = ftoc(status.grillSetTemp);\r\n status.grillTemp = ftoc(status.grillTemp);\r\n status.smokerActTemp = ftoc(status.smokerActTemp);\r\n}\r\n*/\r\nreturn status;", + "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n //not a grill temperature messasge\r\n return null;\r\n}\r\n\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\n\r\nconst temps = {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};\r\n\r\nif (!temps.isFahrenheit) {\r\n const ftoc = function (temp) {\r\n if (typeof temp === \"undefined\" || temp === 960) {\r\n return temp;\r\n }\r\n return Math.floor((temp - 32) / 1.8);\r\n };\r\n temps.p1Temp = ftoc(temps.p1Temp);\r\n temps.p2Temp = ftoc(temps.p2Temp);\r\n temps.p3Temp = ftoc(temps.p3Temp);\r\n temps.p4Temp = ftoc(temps.p4Temp);\r\n temps.grillSetTemp = ftoc(temps.grillSetTemp);\r\n temps.grillTemp = ftoc(temps.grillTemp);\r\n temps.smokerActTemp = ftoc(temps.smokerActTemp);\r\n temps.p1Target = ftoc(temps.p1Target);\r\n}\r\n\r\nreturn temps;", + "updated_at": "2025-09-17T20:57:04.000000Z" + }, + "control_board_id": 18, + "created_at": "2025-09-23T16:46:51.000000Z", + "deleted_at": null, + "description": null, + "enabled": 1, + "friendly_name": null, + "has_fc_functionality": 1, + "has_indicators": 0, + "has_mpc": 0, + "has_recipe_functionality": 0, + "id": 149, + "image": null, + "image_url": "Https://dansons-mobile.s3.dualstack.us-east-1.amazonaws.com/grill-images/PBV7P2.png", + "lights": 0, + "manual_url": "Https://dansons-mobile.s3.dualstack.us-east-1.amazonaws.com/grill-manuals/Sportsman/11110_PBV7P2_owners_manual.pdf", + "max_temp": "420", + "meat_probes": 3, + "min_temp": "130", + "name": "PBV7P2", + "name_text_color": "#A1A1A1", + "part_number": "PBV7P2", + "screen_orientation": "Vertical", + "shopify_product_id": null, + "site_id": 1, + "sku": null, + "temp_increment": "130/135/140/145/150/155/160/165/170/175/180/185/190/195/200/205/210/215/220/225/230/235/240/245/250/255/260/265/270/275/280/285/290/295/300/305/310/315/320/325/330/335/340/345/350/355/360/365/370/375/380/385/390/395/400/405/410/415/420", + "updated_at": "2025-09-24T15:58:50.000000Z" + }, "PBV7PW1": { "category": null, "celsius_temp_increment": null, @@ -22139,9 +22571,9 @@ "name": "PBC", "platform_id": 1, "site_id": 1, - "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}\r\nreturn status;", + "status_function": "if (!message.startsWith(\"FE0B\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 44) {\r\n return null;\r\n}\r\nconst status = {\r\n /*p1Target: convertTemperature(parts, 2),\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n smokerActTemp: convertTemperature(parts, 17),*/\r\n moduleIsOn: parts[24] === 1,\r\n err1: parts[25] === 1,\r\n err2: parts[26] === 1,\r\n err3: parts[27] === 1,\r\n highTempErr: parts[28] === 1,\r\n fanErr: parts[29] === 1,\r\n hotErr: parts[30] === 1,\r\n motorErr: parts[31] === 1,\r\n noPellets: parts[32] === 1,\r\n erL: parts[33] === 1,\r\n fanState: parts[34] === 1,\r\n hotState: parts[35] === 1,\r\n motorState: parts[36] === 1,\r\n lightState: parts[37] === 1,\r\n primeState: parts[38] === 1,\r\n // isFahrenheit: parts[39] === 1,\r\n recipeStep: parts[40],\r\n recipeTime: parts[41] * 3600 + parts[42] * 60 + parts[43],\r\n};\r\n/*\r\nswitch (parts[23]) {\r\n case 1:\r\n status.grillSetTemp = convertTemperature(parts, 20);\r\n break;\r\n case 2:\r\n status.grillTemp = convertTemperature(parts, 20);\r\n break;\r\n}*/\r\nreturn status;", "temperature_function": "if (!message.startsWith(\"FE0C\")) {\r\n return null;\r\n}\r\nconst parts = parseHexMessage(message);\r\nif (parts < 27) {\r\n return null;\r\n}\r\nreturn {\r\n /* p1Target: convertTemperature(parts, 2),*/\r\n p1Temp: convertTemperature(parts, 5),\r\n p2Temp: convertTemperature(parts, 8),\r\n p3Temp: convertTemperature(parts, 11),\r\n p4Temp: convertTemperature(parts, 14),\r\n grillSetTemp: convertTemperature(parts, 20),\r\n grillTemp: convertTemperature(parts, 23),\r\n smokerActTemp: convertTemperature(parts, 17),\r\n isFahrenheit: parts[26] === 1,\r\n};", - "updated_at": "2022-12-22T10:12:07.000000Z" + "updated_at": "2025-09-17T20:50:53.000000Z" }, "control_board_id": 5, "created_at": "2022-07-13T04:29:24.000000Z",