diff --git a/.gitignore b/.gitignore index e059815..0323cd7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ node_modules **/.DS_Store local.config.ts data/ +Credentials.h \ No newline at end of file diff --git a/PCB/YaegerS3.zip b/PCB/YaegerS3.zip new file mode 100644 index 0000000..1f2ecd8 Binary files /dev/null and b/PCB/YaegerS3.zip differ diff --git a/PCB/YaegerS3Mini.zip b/PCB/YaegerS3Mini.zip new file mode 100644 index 0000000..2cf839c Binary files /dev/null and b/PCB/YaegerS3Mini.zip differ diff --git a/PCB/YaegerV01BOM_FULL.csv b/PCB/YaegerV01BOM_FULL.csv new file mode 100644 index 0000000..ef4a034 --- /dev/null +++ b/PCB/YaegerV01BOM_FULL.csv @@ -0,0 +1,21 @@ +Reference,Manufacturer part number,Description,Qty +"J1,J13",61300411121,"Male vertical header 4 position, used for LCD and PWM",2 +"J2,J5,J6,J7,J8,J9",2376591-2,Terminals for high voltage,6 +"J3,J4",PPTC061LFBN-RC,"Female header 6 position, used for thermocouple boards",2 +PS1,IRM-10-3.3,AC DC converter 3.3V,1 +J10,22035025,"2 Pin header for SSR connection, Molex",1 +,2196762125,"Cable with crimped ends for 50375023 housing, 450mm",2 +,50375023,Connector housing for 2196762125,1 +,PPTC041LFBN-RC,"Female header 4 position, used for PWM ",1 +,,, +,MAX31855 K Type Thermocouple Breakout Board,https://www.aliexpress.com/item/1005006381598473.html,2 +,PWM for fan control,https://www.aliexpress.com/item/1005006457613501.html,1 +,SSR for heater control,https://www.aliexpress.com/item/4000045425145.html,1 +,,, +,,, +,ESP32-S3 Mini,https://www.aliexpress.com/item/1005006177646698.html,1 +"J11,J12",PPPC102LFBN-RC,"Female header 20 position, used for S3 Mini",2 +,,, +,,, +,ESP32-S3,https://www.aliexpress.com/item/1005006266375800.html,1 +U1,PPTC221LFBN-RC,"Female header 22 position, used for S3",2 \ No newline at end of file diff --git a/README.md b/README.md index 6213e32..ff06119 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # Yaeger + ![yaeger logo](./assets/logo.webp) + ## Yet another embedded gourmet experience roaster -### or something like that +### or something like that ## The gist @@ -10,63 +12,105 @@ Yaeger is an embedded computer that takes control of your "coffee roaster" via A It currently supports reading data from two temperature probes as well as controlling a fan and pulsing a heater. ### Primary goal + Is to use an old popcorn popper you have gathering dust in your basement and modifying it into a sample roaster for roasting small batches of coffee at a time. -### Suported hardware: +### Suported hardware * [ESP32-S3 (devkit-1)](https://www.aliexpress.com/item/1005006266375800.html) or an [S3-mini](https://www.aliexpress.com/item/1005006177646698.html) * 1 or 2 [MAX31855](https://www.aliexpress.com/item/1005006381598473.html) thermocouple chips * 1 [DC pwm capable dimmer](https://www.aliexpress.com/item/1005006457613501.html) for the fan (must support 3.3v control) * 1 DC controlled [AC SSR](https://www.aliexpress.com/item/4000045425145.html) for controling the heating element (same as above) - -### Other required hardware for the build: +### Other required hardware for the build * 18V DC PSU for driving the fan (be careful how you wire this) * regular wire K-type thermocouple probe (the one that comes with your multimeter) * flexible K-type thermocouple probe, 1x50/1.5x50 (sometimes difficult to source, they come and go on aliexpress, search for -flexible thermocouple 1x100 - this usually works) +flexible thermocouple 1x100 - this usually works). + +### NOTE -**NOTE** We don't have enough data if there is enough difference between ET and BT to justify two thermocouples. You might use -just one. +just one. -#### Optional upgrades: +#### Optional upgrades * 24V DC PSU for more fan power ### Command and control + + Upon first launch, Yaeger will set up its own access point. You can then configure the preferred wifi for Yaeger to connect to from the Web UI (see below). After setting up the preffered Wifi, Yaeger will try to connect to it on every boot. If it can't connect to the preffered Wifi, Yaeger will fallback to its own access point (so you can set up Wifi again). -This repo also includes a sample config for Artisan-Scope. +This repo also includes a sample config for Artisan-Scope. #### Artisan Scope -Load the config, found in `./artisan-settings.aset` into Artisan-Scope, change the server ip to match yours and click the on button. + +Load the config, found in `./artisan-settings.aset` into Artisan-Scope, change the server ip to match yours and click the on button. #### Web interface + You can also control Yaeger from its own web interface without an app. Just point your browser to `yaeger.local` when on your home wifi, or `192.168.4.1` if Yaeger creates its own access point. ![yaeger webui](./assets/yaeger-webui.png) #### Using Yaeger on the go -If Yaeger can't connect to your preferred Wifi, it will create its own access point. Perfect for when out and about :) + +If Yaeger can't connect to your preferred Wifi, it will create its own access point. Perfect for when out and about :grin: ## Build guide (WIP) ### Schema + ![schema](./schema/Schematic_Yaeger_2024-12-24.svg) -Additional info for the v1 pcb can be found in the schema folder, along with a BOM for the pcb. Courtesy of [@dlisec](https://github.com/dlisec) +Kicad projects for the S3 and S3 mini versions of the PCB, can be found in the PCB folder, along with a BOM for the pcb. + +Courtesy of [@dlisec](https://github.com/dlisec) ### Building and flashing + A build script has been provided by [@matthew73210](https://github.com/matthew73210), so to get up and running on the -ESP, just run `./build_and_flash.sh`. +ESP, just run `./build_and_flash.sh`. Make sure to read the comments in the script. But also in the platformio.ini and choose the right board + +## Latest features + +### PID + +PID temp follower, set the temperature setpoint and the PID controller will try and follow. You'll need to find your own PID values + +### Profile + +Still in the works, but there is now a profile follower, it follows a simple .json format. You can have a go at [Gaggiuino web profiler](https://matthew73210.github.io/Gaggiuino-web-profiler/) under the _pun_ "Yägermeister Mode" + + +#### An example of a roast profile + +``` +{ + "steps": [ + { + "duration": 10, + "setpoint": 40, + "interpolation": "linear" + }, + { + "duration": 360, + "setpoint": 217, + "interpolation": "ease-out" + } + ] +} +``` + +## Disclaimer -# Disclaimer Be careful when messing about with electronics and high voltage. I can not and will not take any responsibility for any sort of damage or injury caused by Yaeger, either directly or indirectly. **You do this at your own risk** -### You have been warned! + +## You have been warned diff --git a/build_and_flash.sh b/build_and_flash.sh index 1e9ada3..381c9fc 100755 --- a/build_and_flash.sh +++ b/build_and_flash.sh @@ -1,5 +1,35 @@ #!/bin/bash +# The script will build and flash Yaeger to your ESP device. +# Ensure this script is executable (`chmod +x build_and_flash.sh`) and has the correct permissions. +# +# Usage: +# ./build_and_flash.sh +# +# Example: +# ./build_and_flash.sh s3 # For ESP32-S3 +# ./build_and_flash.sh s3-mini # For ESP32-S3 Mini +# +# If you cloned the project from GitHub, ensure all folders have the correct permissions: +# chmod -R u+rwX . +# The SPIFFS filesystem might fail if permissions are incorrect. + +# Step 0: Check for required parameter (s3 or s3-mini) +if [[ -z "$1" ]]; then + echo "Usage: $0 " + exit 1 +fi + +PIO_ENV="esp32-$1" + +# Validate the provided environment +if [[ "$PIO_ENV" != "esp32-s3" && "$PIO_ENV" != "esp32-s3-mini" ]]; then + echo "Invalid argument: '$1'. Use 's3' or 's3-mini'." + exit 1 +fi + +echo "Using PlatformIO environment: $PIO_ENV" + # Step 1: Navigate to the miniweb directory echo "Navigating to miniweb..." cd miniweb || { echo "miniweb folder not found!"; exit 1; } @@ -14,18 +44,19 @@ npm run build || { echo "npm build failed!"; exit 1; } # Step 4: Return to the project root echo "Returning to the project root..." -cd .. || exit -# Step 5: Erase the device memory (optional, but recommended) +cd .. || exit 1 + +# Step 5: Erase the device memory (optional but recommended) echo "Erasing the device memory..." -pio run -t erase || { echo "Memory erase failed!"; exit 1; } +pio run -e "$PIO_ENV" -t erase || { echo "Memory erase failed!"; exit 1; } # Step 6: Build and upload the SPIFFS filesystem echo "Building and uploading SPIFFS filesystem..." -pio run -t buildfs -t uploadfs || { echo "SPIFFS upload failed!"; exit 1; } +pio run -e "$PIO_ENV" -t buildfs -t uploadfs || { echo "SPIFFS upload failed!"; exit 1; } # Step 7: Build and upload the firmware echo "Building and uploading the firmware..." -pio run -t upload || { echo "Firmware build or upload failed!"; exit 1; } +pio run -e "$PIO_ENV" -t upload || { echo "Firmware build or upload failed!"; exit 1; } echo "All tasks completed successfully!" diff --git a/miniweb/src/chart.ts b/miniweb/src/chart.ts index cb13e07..254ef4b 100644 --- a/miniweb/src/chart.ts +++ b/miniweb/src/chart.ts @@ -107,8 +107,8 @@ export function initializeChart(ctx: CanvasRenderingContext2D): Chart { }, y3: { min: 0, - max: 10, - type: "logarithmic", + max: 60, + //type: "logarithmic", }, }, responsive: true, @@ -133,7 +133,7 @@ export function updateChart(chart: Chart, roast: RoastState) { const beanTemps = measurements.map((el) => el.message.BT); const envTemps = measurements.map((el) => el.message.ET); - const windowSize = 20; + const windowSize = 30; // Helper to calculate rate of rise (RoR) const calculateRoR = (temps: number[], times: number[]) => @@ -149,7 +149,7 @@ export function updateChart(chart: Chart, roast: RoastState) { return values.map((val, i, arr) => { if (val === null || i < size - 1) return val; // Skip if insufficient data const window = arr.slice(i - size + 1, i + 1) as number[]; - return window.reduce((sum, v) => sum + v, 0) / size; + return window.reduce((sum, v) => sum + v * 60, 0) / size; }); }; @@ -165,7 +165,7 @@ export function updateChart(chart: Chart, roast: RoastState) { // Add datasets to chart chart.data.datasets[4] = { - label: "BT Rate of Rise (°C/s)", + label: "BT Rate of Rise (°C/min)", borderColor: "green", pointStyle: false, data: btRor, @@ -174,7 +174,7 @@ export function updateChart(chart: Chart, roast: RoastState) { }; chart.data.datasets[5] = { - label: "ET Rate of Rise (°C/s)", + label: "ET Rate of Rise (°C/min)", borderColor: "purple", pointStyle: false, data: etRor, @@ -182,6 +182,16 @@ export function updateChart(chart: Chart, roast: RoastState) { tension: 0.2, }; + chart.data.datasets[6] = { + label: "Setpoint (°C)", + borderColor: "#03fc7b", + pointStyle: false, + data: roast.measurements.map((el) => el.extra?.setpoint ?? 0), + yAxisID: "y1", + tension: 0.1, + + }; + chart.data.datasets[3].data = roast.measurements.map( (el) => el.message.BurnerVal, ); @@ -234,7 +244,6 @@ const verticalLinePlugin = { beforeDatasetsDraw: function (chart, easing) { if (chart.config._config.lineAtIndex) { - console.log("doing ", chart.config._config.lineAtIndex); chart.config._config.lineAtIndex.forEach((pointIndex) => { this.renderVerticalLine(chart, pointIndex); }); diff --git a/miniweb/src/main.ts b/miniweb/src/main.ts index 2ec412f..b7d1f85 100644 --- a/miniweb/src/main.ts +++ b/miniweb/src/main.ts @@ -7,16 +7,31 @@ import { Measurement, RoasterStatus, RoastState, + Profile, } from "./model.ts"; import { getFormattedTimeDifference } from "./util.ts"; +import { PIDController } from "./pid.ts"; +import { + followProfile, + followProfileEnabled, + profile, + ProfileControl, +} from "./profiling.ts"; -const { button, div, input, h1, canvas, p, span } = van.tags; +const { label, button, div, input, select, option, canvas, p, span } = van.tags; // State variables const slider1Value = van.state(50); const slider2Value = van.state(50); const state = van.state(new YaegerState()); +const setpoint = van.state(20); +const pidPFactor = van.state(1.0); +const pidIFactor = van.state(0.1); +const pidDFactor = van.state(0.01); +var pid = new PIDController(1.0, 0.1, 0.01); + + // Wifi const ssidField = van.state(""); const passField = van.state(""); @@ -82,6 +97,15 @@ socket.onmessage = (event) => { { timestamp: timestamp, message: message, + extra: { + setpoint: setpoint.val, + pidData: { + enabled: pidEnabled.val, + kp: pidPFactor.val, + ki: pidIFactor.val, + kd: pidDFactor.val, + }, + }, }, ]; state.val = { @@ -92,6 +116,19 @@ socket.onmessage = (event) => { }, }; updateChart(chart, state.val.roast!); + if ( + state.val.profile != undefined && + followProfileEnabled.val == true + ) { + var profiledSetpoint = followProfile( + state.val.profile!, + state.val.roast!, + ); + if (profiledSetpoint != undefined) { + setpoint.val = profiledSetpoint; + } + } + controlHeater(); } } } catch (error) { @@ -270,6 +307,121 @@ const UploadRoastInput = () => { return div(fileInput); }; +// Update setpoint through a slider or input +const SetpointControl = () => + div( + "Setpoint (°C): ", + () => setpoint.val, + input({ + type: "range", + min: "0", + max: "300", + disabled: followProfileEnabled.val, + value: setpoint, + oninput: (e: Event) => { + setpoint.val = parseInt((e.target as HTMLInputElement).value, 10); + }, + }), + ); +let tempP = pidPFactor.val; +let tempI = pidIFactor.val; +let tempD = pidDFactor.val; + +let tempTarget = "BT"; +const pidEnabled = van.state(true); + +const PIDConfig = () => + div( + "PID Factors", + p(), + "P:", + input({ + type: "number", + value: tempP, + oninput: (e: Event) => { + tempP = parseFloat((e.target as HTMLInputElement).value) || 0; + }, + }), + "I:", + input({ + type: "number", + value: tempI, + oninput: (e: Event) => { + tempI = parseFloat((e.target as HTMLInputElement).value) || 0; + }, + }), + "D:", + input({ + type: "number", + value: tempD, + oninput: (e: Event) => { + tempD = parseFloat((e.target as HTMLInputElement).value) || 0; + }, + }), + p(), + "Target:", + select( + { + value: tempTarget, + onchange: (e: Event) => { + tempTarget = (e.target as HTMLSelectElement).value; + }, + }, + option({ value: "BT" }, "BT"), + option({ value: "ET" }, "ET"), + ), + p(), + button( + { + onclick: () => { + pidPFactor.val = tempP; + pidIFactor.val = tempI; + pidDFactor.val = tempD; + + pid = new PIDController( + pidPFactor.val, + pidIFactor.val, + pidDFactor.val, + ); + console.log("New PID values set:", { + P: pidPFactor.val, + I: pidIFactor.val, + D: pidDFactor.val, + }); + console.log("PID:", JSON.stringify(pid)); + }, + }, + "Apply pid", + ), + label( + input({ + type: "checkbox", + checked: pidEnabled.val, + oninput: (e) => (pidEnabled.val = e.target.checked), + }), + "PID Enabled", + ), + ); + +function controlHeater() { + let currentTemp: number; + if (tempTarget == "BT") { + currentTemp = state.val.currentState.lastMessage?.BT ?? 0; + } else { + currentTemp = state.val.currentState.lastMessage?.ET ?? 0; + } + const output = pid.compute(setpoint.val, currentTemp); + + // Clamp output to 0–100% range + const heaterPower = Math.min(100, Math.max(0, Math.round(output))); + + if (pidEnabled.val == false) { + return; + } + updateHeaterPower(heaterPower); + slider2Value.val = heaterPower; // Reflect change in the UI +} + // UI creation const app = div( div( @@ -290,6 +442,7 @@ const app = div( ), ), chartElement, + SetpointControl, div( "FAN 1:", () => slider1Value.val, @@ -314,6 +467,7 @@ const app = div( type: "range", min: "0", max: "100", + disabled: () => pidEnabled.val, value: slider2Value, oninput: (e: Event) => { const target = e.target as HTMLInputElement; @@ -369,17 +523,30 @@ const app = div( ), ), div( - span("ET: ", () => { - return state.val.currentState.lastMessage?.ET ?? "N/A"; - }), - p(), - span("BT: ", () => state.val.currentState.lastMessage?.BT ?? "N/A"), - p(), - "Last update: ", - p(() => state.val.currentState.lastUpdate?.toString() ?? "N/A"), + span( + "ET: ", + () => { + return state.val.currentState.lastMessage?.ET ?? "N/A"; + }, + " ", + "BT: ", + () => state.val.currentState.lastMessage?.BT ?? "N/A", + ), + " ", + p( + "Last update: ", + () => state.val.currentState.lastUpdate?.toString() ?? "N/A", + ), ), UploadRoastInput, + p(), + PIDConfig, + p(), + ProfileControl, + p(), div( + "Wifi settings:", + p(), "Wifi ssid:", input({ type: "text", @@ -415,6 +582,7 @@ function toggleRoastStart() { events: [], commands: [], }, + profile: profile.val, }; break; case RoasterStatus.roasting: @@ -424,6 +592,10 @@ function toggleRoastStart() { ...state.val.currentState, status: RoasterStatus.idle, }, + roast: { + ...state.val.roast!, + profile: state.val.profile, + }, }; break; } diff --git a/miniweb/src/model.ts b/miniweb/src/model.ts index 9739e07..a13e444 100644 --- a/miniweb/src/model.ts +++ b/miniweb/src/model.ts @@ -14,6 +14,7 @@ export class YaegerState { currentState: CurrentState = { status: RoasterStatus.idle }; + profile?: Profile } export enum RoasterStatus { @@ -30,6 +31,12 @@ export type CurrentState = { export type Measurement = { timestamp: Date message: YaegerMessage + extra?: MeasurementExtra +} + +export type MeasurementExtra = { + setpoint: number + pidData?: PIDData } export type RoastState = { @@ -37,6 +44,7 @@ export type RoastState = { measurements: Measurement[] | [] events: RoastEvent[] | [] commands: RoastCommand[] | [] + profile?: Profile } export type RoastEvent = { @@ -49,3 +57,20 @@ export type RoastCommand = { value: number timestamp: Date } + +export type PIDData = { + enabled: boolean + kp: number + ki: number + kd: number +} + +export type Profile = { + steps: ProfileStep[] +} + +export type ProfileStep = { + interpolation: 'linear' | 'ease-in' | 'ease-out' | 'ease-in-out' + setpoint: number + duration: number +} diff --git a/miniweb/src/pid.ts b/miniweb/src/pid.ts new file mode 100644 index 0000000..9271375 --- /dev/null +++ b/miniweb/src/pid.ts @@ -0,0 +1,47 @@ +export class PIDController { + private kp: number; // Proportional constant + private ki: number; // Integral constant + private kd: number; // Derivative constant + + private previousError: number; + private integral: number; + + constructor(kp: number, ki: number, kd: number) { + this.kp = kp; + this.ki = ki; + this.kd = kd; + + this.previousError = 0; + this.integral = 0; + } + + // Method to compute PID output based on error + public compute(setpoint: number, currentValue: number): number { + // Calculate the error + const error = setpoint - currentValue; + + // Proportional term + const pTerm = this.kp * error; + + // Integral term (accumulated error) + this.integral += error; + const iTerm = this.ki * this.integral; + + // Derivative term (rate of change of error) + const dTerm = this.kd * (error - this.previousError); + + // Save the current error for the next calculation + this.previousError = error; + + // Sum of all terms + const output = pTerm + iTerm + dTerm; + + return output; + } + + // Optionally, reset the controller state + public reset() { + this.previousError = 0; + this.integral = 0; + } +} diff --git a/miniweb/src/profiling.ts b/miniweb/src/profiling.ts new file mode 100644 index 0000000..9c84e22 --- /dev/null +++ b/miniweb/src/profiling.ts @@ -0,0 +1,149 @@ +import van from "vanjs-core"; +const { label, button, div, input, select, option, canvas, p, span } = van.tags; + +import { Profile, RoastState } from "./model"; + +export const profile = van.state(); +export const followProfileEnabled = van.state(true); +const profileName = van.state(""); + +export function followProfile( + profile: Profile, + roast: RoastState, +): number | undefined { + if (!roast.startDate) return undefined; + + const elapsedTime = (new Date().getTime() - roast.startDate.getTime()) / 1000; // Elapsed time in seconds + let accumulatedTime = 0; + + for (const step of profile.steps) { + accumulatedTime += step.duration; + if (elapsedTime <= accumulatedTime) { + // We're in this step + const stepStartTime = accumulatedTime - step.duration; + const progress = (elapsedTime - stepStartTime) / step.duration; + + // Interpolate setpoint + const prevSetpoint = + stepStartTime === 0 + ? profile.steps[0].setpoint + : profile.steps.find((s, i) => profile.steps[i + 1] === step) + ?.setpoint || step.setpoint; + const nextSetpoint = step.setpoint; + + return ( + Math.floor( + interpolateSetpoint( + prevSetpoint, + nextSetpoint, + progress, + step.interpolation, + ) * 10, + ) / 10 + ); + } + } + + // If no valid step is found, return last setpoint + return profile.steps.length > 0 + ? profile.steps[profile.steps.length - 1].setpoint + : undefined; +} + +function interpolateSetpoint( + start: number, + end: number, + progress: number, + type: "linear" | "ease-in" | "ease-out" | "ease-in-out", +): number { + switch (type) { + case "linear": + return start + (end - start) * progress; + case "ease-in": + return start + (end - start) * Math.pow(progress, 2); + case "ease-out": + return start + (end - start) * (1 - Math.pow(1 - progress, 2)); + case "ease-in-out": + return ( + start + + (end - start) * + (progress < 0.5 + ? 2 * Math.pow(progress, 2) + : 1 - Math.pow(-2 * progress + 2, 2) / 2) + ); + default: + return end; + } +} + +export const ProfileControl = () => + div( + "Profile:", + profile.val ? profileName.val : "waiting", + p(), + UploadProfileInput, + button( + { + onclick: () => { + const fileInput = document.getElementById("profileInput"); + fileInput?.click(); + }, + }, + "Load", + ), + button( + { + onclick: () => { + profile.val = undefined; + }, + }, + "Clear", + ), + p(), + label( + input({ + type: "checkbox", + checked: followProfileEnabled, + oninput: (e) => (followProfileEnabled.val = e.target.checked), + }), + "Follow Profile Enabled", + ), + ); + +function isValidProfile(obj: any): obj is Profile { + return obj && typeof obj.steps === "object"; +} + +const UploadProfileInput = () => { + const fileInput = input({ + type: "file", + id: "profileInput", + accept: "application/json", + style: "display: none;", + }); + fileInput.addEventListener("change", (event) => { + const file = event.target.files[0]; + if (!file) { + return; + } + const reader = new FileReader(); + + reader.onload = (e) => { + try { + console.log("reading: ", e.target.result); + const jsonData = JSON.parse(e.target.result); + const jsonProfile: Profile = jsonData as Profile; + if (isValidProfile(jsonProfile) == false) { + throw "Invalid profile"; + } + profileName.val = file.name; + profile.val = jsonProfile; + } catch (error) { + console.log("upload failed:", error); + } + }; + reader.readAsText(file); + }); + + return div(fileInput); +}; diff --git a/miniweb/src/style.css b/miniweb/src/style.css index 9a8646b..27f514b 100644 --- a/miniweb/src/style.css +++ b/miniweb/src/style.css @@ -130,4 +130,18 @@ input[type="range"]::-webkit-slider-thumb { margin-top: -7px; /* Center thumb */ } +/* Disabled slider styles */ +input[type="range"]:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +input[type="range"]:disabled::-webkit-slider-runnable-track { + background: #bbb; /* Lighter track for disabled state */ +} +input[type="range"]:disabled::-webkit-slider-thumb { + background: #888; /* Gray thumb for disabled state */ + border: 2px solid #ccc; + cursor: not-allowed; +} diff --git a/miniweb/yarn.lock b/miniweb/yarn.lock index fbc24a8..f40c61a 100644 --- a/miniweb/yarn.lock +++ b/miniweb/yarn.lock @@ -33,7 +33,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz" integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== -"@babel/core@^7.24.4": +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.24.4", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": version "7.26.0" resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -792,126 +792,11 @@ "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" -"@esbuild/aix-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c" - integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw== - -"@esbuild/android-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0" - integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w== - -"@esbuild/android-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810" - integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew== - -"@esbuild/android-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705" - integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ== - "@esbuild/darwin-arm64@0.24.0": version "0.24.0" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz" integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw== -"@esbuild/darwin-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107" - integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA== - -"@esbuild/freebsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7" - integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA== - -"@esbuild/freebsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93" - integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ== - -"@esbuild/linux-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75" - integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g== - -"@esbuild/linux-arm@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d" - integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw== - -"@esbuild/linux-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb" - integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA== - -"@esbuild/linux-loong64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c" - integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g== - -"@esbuild/linux-mips64el@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3" - integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA== - -"@esbuild/linux-ppc64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e" - integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ== - -"@esbuild/linux-riscv64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25" - integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw== - -"@esbuild/linux-s390x@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319" - integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g== - -"@esbuild/linux-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef" - integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA== - -"@esbuild/netbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c" - integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg== - -"@esbuild/openbsd-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2" - integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg== - -"@esbuild/openbsd-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf" - integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q== - -"@esbuild/sunos-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4" - integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA== - -"@esbuild/win32-arm64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b" - integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA== - -"@esbuild/win32-ia32@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103" - integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw== - -"@esbuild/win32-x64@0.24.0": - version "0.24.0" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244" - integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA== - "@jridgewell/gen-mapping@^0.3.5": version "0.3.8" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" @@ -1011,101 +896,11 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e" - integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ== - -"@rollup/rollup-android-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d" - integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA== - "@rollup/rollup-darwin-arm64@4.28.1": version "4.28.1" resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz" integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ== -"@rollup/rollup-darwin-x64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2" - integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ== - -"@rollup/rollup-freebsd-arm64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946" - integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA== - -"@rollup/rollup-freebsd-x64@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282" - integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ== - -"@rollup/rollup-linux-arm-gnueabihf@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df" - integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA== - -"@rollup/rollup-linux-arm-musleabihf@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb" - integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg== - -"@rollup/rollup-linux-arm64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9" - integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA== - -"@rollup/rollup-linux-arm64-musl@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788" - integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A== - -"@rollup/rollup-linux-loongarch64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87" - integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c" - integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A== - -"@rollup/rollup-linux-riscv64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd" - integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA== - -"@rollup/rollup-linux-s390x-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd" - integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg== - -"@rollup/rollup-linux-x64-gnu@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e" - integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw== - -"@rollup/rollup-linux-x64-musl@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b" - integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g== - -"@rollup/rollup-win32-arm64-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11" - integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A== - -"@rollup/rollup-win32-ia32-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f" - integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA== - -"@rollup/rollup-win32-x64-msvc@4.28.1": - version "4.28.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0" - integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA== - "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" @@ -1123,16 +918,16 @@ dependencies: chart.js "^3.7.1" +"@types/estree@^1.0.0", "@types/estree@1.0.6": + version "1.0.6" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/estree@0.0.39": version "0.0.39" resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== -"@types/estree@1.0.6", "@types/estree@^1.0.0": - version "1.0.6" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" - integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== - "@types/resolve@1.20.2": version "1.20.2" resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz" @@ -1148,7 +943,7 @@ acorn@^8.8.2: resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== -ajv@^8.6.0: +ajv@^8.6.0, ajv@>=8: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== @@ -1247,7 +1042,7 @@ brace-expansion@^2.0.1: dependencies: balanced-match "^1.0.0" -browserslist@^4.24.0, browserslist@^4.24.2: +browserslist@^4.24.0, browserslist@^4.24.2, "browserslist@>= 4.21.0": version "4.24.3" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz" integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== @@ -1306,7 +1101,7 @@ chart.js@^3.7.1: resolved "https://registry.npmjs.org/chart.js/-/chart.js-3.9.1.tgz" integrity sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w== -chart.js@^4.4.7: +chart.js@^4.4.7, chart.js@>=2.8.0: version "4.4.7" resolved "https://registry.npmjs.org/chart.js/-/chart.js-4.4.7.tgz" integrity sha512-pwkcKfdzTMAU/+jNosKhNL2bHtJc/sSmYgVbuGTEDhzkrhmyihmP7vUc/5ZK9WopidMDHNe3Wm7jOd/WhuHWuw== @@ -1389,7 +1184,7 @@ data-view-byte-offset@^1.0.0: es-errors "^1.3.0" is-data-view "^1.0.1" -date-fns@^4.1.0: +date-fns@^4.1.0, date-fns@>=2.0.0: version "4.1.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz" integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== @@ -2154,7 +1949,7 @@ picomatch@^2.2.2: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -picomatch@^4.0.2: +"picomatch@^3 || ^4", picomatch@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== @@ -2281,7 +2076,7 @@ resolve@^1.14.2, resolve@^1.22.1: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -rollup@^2.43.1: +"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.0.0||^3.0.0||^4.0.0, rollup@^2.43.1, rollup@^2.78.0||^3.0.0||^4.0.0: version "2.79.2" resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz" integrity sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ== @@ -2542,7 +2337,7 @@ tempy@^0.6.0: type-fest "^0.16.0" unique-string "^2.0.0" -terser@^5.17.4: +terser@^5.16.0, terser@^5.17.4: version "5.37.0" resolved "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz" integrity sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA== @@ -2703,7 +2498,7 @@ vite-plugin-pwa@^0.21.1: workbox-build "^7.3.0" workbox-window "^7.3.0" -vite@^6.0.3: +"vite@^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", vite@^6.0.3: version "6.0.4" resolved "https://registry.npmjs.org/vite/-/vite-6.0.4.tgz" integrity sha512-zwlH6ar+6o6b4Wp+ydhtIKLrGM/LoqZzcdVmkGAFun0KHTzIzjh+h0kungEx7KJg/PYnC80I4TII9WkjciSR6Q== @@ -2930,7 +2725,7 @@ workbox-sw@7.3.0: resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz" integrity sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA== -workbox-window@7.3.0, workbox-window@^7.3.0: +workbox-window@^7.3.0, workbox-window@7.3.0: version "7.3.0" resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz" integrity sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA== diff --git a/platformio.ini b/platformio.ini index b1b5d00..7672254 100644 --- a/platformio.ini +++ b/platformio.ini @@ -46,11 +46,15 @@ extra_scripts = pre:extra_scripts.py extends = core board = esp32-s3-devkitc1-n16r8 monitor_speed = 115200 +monitor_filters = + esp32_exception_decoder [env:esp32-s3-mini] extends = core board = lolin_s3_mini monitor_speed = 115200 +monitor_filters = + esp32_exception_decoder build_flags = ${core.build_flags} -D ARDUINO_USB_CDC_ON_BOOT=1 diff --git a/python fig gen/ex_roast.json b/python fig gen/ex_roast.json new file mode 100644 index 0000000..cf76c99 --- /dev/null +++ b/python fig gen/ex_roast.json @@ -0,0 +1 @@ +{"startDate":"2025-03-16T14:20:11.138Z","measurements":[{"timestamp":"2025-03-16T14:20:11.746Z","message":{"ET":32.95,"BT":29.75,"Amb":34.625,"BurnerVal":0,"FanVal":95},"extra":{"setpoint":20,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:12.699Z","message":{"ET":32.95,"BT":29.75,"Amb":34.75,"BurnerVal":10,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:13.696Z","message":{"ET":33.075,"BT":30.425,"Amb":34.6875,"BurnerVal":11,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:14.718Z","message":{"ET":33.4,"BT":31.775,"Amb":34.6875,"BurnerVal":12,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:15.740Z","message":{"ET":33.9,"BT":33,"Amb":34.625,"BurnerVal":11,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:16.661Z","message":{"ET":34.225,"BT":34.125,"Amb":34.5625,"BurnerVal":11,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:17.704Z","message":{"ET":34.725,"BT":35.5,"Amb":34.5625,"BurnerVal":10,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:18.708Z","message":{"ET":35.3,"BT":36.275,"Amb":34.5625,"BurnerVal":10,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:19.741Z","message":{"ET":35.65,"BT":36.875,"Amb":34.625,"BurnerVal":10,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:20.656Z","message":{"ET":35.975,"BT":37.2,"Amb":34.5625,"BurnerVal":8,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:21.710Z","message":{"ET":36.35,"BT":37.7,"Amb":34.5,"BurnerVal":8,"FanVal":95},"extra":{"setpoint":40,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:22.766Z","message":{"ET":36.65,"BT":38.275,"Amb":34.5625,"BurnerVal":10,"FanVal":95},"extra":{"setpoint":40.58053116527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:23.782Z","message":{"ET":37,"BT":38.85,"Amb":34.625,"BurnerVal":10,"FanVal":95},"extra":{"setpoint":41.63327809861113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:24.750Z","message":{"ET":37.25,"BT":39.05,"Amb":34.5,"BurnerVal":10,"FanVal":95},"extra":{"setpoint":42.64421706111112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:25.671Z","message":{"ET":37.525,"BT":39.325,"Amb":34.4375,"BurnerVal":12,"FanVal":95},"extra":{"setpoint":43.60278938749998,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:26.733Z","message":{"ET":37.975,"BT":40.05,"Amb":34.4375,"BurnerVal":13,"FanVal":95},"extra":{"setpoint":44.512360165277784,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:27.726Z","message":{"ET":38.425,"BT":40.75,"Amb":34.4375,"BurnerVal":14,"FanVal":95},"extra":{"setpoint":45.560382199999985,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:28.744Z","message":{"ET":39.05,"BT":41.775,"Amb":34.375,"BurnerVal":14,"FanVal":95},"extra":{"setpoint":46.53360995,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:29.773Z","message":{"ET":39.475,"BT":43.15,"Amb":34.375,"BurnerVal":15,"FanVal":95},"extra":{"setpoint":47.533481949999995,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:30.722Z","message":{"ET":40,"BT":43.6,"Amb":34.375,"BurnerVal":15,"FanVal":95},"extra":{"setpoint":48.53827199444443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:31.721Z","message":{"ET":40.325,"BT":44.525,"Amb":34.3125,"BurnerVal":16,"FanVal":95},"extra":{"setpoint":49.46615994999999,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:32.749Z","message":{"ET":40.875,"BT":42.8,"Amb":34.25,"BurnerVal":17,"FanVal":95},"extra":{"setpoint":50.442003327777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:33.801Z","message":{"ET":41.55,"BT":46.05,"Amb":34.3125,"BurnerVal":20,"FanVal":95},"extra":{"setpoint":51.43343383194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:34.684Z","message":{"ET":42.075,"BT":46.95,"Amb":34.375,"BurnerVal":20,"FanVal":95},"extra":{"setpoint":52.44704319444443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:35.737Z","message":{"ET":42.875,"BT":48.15,"Amb":34.3125,"BurnerVal":20,"FanVal":95},"extra":{"setpoint":53.2998082986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:36.732Z","message":{"ET":43.4,"BT":49.1,"Amb":34.25,"BurnerVal":20,"FanVal":95},"extra":{"setpoint":54.31161991111114,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:37.756Z","message":{"ET":44.075,"BT":50.05,"Amb":34.3125,"BurnerVal":20,"FanVal":95},"extra":{"setpoint":55.2667832986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:38.677Z","message":{"ET":44.45,"BT":50.85,"Amb":34.3125,"BurnerVal":21,"FanVal":95},"extra":{"setpoint":56.243031765277784,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:39.701Z","message":{"ET":44.975,"BT":52.025,"Amb":34.3125,"BurnerVal":22,"FanVal":95},"extra":{"setpoint":57.119364987500006,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:40.735Z","message":{"ET":45.625,"BT":53.075,"Amb":34.25,"BurnerVal":22,"FanVal":95},"extra":{"setpoint":58.09389398750001,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:41.752Z","message":{"ET":46.3,"BT":53.975,"Amb":34.3125,"BurnerVal":23,"FanVal":98},"extra":{"setpoint":59.07211772777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:42.672Z","message":{"ET":46.725,"BT":54.75,"Amb":34.375,"BurnerVal":23,"FanVal":98},"extra":{"setpoint":60.032294265277784,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:43.699Z","message":{"ET":47.6,"BT":55.3,"Amb":34.1875,"BurnerVal":24,"FanVal":98},"extra":{"setpoint":60.8984154875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:44.749Z","message":{"ET":48.475,"BT":55.8,"Amb":34.4375,"BurnerVal":25,"FanVal":98},"extra":{"setpoint":61.862493194444426,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:45.745Z","message":{"ET":49.175,"BT":56.475,"Amb":34.375,"BurnerVal":26,"FanVal":98},"extra":{"setpoint":62.84419838750002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:46.767Z","message":{"ET":50.05,"BT":57.7,"Amb":34.3125,"BurnerVal":27,"FanVal":98},"extra":{"setpoint":63.7734746875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:47.690Z","message":{"ET":50.875,"BT":58.5,"Amb":34.375,"BurnerVal":28,"FanVal":98},"extra":{"setpoint":64.72414476527779,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:48.716Z","message":{"ET":51.475,"BT":59.575,"Amb":34.375,"BurnerVal":30,"FanVal":98},"extra":{"setpoint":65.58115733194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:49.850Z","message":{"ET":52.275,"BT":61.1,"Amb":34.375,"BurnerVal":30,"FanVal":98},"extra":{"setpoint":66.52999643194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:50.759Z","message":{"ET":53.175,"BT":62.45,"Amb":34.375,"BurnerVal":30,"FanVal":98},"extra":{"setpoint":67.57439111111108,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:51.681Z","message":{"ET":53.975,"BT":63.75,"Amb":34.25,"BurnerVal":30,"FanVal":98},"extra":{"setpoint":68.4088078,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:52.709Z","message":{"ET":54.8,"BT":65.025,"Amb":34.3125,"BurnerVal":30,"FanVal":98},"extra":{"setpoint":69.25466166527777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:53.782Z","message":{"ET":55.55,"BT":65.75,"Amb":34.25,"BurnerVal":30,"FanVal":98},"extra":{"setpoint":70.19304155,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:54.758Z","message":{"ET":56.275,"BT":66.4,"Amb":34.25,"BurnerVal":30,"FanVal":98},"extra":{"setpoint":71.17214109861112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:55.777Z","message":{"ET":57.15,"BT":67.05,"Amb":34.25,"BurnerVal":31,"FanVal":98},"extra":{"setpoint":72.0564789875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:56.701Z","message":{"ET":58.025,"BT":67.725,"Amb":34.3125,"BurnerVal":32,"FanVal":98},"extra":{"setpoint":72.97885372777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:57.755Z","message":{"ET":59.05,"BT":68.65,"Amb":34.25,"BurnerVal":33,"FanVal":98},"extra":{"setpoint":73.8136443875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:58.759Z","message":{"ET":59.7,"BT":69.7,"Amb":34.4375,"BurnerVal":34,"FanVal":98},"extra":{"setpoint":74.76195746527779,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:20:59.782Z","message":{"ET":60.625,"BT":70.775,"Amb":34.25,"BurnerVal":34,"FanVal":98},"extra":{"setpoint":75.66330986111112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:00.695Z","message":{"ET":61.325,"BT":71.775,"Amb":34.3125,"BurnerVal":34,"FanVal":98},"extra":{"setpoint":76.57881706111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:01.727Z","message":{"ET":62.375,"BT":73.2,"Amb":34.375,"BurnerVal":35,"FanVal":98},"extra":{"setpoint":77.39173839444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:02.771Z","message":{"ET":63.4,"BT":74.5,"Amb":34.5,"BurnerVal":35,"FanVal":98},"extra":{"setpoint":78.30706220000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:03.783Z","message":{"ET":64.3,"BT":75.625,"Amb":34.6875,"BurnerVal":35,"FanVal":98},"extra":{"setpoint":79.23447298749998,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:04.791Z","message":{"ET":65.25,"BT":76.55,"Amb":34.625,"BurnerVal":35,"FanVal":98},"extra":{"setpoint":80.12622443194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:05.749Z","message":{"ET":66.075,"BT":77.275,"Amb":34.625,"BurnerVal":35,"FanVal":98},"extra":{"setpoint":81.01250611111114,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:06.739Z","message":{"ET":66.8,"BT":77.775,"Amb":34.625,"BurnerVal":36,"FanVal":98},"extra":{"setpoint":81.85392338749999,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:07.775Z","message":{"ET":67.35,"BT":78.825,"Amb":34.625,"BurnerVal":37,"FanVal":98},"extra":{"setpoint":82.71985988749998,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:08.811Z","message":{"ET":68.05,"BT":79.775,"Amb":34.5625,"BurnerVal":37,"FanVal":98},"extra":{"setpoint":83.6239870611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:09.705Z","message":{"ET":68.575,"BT":80.275,"Amb":34.5625,"BurnerVal":38,"FanVal":98},"extra":{"setpoint":84.52252444444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:10.729Z","message":{"ET":69.5,"BT":80.725,"Amb":34.625,"BurnerVal":38,"FanVal":98},"extra":{"setpoint":85.2987392,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:11.788Z","message":{"ET":70.575,"BT":81.25,"Amb":34.5,"BurnerVal":40,"FanVal":98},"extra":{"setpoint":86.18052443194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:12.779Z","message":{"ET":71.175,"BT":82.3,"Amb":34.4375,"BurnerVal":40,"FanVal":98},"extra":{"setpoint":87.09464683194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:13.852Z","message":{"ET":72.075,"BT":83.925,"Amb":34.4375,"BurnerVal":41,"FanVal":98},"extra":{"setpoint":87.94397333194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:14.720Z","message":{"ET":72.975,"BT":84.925,"Amb":34.4375,"BurnerVal":41,"FanVal":98},"extra":{"setpoint":88.86143154999999,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:15.745Z","message":{"ET":73.825,"BT":86,"Amb":34.5,"BurnerVal":41,"FanVal":98},"extra":{"setpoint":89.6004153875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:16.784Z","message":{"ET":74.7,"BT":86.725,"Amb":34.4375,"BurnerVal":41,"FanVal":98},"extra":{"setpoint":90.47307297777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:17.832Z","message":{"ET":75.5,"BT":87.325,"Amb":34.5,"BurnerVal":42,"FanVal":98},"extra":{"setpoint":91.35210039444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:18.716Z","message":{"ET":76.325,"BT":87.7,"Amb":34.375,"BurnerVal":42,"FanVal":98},"extra":{"setpoint":92.23655999444443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:19.751Z","message":{"ET":77.225,"BT":88.475,"Amb":34.4375,"BurnerVal":43,"FanVal":98},"extra":{"setpoint":92.98023972777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:20.897Z","message":{"ET":78.225,"BT":89.4,"Amb":34.375,"BurnerVal":44,"FanVal":98},"extra":{"setpoint":93.84902932777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:21.790Z","message":{"ET":78.9,"BT":90.4,"Amb":34.4375,"BurnerVal":45,"FanVal":98},"extra":{"setpoint":94.80742588749999,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:22.708Z","message":{"ET":79.7,"BT":91.4,"Amb":34.375,"BurnerVal":45,"FanVal":98},"extra":{"setpoint":95.54939499999999,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:23.873Z","message":{"ET":80.725,"BT":92.4,"Amb":34.3125,"BurnerVal":45,"FanVal":98},"extra":{"setpoint":96.31319944444444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:24.757Z","message":{"ET":81.55,"BT":93,"Amb":34.375,"BurnerVal":45,"FanVal":98},"extra":{"setpoint":97.27703468750002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:25.798Z","message":{"ET":82.6,"BT":93.7,"Amb":34.3125,"BurnerVal":46,"FanVal":98},"extra":{"setpoint":98.00258246527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:26.842Z","message":{"ET":83.3,"BT":94.925,"Amb":34.375,"BurnerVal":47,"FanVal":98},"extra":{"setpoint":98.8597358,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:27.730Z","message":{"ET":83.925,"BT":95.85,"Amb":34.375,"BurnerVal":47,"FanVal":98},"extra":{"setpoint":99.71713718750001,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:28.756Z","message":{"ET":84.75,"BT":96.75,"Amb":34.375,"BurnerVal":47,"FanVal":98},"extra":{"setpoint":100.43868499861111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:29.821Z","message":{"ET":85.75,"BT":97.725,"Amb":34.3125,"BurnerVal":48,"FanVal":98},"extra":{"setpoint":101.2766643875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:30.802Z","message":{"ET":86.675,"BT":99.3,"Amb":34.375,"BurnerVal":48,"FanVal":98},"extra":{"setpoint":102.1375923875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:31.721Z","message":{"ET":87.45,"BT":100.175,"Amb":34.4375,"BurnerVal":47,"FanVal":98},"extra":{"setpoint":102.93087926527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:32.743Z","message":{"ET":88.55,"BT":100.825,"Amb":34.375,"BurnerVal":48,"FanVal":98},"extra":{"setpoint":103.67245439444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:33.812Z","message":{"ET":89.475,"BT":101.75,"Amb":34.3125,"BurnerVal":48,"FanVal":98},"extra":{"setpoint":104.4901919875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:34.808Z","message":{"ET":90.275,"BT":102.325,"Amb":34.4375,"BurnerVal":48,"FanVal":98},"extra":{"setpoint":105.3465502,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:35.870Z","message":{"ET":91.05,"BT":102.625,"Amb":34.375,"BurnerVal":50,"FanVal":98},"extra":{"setpoint":106.13769398750001,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:36.739Z","message":{"ET":91.95,"BT":103.2,"Amb":34.375,"BurnerVal":50,"FanVal":98},"extra":{"setpoint":106.98236516527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:37.761Z","message":{"ET":92.85,"BT":104.35,"Amb":34.4375,"BurnerVal":51,"FanVal":98},"extra":{"setpoint":107.67068983194442,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:38.825Z","message":{"ET":93.85,"BT":105.5,"Amb":34.3125,"BurnerVal":51,"FanVal":98},"extra":{"setpoint":108.47501366527776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:39.813Z","message":{"ET":94.675,"BT":106.1,"Amb":34.375,"BurnerVal":51,"FanVal":98},"extra":{"setpoint":109.31095413194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:40.738Z","message":{"ET":95.35,"BT":106.45,"Amb":34.25,"BurnerVal":51,"FanVal":98},"extra":{"setpoint":110.08280588749999,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:41.757Z","message":{"ET":96.225,"BT":107.6,"Amb":34.3125,"BurnerVal":52,"FanVal":98},"extra":{"setpoint":110.80522993194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:42.786Z","message":{"ET":97.05,"BT":108.625,"Amb":34.3125,"BurnerVal":52,"FanVal":98},"extra":{"setpoint":111.5990078,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:43.818Z","message":{"ET":97.8,"BT":109.625,"Amb":34.375,"BurnerVal":52,"FanVal":98},"extra":{"setpoint":112.39607548750001,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:44.725Z","message":{"ET":98.5,"BT":110,"Amb":34.25,"BurnerVal":52,"FanVal":98},"extra":{"setpoint":113.19174257777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:45.766Z","message":{"ET":99.35,"BT":110.65,"Amb":34.3125,"BurnerVal":53,"FanVal":98},"extra":{"setpoint":113.89003997777779,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:46.773Z","message":{"ET":100.175,"BT":111.875,"Amb":34.25,"BurnerVal":54,"FanVal":98},"extra":{"setpoint":114.68703819999999,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:47.844Z","message":{"ET":100.925,"BT":112.725,"Amb":34.3125,"BurnerVal":54,"FanVal":98},"extra":{"setpoint":115.4558840986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:48.838Z","message":{"ET":101.725,"BT":113.65,"Amb":34.3125,"BurnerVal":54,"FanVal":98},"extra":{"setpoint":116.27126218749997,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:49.803Z","message":{"ET":102.3,"BT":114.475,"Amb":34.375,"BurnerVal":54,"FanVal":98},"extra":{"setpoint":117.02370380000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:50.774Z","message":{"ET":103,"BT":115.1,"Amb":34.1875,"BurnerVal":54,"FanVal":98},"extra":{"setpoint":117.75230426527779,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:51.790Z","message":{"ET":103.85,"BT":115.675,"Amb":34.3125,"BurnerVal":55,"FanVal":98},"extra":{"setpoint":118.48357496527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:52.846Z","message":{"ET":104.575,"BT":116.475,"Amb":34.25,"BurnerVal":55,"FanVal":98},"extra":{"setpoint":119.24364683194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:53.752Z","message":{"ET":105.4,"BT":117.2,"Amb":34.3125,"BurnerVal":56,"FanVal":98},"extra":{"setpoint":120.03141972777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:54.845Z","message":{"ET":106.075,"BT":118.025,"Amb":34.3125,"BurnerVal":56,"FanVal":98},"extra":{"setpoint":120.70695155,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:55.792Z","message":{"ET":106.775,"BT":118.825,"Amb":34.3125,"BurnerVal":56,"FanVal":98},"extra":{"setpoint":121.51634195,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:56.846Z","message":{"ET":107.575,"BT":119.95,"Amb":34.3125,"BurnerVal":57,"FanVal":98},"extra":{"setpoint":122.21705059861111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:57.838Z","message":{"ET":108.4,"BT":120.9,"Amb":34.3125,"BurnerVal":57,"FanVal":98},"extra":{"setpoint":122.9916213111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:58.753Z","message":{"ET":109.025,"BT":121.8,"Amb":34.25,"BurnerVal":57,"FanVal":98},"extra":{"setpoint":123.7206978875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:21:59.842Z","message":{"ET":109.75,"BT":122.45,"Amb":34.25,"BurnerVal":57,"FanVal":98},"extra":{"setpoint":124.38799913194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:00.810Z","message":{"ET":110.425,"BT":123.175,"Amb":34.25,"BurnerVal":57,"FanVal":98},"extra":{"setpoint":125.1785848,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:01.858Z","message":{"ET":111.1,"BT":123.95,"Amb":34.3125,"BurnerVal":57,"FanVal":98},"extra":{"setpoint":125.87985777777779,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:02.747Z","message":{"ET":111.8,"BT":124.1,"Amb":34.4375,"BurnerVal":58,"FanVal":98},"extra":{"setpoint":126.63615280000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:03.789Z","message":{"ET":112.575,"BT":125.225,"Amb":34.4375,"BurnerVal":58,"FanVal":98},"extra":{"setpoint":127.2745952,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:04.794Z","message":{"ET":113.425,"BT":125.85,"Amb":34.4375,"BurnerVal":58,"FanVal":98},"extra":{"setpoint":128.0238246611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:05.878Z","message":{"ET":114.175,"BT":127.025,"Amb":34.5,"BurnerVal":60,"FanVal":98},"extra":{"setpoint":128.7393996875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:06.751Z","message":{"ET":114.7,"BT":127.75,"Amb":34.6875,"BurnerVal":58,"FanVal":98},"extra":{"setpoint":129.50962083194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:07.765Z","message":{"ET":115.375,"BT":128.275,"Amb":34.625,"BurnerVal":60,"FanVal":98},"extra":{"setpoint":130.12754599444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:08.799Z","message":{"ET":115.975,"BT":128.525,"Amb":34.625,"BurnerVal":60,"FanVal":98},"extra":{"setpoint":130.84191218750001,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:09.819Z","message":{"ET":116.775,"BT":129.025,"Amb":34.625,"BurnerVal":60,"FanVal":98},"extra":{"setpoint":131.56884875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:10.857Z","message":{"ET":117.475,"BT":129.45,"Amb":34.75,"BurnerVal":60,"FanVal":98},"extra":{"setpoint":132.28303683194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:11.758Z","message":{"ET":117.925,"BT":129.925,"Amb":34.6875,"BurnerVal":61,"FanVal":98},"extra":{"setpoint":133.0047575986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:12.787Z","message":{"ET":118.45,"BT":130.75,"Amb":34.6875,"BurnerVal":62,"FanVal":98},"extra":{"setpoint":133.63070049861113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:13.806Z","message":{"ET":119.375,"BT":131.6,"Amb":34.6875,"BurnerVal":62,"FanVal":98},"extra":{"setpoint":134.34339500000004,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:14.877Z","message":{"ET":120.025,"BT":131.9,"Amb":34.6875,"BurnerVal":62,"FanVal":98},"extra":{"setpoint":135.0435189875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:15.806Z","message":{"ET":120.6,"BT":132.45,"Amb":34.75,"BurnerVal":63,"FanVal":98},"extra":{"setpoint":135.77771180000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:16.788Z","message":{"ET":121.15,"BT":133.525,"Amb":34.6875,"BurnerVal":63,"FanVal":98},"extra":{"setpoint":136.41129864444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:17.817Z","message":{"ET":121.975,"BT":134.35,"Amb":34.6875,"BurnerVal":63,"FanVal":98},"extra":{"setpoint":137.08118483194446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:18.826Z","message":{"ET":122.575,"BT":135.25,"Amb":34.75,"BurnerVal":63,"FanVal":98},"extra":{"setpoint":137.77676480000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:19.968Z","message":{"ET":123.425,"BT":135.35,"Amb":34.6875,"BurnerVal":64,"FanVal":98},"extra":{"setpoint":138.45730026527775,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:20.772Z","message":{"ET":123.775,"BT":135.925,"Amb":34.6875,"BurnerVal":65,"FanVal":98},"extra":{"setpoint":139.2241278875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:21.796Z","message":{"ET":124.525,"BT":136.65,"Amb":34.8125,"BurnerVal":65,"FanVal":98},"extra":{"setpoint":139.76249064444443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:22.818Z","message":{"ET":125.125,"BT":137.325,"Amb":34.6875,"BurnerVal":65,"FanVal":98},"extra":{"setpoint":140.44404876527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:23.902Z","message":{"ET":125.75,"BT":138.85,"Amb":34.6875,"BurnerVal":66,"FanVal":98},"extra":{"setpoint":141.12203788750003,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:24.881Z","message":{"ET":126.45,"BT":139.9,"Amb":34.75,"BurnerVal":65,"FanVal":98},"extra":{"setpoint":141.83930468750003,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:25.789Z","message":{"ET":127,"BT":140.425,"Amb":34.8125,"BurnerVal":65,"FanVal":98},"extra":{"setpoint":142.48243748749996,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:26.869Z","message":{"ET":127.725,"BT":140.875,"Amb":34.75,"BurnerVal":65,"FanVal":98},"extra":{"setpoint":143.07650611111112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:27.839Z","message":{"ET":128.275,"BT":141.325,"Amb":34.6875,"BurnerVal":66,"FanVal":98},"extra":{"setpoint":143.78155683194447,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:28.891Z","message":{"ET":129,"BT":142.025,"Amb":34.75,"BurnerVal":66,"FanVal":98},"extra":{"setpoint":144.40950379999998,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:29.784Z","message":{"ET":129.7,"BT":143.025,"Amb":34.8125,"BurnerVal":67,"FanVal":98},"extra":{"setpoint":145.0903428875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:30.805Z","message":{"ET":130.325,"BT":143.75,"Amb":34.8125,"BurnerVal":66,"FanVal":98},"extra":{"setpoint":145.66531706111112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:31.941Z","message":{"ET":130.85,"BT":144.3,"Amb":34.6875,"BurnerVal":67,"FanVal":98},"extra":{"setpoint":146.3199921875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:32.899Z","message":{"ET":131.675,"BT":145.025,"Amb":34.75,"BurnerVal":67,"FanVal":98},"extra":{"setpoint":147.0456398,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:33.791Z","message":{"ET":132.225,"BT":145.75,"Amb":34.625,"BurnerVal":67,"FanVal":98},"extra":{"setpoint":147.65425986111114,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:34.803Z","message":{"ET":132.875,"BT":146.375,"Amb":34.625,"BurnerVal":67,"FanVal":98},"extra":{"setpoint":148.21865799444447,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:35.877Z","message":{"ET":133.675,"BT":146.85,"Amb":34.75,"BurnerVal":68,"FanVal":98},"extra":{"setpoint":148.85630795,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:36.846Z","message":{"ET":134.35,"BT":147.65,"Amb":34.75,"BurnerVal":68,"FanVal":98},"extra":{"setpoint":149.52991179999998,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:37.901Z","message":{"ET":135.075,"BT":148.9,"Amb":34.75,"BurnerVal":68,"FanVal":98},"extra":{"setpoint":150.13304195,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:38.798Z","message":{"ET":135.625,"BT":149.325,"Amb":34.625,"BurnerVal":68,"FanVal":98},"extra":{"setpoint":150.78939875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:40.036Z","message":{"ET":136.425,"BT":149.85,"Amb":34.5625,"BurnerVal":68,"FanVal":98},"extra":{"setpoint":151.34573116527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:40.851Z","message":{"ET":136.725,"BT":150.125,"Amb":34.625,"BurnerVal":70,"FanVal":98},"extra":{"setpoint":152.10817409861113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:41.924Z","message":{"ET":137.225,"BT":150.75,"Amb":34.625,"BurnerVal":70,"FanVal":98},"extra":{"setpoint":152.60839343194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:42.802Z","message":{"ET":137.75,"BT":151.375,"Amb":34.5,"BurnerVal":70,"FanVal":98},"extra":{"setpoint":153.26273329861112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:43.809Z","message":{"ET":138.4,"BT":152.1,"Amb":34.5625,"BurnerVal":70,"FanVal":98},"extra":{"setpoint":153.79688572777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:44.853Z","message":{"ET":139.1,"BT":152.725,"Amb":34.5625,"BurnerVal":70,"FanVal":98},"extra":{"setpoint":154.40497633194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:45.859Z","message":{"ET":139.475,"BT":153.25,"Amb":34.5,"BurnerVal":70,"FanVal":98},"extra":{"setpoint":155.0336934319444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:46.811Z","message":{"ET":140.05,"BT":153.675,"Amb":34.5,"BurnerVal":70,"FanVal":98},"extra":{"setpoint":155.6366618875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:47.803Z","message":{"ET":140.425,"BT":153.975,"Amb":34.6875,"BurnerVal":70,"FanVal":98},"extra":{"setpoint":156.20467533194446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:48.826Z","message":{"ET":141.125,"BT":154.775,"Amb":34.625,"BurnerVal":71,"FanVal":98},"extra":{"setpoint":156.79506163194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:49.851Z","message":{"ET":141.575,"BT":155.425,"Amb":34.625,"BurnerVal":71,"FanVal":98},"extra":{"setpoint":157.3998066611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:50.926Z","message":{"ET":142.025,"BT":155.7,"Amb":34.5,"BurnerVal":71,"FanVal":98},"extra":{"setpoint":158.00281843194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:51.807Z","message":{"ET":142.6,"BT":156.325,"Amb":34.5625,"BurnerVal":72,"FanVal":98},"extra":{"setpoint":158.63210999444442,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:52.822Z","message":{"ET":143.15,"BT":156.875,"Amb":34.5,"BurnerVal":72,"FanVal":98},"extra":{"setpoint":159.14544299861112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:53.897Z","message":{"ET":143.85,"BT":157.525,"Amb":34.5625,"BurnerVal":72,"FanVal":98},"extra":{"setpoint":159.73360243194446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:54.869Z","message":{"ET":144.325,"BT":158.275,"Amb":34.4375,"BurnerVal":73,"FanVal":98},"extra":{"setpoint":160.35344959861112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:55.823Z","message":{"ET":144.825,"BT":159.05,"Amb":34.5625,"BurnerVal":73,"FanVal":98},"extra":{"setpoint":160.91166649861108,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:56.854Z","message":{"ET":145.525,"BT":159.475,"Amb":34.5,"BurnerVal":73,"FanVal":98},"extra":{"setpoint":161.4581346875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:57.852Z","message":{"ET":145.975,"BT":160.175,"Amb":34.5625,"BurnerVal":73,"FanVal":98},"extra":{"setpoint":162.04406163194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:58.865Z","message":{"ET":146.575,"BT":161.025,"Amb":34.4375,"BurnerVal":73,"FanVal":98},"extra":{"setpoint":162.6089739875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:22:59.785Z","message":{"ET":147.1,"BT":161.35,"Amb":34.5,"BurnerVal":73,"FanVal":98},"extra":{"setpoint":163.1801094875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:00.822Z","message":{"ET":147.45,"BT":161.925,"Amb":34.5,"BurnerVal":74,"FanVal":98},"extra":{"setpoint":163.6947096875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:01.834Z","message":{"ET":148,"BT":162.7,"Amb":34.4375,"BurnerVal":74,"FanVal":98},"extra":{"setpoint":164.2737579875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:02.875Z","message":{"ET":148.625,"BT":163.2,"Amb":34.375,"BurnerVal":74,"FanVal":98},"extra":{"setpoint":164.83597439444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:03.881Z","message":{"ET":149.175,"BT":163.725,"Amb":34.3125,"BurnerVal":74,"FanVal":98},"extra":{"setpoint":165.41021039444445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:04.834Z","message":{"ET":149.675,"BT":164.35,"Amb":34.4375,"BurnerVal":74,"FanVal":98},"extra":{"setpoint":165.96391039444444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:05.872Z","message":{"ET":150.25,"BT":164.925,"Amb":34.4375,"BurnerVal":75,"FanVal":98},"extra":{"setpoint":166.48425772777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:06.854Z","message":{"ET":150.8,"BT":165.575,"Amb":34.5,"BurnerVal":75,"FanVal":98},"extra":{"setpoint":167.04765755,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:07.874Z","message":{"ET":151.325,"BT":166,"Amb":34.5,"BurnerVal":75,"FanVal":98},"extra":{"setpoint":167.57893864444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:08.796Z","message":{"ET":151.775,"BT":166.45,"Amb":34.5,"BurnerVal":75,"FanVal":98},"extra":{"setpoint":168.13062638749997,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:09.833Z","message":{"ET":152.275,"BT":166.5,"Amb":34.375,"BurnerVal":75,"FanVal":98},"extra":{"setpoint":168.62278024444447,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:10.843Z","message":{"ET":152.775,"BT":167.5,"Amb":34.375,"BurnerVal":76,"FanVal":98},"extra":{"setpoint":169.1747783111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:11.975Z","message":{"ET":153.375,"BT":168.5,"Amb":34.5,"BurnerVal":76,"FanVal":98},"extra":{"setpoint":169.71058163194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:12.895Z","message":{"ET":153.725,"BT":168.875,"Amb":34.5,"BurnerVal":76,"FanVal":98},"extra":{"setpoint":170.30609163194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:13.845Z","message":{"ET":154.075,"BT":169.075,"Amb":34.4375,"BurnerVal":76,"FanVal":98},"extra":{"setpoint":170.7877893111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:14.856Z","message":{"ET":154.5,"BT":169.725,"Amb":34.5,"BurnerVal":77,"FanVal":98},"extra":{"setpoint":171.2843102,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:15.863Z","message":{"ET":155.025,"BT":170.225,"Amb":34.3125,"BurnerVal":77,"FanVal":98},"extra":{"setpoint":171.8088464875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:16.885Z","message":{"ET":155.5,"BT":170.55,"Amb":34.3125,"BurnerVal":77,"FanVal":98},"extra":{"setpoint":172.32899968750002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:17.807Z","message":{"ET":156.075,"BT":171.075,"Amb":34.25,"BurnerVal":77,"FanVal":98},"extra":{"setpoint":172.85349576527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:18.846Z","message":{"ET":156.35,"BT":171.675,"Amb":34.25,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":173.3236726611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:19.860Z","message":{"ET":156.8,"BT":172.35,"Amb":34.3125,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":173.8517673277778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:20.891Z","message":{"ET":157.425,"BT":172.725,"Amb":34.375,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":174.36326338749998,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:21.801Z","message":{"ET":157.85,"BT":173.5,"Amb":34.375,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":174.8814219875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:22.959Z","message":{"ET":158.75,"BT":174.475,"Amb":34.4375,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":175.33537280000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:23.885Z","message":{"ET":159.3,"BT":174.875,"Amb":34.375,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":175.90985383194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:24.876Z","message":{"ET":159.75,"BT":175.075,"Amb":34.25,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":176.3669582986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:25.916Z","message":{"ET":160,"BT":175.7,"Amb":34.25,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":176.85497916527777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:26.955Z","message":{"ET":160.45,"BT":176.4,"Amb":34.1875,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":177.36167309861113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:27.855Z","message":{"ET":160.875,"BT":176.75,"Amb":34.1875,"BurnerVal":78,"FanVal":98},"extra":{"setpoint":177.86634176527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:28.868Z","message":{"ET":161.325,"BT":177.2,"Amb":34.125,"BurnerVal":80,"FanVal":98},"extra":{"setpoint":178.29968663194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:29.900Z","message":{"ET":161.725,"BT":177.75,"Amb":34.1875,"BurnerVal":80,"FanVal":98},"extra":{"setpoint":178.78631649861111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:30.812Z","message":{"ET":162.25,"BT":178.15,"Amb":34.3125,"BurnerVal":80,"FanVal":98},"extra":{"setpoint":179.27865216527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:31.867Z","message":{"ET":162.875,"BT":178.65,"Amb":34.3125,"BurnerVal":80,"FanVal":98},"extra":{"setpoint":179.71080399444443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:32.963Z","message":{"ET":163.35,"BT":179.2,"Amb":34.25,"BurnerVal":80,"FanVal":98},"extra":{"setpoint":180.2088546611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:33.988Z","message":{"ET":163.675,"BT":179.325,"Amb":34.375,"BurnerVal":80,"FanVal":98},"extra":{"setpoint":180.72202793194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:34.909Z","message":{"ET":163.925,"BT":179.35,"Amb":34.3125,"BurnerVal":80,"FanVal":98},"extra":{"setpoint":181.19984183194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:35.878Z","message":{"ET":164.3,"BT":179.65,"Amb":34.1875,"BurnerVal":80,"FanVal":98},"extra":{"setpoint":181.6262661111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:36.876Z","message":{"ET":164.625,"BT":180.1,"Amb":34.25,"BurnerVal":81,"FanVal":98},"extra":{"setpoint":182.07237083194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:37.877Z","message":{"ET":165.15,"BT":180.45,"Amb":34.5,"BurnerVal":81,"FanVal":98},"extra":{"setpoint":182.5290999875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:38.905Z","message":{"ET":165.8,"BT":181.075,"Amb":34.5625,"BurnerVal":81,"FanVal":98},"extra":{"setpoint":182.9848763875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:39.822Z","message":{"ET":166.225,"BT":181.675,"Amb":34.5,"BurnerVal":82,"FanVal":98},"extra":{"setpoint":183.4486796875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:40.880Z","message":{"ET":166.825,"BT":182.225,"Amb":34.625,"BurnerVal":82,"FanVal":98},"extra":{"setpoint":183.8607349111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:41.911Z","message":{"ET":167.075,"BT":182.675,"Amb":34.5625,"BurnerVal":82,"FanVal":98},"extra":{"setpoint":184.3336916652778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:42.895Z","message":{"ET":167.575,"BT":183.05,"Amb":34.5,"BurnerVal":82,"FanVal":98},"extra":{"setpoint":184.79115066111112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:43.818Z","message":{"ET":168.1,"BT":183.375,"Amb":34.4375,"BurnerVal":82,"FanVal":98},"extra":{"setpoint":185.22544126527777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:44.891Z","message":{"ET":168.525,"BT":184,"Amb":34.4375,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":185.63038683194446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:45.896Z","message":{"ET":168.95,"BT":184.225,"Amb":34.5625,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":186.0972219875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:46.889Z","message":{"ET":169.375,"BT":184.725,"Amb":34.5625,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":186.5315495986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:47.964Z","message":{"ET":169.65,"BT":185.35,"Amb":34.5625,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":186.9579359986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:48.838Z","message":{"ET":169.95,"BT":186,"Amb":34.5,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":187.4164862652778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:49.892Z","message":{"ET":170.325,"BT":186.35,"Amb":34.6875,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":187.78812683194442,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:50.921Z","message":{"ET":170.8,"BT":187.225,"Amb":34.5,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":188.23287820000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:51.910Z","message":{"ET":171.15,"BT":187.6,"Amb":34.4375,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":188.6636904875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:52.834Z","message":{"ET":171.55,"BT":187.975,"Amb":34.5625,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":189.07498399444444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:53.905Z","message":{"ET":172.05,"BT":188.4,"Amb":34.5,"BurnerVal":83,"FanVal":98},"extra":{"setpoint":189.45679106111112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:54.892Z","message":{"ET":172.425,"BT":188.85,"Amb":34.5,"BurnerVal":84,"FanVal":98},"extra":{"setpoint":189.8955546875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:55.900Z","message":{"ET":172.9,"BT":189.1,"Amb":34.375,"BurnerVal":84,"FanVal":98},"extra":{"setpoint":190.29824976527777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:56.923Z","message":{"ET":173.325,"BT":189.5,"Amb":34.5,"BurnerVal":84,"FanVal":98},"extra":{"setpoint":190.70670557777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:57.848Z","message":{"ET":173.65,"BT":190.225,"Amb":34.375,"BurnerVal":84,"FanVal":98},"extra":{"setpoint":191.1175410611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:58.980Z","message":{"ET":174.025,"BT":190.275,"Amb":34.375,"BurnerVal":84,"FanVal":98},"extra":{"setpoint":191.48688199861112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:23:59.913Z","message":{"ET":174.475,"BT":190.625,"Amb":34.375,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":191.93603624444444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:00.921Z","message":{"ET":174.925,"BT":190.975,"Amb":34.375,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":192.30244293194446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:01.839Z","message":{"ET":175.375,"BT":191.5,"Amb":34.375,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":192.69682880000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:02.919Z","message":{"ET":175.85,"BT":191.95,"Amb":34.3125,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":193.05280183194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:03.903Z","message":{"ET":176.15,"BT":192.9,"Amb":34.3125,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":193.46943875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:04.914Z","message":{"ET":176.65,"BT":193.625,"Amb":34.375,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":193.84624913194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:05.940Z","message":{"ET":177.075,"BT":194.15,"Amb":34.25,"BurnerVal":84,"FanVal":98},"extra":{"setpoint":194.2294463111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:06.866Z","message":{"ET":177.275,"BT":194.25,"Amb":34.3125,"BurnerVal":84,"FanVal":98},"extra":{"setpoint":194.6169509111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:07.913Z","message":{"ET":177.675,"BT":194.675,"Amb":34.3125,"BurnerVal":84,"FanVal":98},"extra":{"setpoint":194.96349355,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:08.924Z","message":{"ET":178.175,"BT":195.025,"Amb":34.25,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":195.35244968749998,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:09.939Z","message":{"ET":178.575,"BT":195.2,"Amb":34.25,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":195.72550943194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:10.848Z","message":{"ET":178.8,"BT":195.5,"Amb":34.3125,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":196.09608875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:11.912Z","message":{"ET":179.125,"BT":195.95,"Amb":34.1875,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":196.4261958875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:12.914Z","message":{"ET":179.275,"BT":196.575,"Amb":34.25,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":196.81039413194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:13.922Z","message":{"ET":179.6,"BT":197,"Amb":34.25,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":197.16864809861113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:14.881Z","message":{"ET":179.9,"BT":197.45,"Amb":34.25,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":197.5262332986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:15.884Z","message":{"ET":180.3,"BT":197.775,"Amb":34.375,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":197.86241319444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:16.926Z","message":{"ET":180.65,"BT":197.8,"Amb":34.375,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":198.2138062,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:17.982Z","message":{"ET":180.775,"BT":197.875,"Amb":34.375,"BurnerVal":85,"FanVal":98},"extra":{"setpoint":198.5744649875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:18.945Z","message":{"ET":181.075,"BT":197.675,"Amb":34.375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":198.9369029111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:19.868Z","message":{"ET":181.325,"BT":198.575,"Amb":34.3125,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":199.2657145986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:20.942Z","message":{"ET":181.9,"BT":199.125,"Amb":34.4375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":199.57745816527776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:21.929Z","message":{"ET":182.3,"BT":199.45,"Amb":34.375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":199.93761809861113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:22.933Z","message":{"ET":182.7,"BT":200.05,"Amb":34.3125,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":200.26577777777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:23.874Z","message":{"ET":182.875,"BT":200.225,"Amb":34.3125,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":200.5964849875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:24.888Z","message":{"ET":183.025,"BT":200.375,"Amb":34.3125,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":200.90486039444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:25.937Z","message":{"ET":183.35,"BT":200.4,"Amb":34.25,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":201.23369777777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:26.962Z","message":{"ET":183.575,"BT":200.925,"Amb":34.25,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":201.57023993194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:27.950Z","message":{"ET":183.8,"BT":200.875,"Amb":34.1875,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":201.89707793194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:28.872Z","message":{"ET":184.075,"BT":200.875,"Amb":34.125,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":202.2090471652778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:29.947Z","message":{"ET":184.35,"BT":201.425,"Amb":34.125,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":202.49804231111113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:30.940Z","message":{"ET":184.725,"BT":201.3,"Amb":34.1875,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":202.8313373277778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:31.952Z","message":{"ET":185.275,"BT":201.95,"Amb":34,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":203.13633875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:32.917Z","message":{"ET":185.55,"BT":201.95,"Amb":34,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":203.44497593194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:33.893Z","message":{"ET":185.925,"BT":202.875,"Amb":34.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":203.73663816527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:34.917Z","message":{"ET":186.275,"BT":203.15,"Amb":34,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":204.0283893111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:36.005Z","message":{"ET":186.575,"BT":203.625,"Amb":34,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":204.3319598,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:36.859Z","message":{"ET":186.875,"BT":204.275,"Amb":34.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":204.65131197777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:37.883Z","message":{"ET":187.2,"BT":204.75,"Amb":33.9375,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":204.89909724444445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:38.951Z","message":{"ET":187.55,"BT":204.875,"Amb":34,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":205.1945235986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:39.951Z","message":{"ET":187.775,"BT":204.8,"Amb":34.0625,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":205.49952266111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:40.955Z","message":{"ET":187.925,"BT":205.05,"Amb":33.9375,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":205.7816804986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:41.897Z","message":{"ET":188.225,"BT":205.3,"Amb":34.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":206.06273572777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:42.902Z","message":{"ET":188.525,"BT":205.475,"Amb":34,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":206.32362524444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:43.926Z","message":{"ET":188.8,"BT":205.525,"Amb":34,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":206.59924509861114,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:44.958Z","message":{"ET":189.025,"BT":205.575,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":206.87637995,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:45.885Z","message":{"ET":189.25,"BT":205.8,"Amb":33.9375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":207.1551608,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:46.900Z","message":{"ET":189.775,"BT":206.9,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":207.40054163194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:47.929Z","message":{"ET":190,"BT":207.525,"Amb":34.1875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":207.66817224444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:48.964Z","message":{"ET":190.325,"BT":207.7,"Amb":34.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":207.9355188875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:49.966Z","message":{"ET":190.625,"BT":208.15,"Amb":34.125,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":208.20198395,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:50.906Z","message":{"ET":190.85,"BT":208.425,"Amb":34.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":208.45737143194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:51.919Z","message":{"ET":191.1,"BT":208.075,"Amb":34,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":208.69418093194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:52.937Z","message":{"ET":191.425,"BT":208.075,"Amb":33.9375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":208.9468809986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:53.969Z","message":{"ET":191.5,"BT":208.55,"Amb":34.125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":209.1979498611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:54.895Z","message":{"ET":191.675,"BT":208.975,"Amb":34.125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":209.44879777777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:55.965Z","message":{"ET":191.85,"BT":209.175,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":209.67204126527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:56.976Z","message":{"ET":192.325,"BT":209.55,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":209.9265182,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:57.985Z","message":{"ET":192.65,"BT":210.075,"Amb":34.125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":210.1642674875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:58.985Z","message":{"ET":192.9,"BT":210.275,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":210.39871564444445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:24:59.952Z","message":{"ET":193.075,"BT":210.4,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":210.6282823111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:00.922Z","message":{"ET":193.4,"BT":210.775,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":210.846955,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:01.988Z","message":{"ET":193.65,"BT":210.85,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":211.06527439444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:02.981Z","message":{"ET":193.925,"BT":211.15,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":211.301195,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:03.898Z","message":{"ET":194.025,"BT":211.4,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":211.51768583194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:04.921Z","message":{"ET":194.275,"BT":211.3,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":211.7160098611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:05.953Z","message":{"ET":194.575,"BT":211.45,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":211.9335948875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:06.999Z","message":{"ET":194.7,"BT":212.125,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":212.1507903111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:07.995Z","message":{"ET":194.6,"BT":212.475,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":212.36749283194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:08.942Z","message":{"ET":194.75,"BT":212.425,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":212.57141395,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:09.939Z","message":{"ET":194.925,"BT":212.775,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":212.76235091111113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:10.998Z","message":{"ET":195.35,"BT":212.7,"Amb":34.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":212.96108875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:11.996Z","message":{"ET":195.575,"BT":213.05,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":213.16914319444444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:12.905Z","message":{"ET":195.775,"BT":212.8,"Amb":33.9375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":213.36179172777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:13.934Z","message":{"ET":196.075,"BT":213.475,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":213.53520746527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:14.959Z","message":{"ET":196.3,"BT":213.65,"Amb":33.9375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":213.7289332986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:16.027Z","message":{"ET":196.65,"BT":213.75,"Amb":34,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":213.91897699861113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:16.908Z","message":{"ET":196.85,"BT":213.975,"Amb":33.9375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":214.11351332777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:17.941Z","message":{"ET":197.125,"BT":213.975,"Amb":33.9375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":214.27193277777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:18.945Z","message":{"ET":197.35,"BT":214.175,"Amb":33.875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":214.4545509111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:20.515Z","message":{"ET":197.5,"BT":214.175,"Amb":33.75,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":214.62920246527779,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:21.014Z","message":{"ET":197.55,"BT":214.5,"Amb":33.875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":214.89747979999999,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:21.921Z","message":{"ET":197.475,"BT":214.7,"Amb":33.9375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":214.98081496527777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:22.939Z","message":{"ET":197.6,"BT":214.9,"Amb":33.9375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":215.13096433194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:23.965Z","message":{"ET":197.95,"BT":215.375,"Amb":33.875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":215.29711652777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:25.024Z","message":{"ET":197.85,"BT":214.925,"Amb":33.8125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":215.4614959777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:25.914Z","message":{"ET":197.9,"BT":215.125,"Amb":33.75,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":215.62793995,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:26.952Z","message":{"ET":198.175,"BT":215.275,"Amb":33.75,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":215.7658530611111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:27.957Z","message":{"ET":198.4,"BT":215.375,"Amb":33.8125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":215.92355697777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:28.981Z","message":{"ET":198.6,"BT":215.85,"Amb":33.8125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":216.0732478,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:30.021Z","message":{"ET":198.875,"BT":216.25,"Amb":33.8125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":216.22318109861112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:30.926Z","message":{"ET":199,"BT":216.2,"Amb":33.625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":216.3721838,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:31.960Z","message":{"ET":199.275,"BT":216.475,"Amb":33.8125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":216.49994444444445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:32.980Z","message":{"ET":199.525,"BT":216.65,"Amb":33.5625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":216.6423719111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:34.033Z","message":{"ET":199.625,"BT":216.875,"Amb":33.8125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":216.78010249861111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:34.925Z","message":{"ET":199.7,"BT":216.875,"Amb":33.5,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":216.91965995,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:35.963Z","message":{"ET":199.85,"BT":216.95,"Amb":33.5625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.03498664444444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:36.968Z","message":{"ET":199.825,"BT":217.075,"Amb":33.5,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.16658626527777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:37.993Z","message":{"ET":199.875,"BT":217.45,"Amb":33.5625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.29164266527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:38.934Z","message":{"ET":200.075,"BT":217.625,"Amb":33.625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.41579413194447,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:39.953Z","message":{"ET":200.275,"BT":217.9,"Amb":33.625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.5271971875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:40.963Z","message":{"ET":200.5,"BT":218.175,"Amb":33.5,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.6453046875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:41.987Z","message":{"ET":200.8,"BT":218.4,"Amb":33.625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.75929506111112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:43.070Z","message":{"ET":201.1,"BT":218.525,"Amb":33.5,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.8723061111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:43.946Z","message":{"ET":201.125,"BT":218.725,"Amb":33.5,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":217.9884232652778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:44.956Z","message":{"ET":201.25,"BT":218.8,"Amb":33.375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.0800661111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:45.981Z","message":{"ET":201.45,"BT":218.8,"Amb":33.5,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.18265843194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:47.791Z","message":{"ET":201.525,"BT":218.825,"Amb":33.5,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.2845823111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:47.968Z","message":{"ET":201.55,"BT":218.8,"Amb":33.25,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.45635799444443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:48.950Z","message":{"ET":201.625,"BT":218.675,"Amb":33.3125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.47261355,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:49.974Z","message":{"ET":201.625,"BT":218.825,"Amb":33.25,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.56191155000002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:51.002Z","message":{"ET":201.625,"BT":218.95,"Amb":33.1875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.65198372777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:52.054Z","message":{"ET":201.7,"BT":218.925,"Amb":33.25,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.73939426527778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:52.948Z","message":{"ET":201.85,"BT":219.15,"Amb":33.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.82597572777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:53.970Z","message":{"ET":202.05,"BT":219.35,"Amb":33,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.8971443875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:54.991Z","message":{"ET":202.15,"BT":219.55,"Amb":33.3125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":218.97553988750002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:56.024Z","message":{"ET":202.2,"BT":219.675,"Amb":33.1875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.0511905986111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:56.976Z","message":{"ET":202.35,"BT":219.475,"Amb":33.3125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.1247072,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:57.962Z","message":{"ET":202.575,"BT":219.225,"Amb":33.3125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.18983457777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:25:59.270Z","message":{"ET":202.525,"BT":219.825,"Amb":33.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.25463395,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:00.011Z","message":{"ET":202.65,"BT":220,"Amb":33.4375,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.3365489777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:00.976Z","message":{"ET":202.725,"BT":220.1,"Amb":33.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.38059732777776,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:01.964Z","message":{"ET":202.7,"BT":219.9,"Amb":33.125,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.43591193194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:02.982Z","message":{"ET":202.7,"BT":219.825,"Amb":33.1875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.4899182,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:04.002Z","message":{"ET":202.9,"BT":220,"Amb":33.125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.54267039444443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:05.026Z","message":{"ET":202.95,"BT":220.4,"Amb":33.125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.59263906111113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:06.070Z","message":{"ET":203,"BT":220.45,"Amb":33,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.63994138750002,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:06.983Z","message":{"ET":203.175,"BT":220.425,"Amb":33.3125,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.68520413194443,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:08.388Z","message":{"ET":203.1,"BT":220.1,"Amb":33.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.72187388749998,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:09.022Z","message":{"ET":203.075,"BT":219.9,"Amb":33.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.7745727777778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:09.975Z","message":{"ET":203.025,"BT":219.925,"Amb":33.125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.79635016527777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:10.973Z","message":{"ET":203.1,"BT":219.625,"Amb":33,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.8272679111111,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:11.997Z","message":{"ET":203.125,"BT":220,"Amb":33.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.85674397777777,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:13.025Z","message":{"ET":203.525,"BT":219.725,"Amb":33.25,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.88415043194445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:14.631Z","message":{"ET":203.8,"BT":219.9,"Amb":33.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.90882999444446,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:14.979Z","message":{"ET":203.9,"BT":220,"Amb":33.1875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.94139164444445,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:15.982Z","message":{"ET":203.9,"BT":220.25,"Amb":33.1875,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":219.94746875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:17.007Z","message":{"ET":203.925,"BT":220.65,"Amb":33,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.96320609861112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:18.035Z","message":{"ET":204.05,"BT":220.9,"Amb":33.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.97641299861112,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:18.954Z","message":{"ET":203.975,"BT":220.975,"Amb":33.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.98673875,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:19.985Z","message":{"ET":203.95,"BT":220.825,"Amb":33,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":219.99345383194444,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:21.006Z","message":{"ET":203.75,"BT":220.15,"Amb":33.1875,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.99818866111113,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:22.029Z","message":{"ET":203.65,"BT":219.6,"Amb":33.1875,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":219.9999793277778,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:22.946Z","message":{"ET":203.875,"BT":219.2,"Amb":33.3125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:24.022Z","message":{"ET":204.1,"BT":219.35,"Amb":33.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:24.994Z","message":{"ET":204.125,"BT":219.8,"Amb":33.125,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:26.023Z","message":{"ET":204.175,"BT":219.725,"Amb":33.0625,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:27.044Z","message":{"ET":204.1,"BT":220.3,"Amb":33.25,"BurnerVal":90,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:27.963Z","message":{"ET":204.2,"BT":220.225,"Amb":33.1875,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:28.999Z","message":{"ET":204.3,"BT":220.65,"Amb":33.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:30.022Z","message":{"ET":204.475,"BT":220.85,"Amb":33.0625,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:31.041Z","message":{"ET":204.525,"BT":221.05,"Amb":33.1875,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:31.962Z","message":{"ET":204.6,"BT":220.85,"Amb":33.25,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:33.013Z","message":{"ET":204.775,"BT":221.075,"Amb":33.125,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:34.106Z","message":{"ET":204.775,"BT":220.9,"Amb":33,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:35.032Z","message":{"ET":204.5,"BT":220.025,"Amb":33,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:36.053Z","message":{"ET":204.75,"BT":220.05,"Amb":33,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:37.026Z","message":{"ET":204.95,"BT":220.225,"Amb":32.9375,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:38.010Z","message":{"ET":204.875,"BT":221,"Amb":33,"BurnerVal":88,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:39.023Z","message":{"ET":204.85,"BT":221.375,"Amb":33.3125,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:40.050Z","message":{"ET":204.8,"BT":221.125,"Amb":32.9375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:40.970Z","message":{"ET":204.675,"BT":221.1,"Amb":32.9375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:42.026Z","message":{"ET":204.675,"BT":220.95,"Amb":32.9375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:43.019Z","message":{"ET":204.7,"BT":220.85,"Amb":32.875,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:44.552Z","message":{"ET":204.65,"BT":221.15,"Amb":33.125,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:44.983Z","message":{"ET":204.625,"BT":220.9,"Amb":32.875,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:45.986Z","message":{"ET":204.525,"BT":220.8,"Amb":32.875,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:47.421Z","message":{"ET":204.525,"BT":220.425,"Amb":32.75,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:48.050Z","message":{"ET":204.325,"BT":220.3,"Amb":32.875,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:49.060Z","message":{"ET":204.35,"BT":220.275,"Amb":32.75,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:49.980Z","message":{"ET":204.45,"BT":220.475,"Amb":32.9375,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:51.045Z","message":{"ET":204.45,"BT":220.625,"Amb":32.9375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:52.032Z","message":{"ET":204.4,"BT":220.475,"Amb":32.875,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:53.263Z","message":{"ET":204.35,"BT":220.25,"Amb":33.125,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:53.975Z","message":{"ET":204.45,"BT":220.125,"Amb":32.9375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:54.997Z","message":{"ET":204.375,"BT":219.95,"Amb":33,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:56.037Z","message":{"ET":204.525,"BT":220.175,"Amb":32.875,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:57.055Z","message":{"ET":204.45,"BT":220.4,"Amb":32.8125,"BurnerVal":87,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:58.073Z","message":{"ET":204.65,"BT":220.575,"Amb":32.9375,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:26:58.993Z","message":{"ET":204.6,"BT":220.875,"Amb":32.875,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":220,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:00.051Z","message":{"ET":204.55,"BT":220.5,"Amb":32.875,"BurnerVal":86,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:01.039Z","message":{"ET":204.1,"BT":219.15,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:02.355Z","message":{"ET":200.7,"BT":211.875,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:02.987Z","message":{"ET":197.65,"BT":204.8,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:04.011Z","message":{"ET":192.975,"BT":194.475,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:05.049Z","message":{"ET":188.925,"BT":184.85,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:06.062Z","message":{"ET":185.4,"BT":176.65,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:06.979Z","message":{"ET":182.125,"BT":169.225,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:08.003Z","message":{"ET":177.8,"BT":162.55,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:09.063Z","message":{"ET":173.95,"BT":157.05,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:10.055Z","message":{"ET":170.025,"BT":149.425,"Amb":32.6875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:11.265Z","message":{"ET":165.65,"BT":143.95,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:11.999Z","message":{"ET":163.35,"BT":139.5,"Amb":32.6875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:13.088Z","message":{"ET":160.025,"BT":134.75,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:14.530Z","message":{"ET":155.6,"BT":128.825,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:15.086Z","message":{"ET":153.7,"BT":126.55,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:15.989Z","message":{"ET":150.25,"BT":122.975,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:17.023Z","message":{"ET":147.3,"BT":118.825,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:18.077Z","message":{"ET":144.325,"BT":115.6,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:19.064Z","message":{"ET":141.575,"BT":112.6,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:20.410Z","message":{"ET":137.7,"BT":110.6,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:21.008Z","message":{"ET":135.675,"BT":111.225,"Amb":32.6875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:22.033Z","message":{"ET":133.3,"BT":110.325,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:23.470Z","message":{"ET":129.4,"BT":105.75,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:24.079Z","message":{"ET":128.05,"BT":104.8,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:25.000Z","message":{"ET":125.725,"BT":102.8,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:26.026Z","message":{"ET":123.575,"BT":99.9,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:27.083Z","message":{"ET":121.15,"BT":96.75,"Amb":32.6875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:28.078Z","message":{"ET":118.6,"BT":94.05,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:28.994Z","message":{"ET":117.2,"BT":91.825,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:30.026Z","message":{"ET":115.125,"BT":89.825,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:31.043Z","message":{"ET":112.975,"BT":87.625,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:32.377Z","message":{"ET":111.025,"BT":85.15,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:33.111Z","message":{"ET":109.75,"BT":83.625,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:34.115Z","message":{"ET":107.875,"BT":82.55,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:35.551Z","message":{"ET":104.925,"BT":82.075,"Amb":32.6875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:36.099Z","message":{"ET":104.075,"BT":81,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:37.109Z","message":{"ET":101.925,"BT":79.1,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:38.006Z","message":{"ET":100.225,"BT":78.15,"Amb":32.75,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:39.033Z","message":{"ET":98.575,"BT":76.75,"Amb":32.6875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:40.061Z","message":{"ET":96.775,"BT":74.85,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:41.196Z","message":{"ET":95.05,"BT":73.175,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:42.102Z","message":{"ET":93.35,"BT":72.275,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:43.023Z","message":{"ET":91.9,"BT":71.125,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:44.053Z","message":{"ET":90.4,"BT":70.175,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:45.106Z","message":{"ET":89.125,"BT":68.8,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:46.102Z","message":{"ET":87.825,"BT":68.025,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:47.016Z","message":{"ET":86.725,"BT":67.175,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:48.042Z","message":{"ET":85.125,"BT":66.4,"Amb":33,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:49.067Z","message":{"ET":83.625,"BT":65.525,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:50.177Z","message":{"ET":82.25,"BT":64.65,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:51.012Z","message":{"ET":81.3,"BT":64,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:52.034Z","message":{"ET":79.75,"BT":63.275,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:53.285Z","message":{"ET":78.05,"BT":62.1,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:54.119Z","message":{"ET":77.275,"BT":61.45,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:55.139Z","message":{"ET":76.35,"BT":60.825,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:56.028Z","message":{"ET":75.325,"BT":60.25,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:57.055Z","message":{"ET":74.3,"BT":59.55,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:58.078Z","message":{"ET":73.25,"BT":58.925,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:27:59.521Z","message":{"ET":71.65,"BT":57.875,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:00.024Z","message":{"ET":71.2,"BT":57.575,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:01.051Z","message":{"ET":70.5,"BT":57.025,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:02.495Z","message":{"ET":69.325,"BT":56.325,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:03.136Z","message":{"ET":68.7,"BT":56.1,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:04.127Z","message":{"ET":67.875,"BT":55.975,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:05.051Z","message":{"ET":67.1,"BT":55.45,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:06.067Z","message":{"ET":66.125,"BT":54.9,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:07.139Z","message":{"ET":65.4,"BT":54.45,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:08.439Z","message":{"ET":64.35,"BT":53.875,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:09.037Z","message":{"ET":63.775,"BT":53.525,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:10.070Z","message":{"ET":62.975,"BT":53.3,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:11.537Z","message":{"ET":61.825,"BT":52.85,"Amb":32.875,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}},{"timestamp":"2025-03-16T14:28:12.105Z","message":{"ET":61.475,"BT":52.625,"Amb":32.9375,"BurnerVal":0,"FanVal":98},"extra":{"setpoint":0,"pidData":{"enabled":true,"kp":1,"ki":0.1,"kd":0.01}}}],"events":[{"label":"charge","measurement":{"message":{"ET":33.075,"BT":30.425,"Amb":34.6875,"BurnerVal":11,"FanVal":95},"timestamp":"2025-03-16T14:20:13.696Z"}},{"label":"dry-end","measurement":{"message":{"ET":177.075,"BT":194.15,"Amb":34.25,"BurnerVal":84,"FanVal":98},"timestamp":"2025-03-16T14:24:05.940Z"}},{"label":"first-crack-start","measurement":{"message":{"ET":203,"BT":220.45,"Amb":33,"BurnerVal":88,"FanVal":98},"timestamp":"2025-03-16T14:26:06.070Z"}},{"label":"drop","measurement":{"message":{"ET":197.65,"BT":204.8,"Amb":32.8125,"BurnerVal":0,"FanVal":98},"timestamp":"2025-03-16T14:27:02.987Z"}}],"commands":[{"type":"heater","value":11,"timestamp":"2025-03-16T14:20:11.757Z"},{"type":"heater","value":12,"timestamp":"2025-03-16T14:20:12.710Z"},{"type":"heater","value":13,"timestamp":"2025-03-16T14:20:13.699Z"},{"type":"heater","value":12,"timestamp":"2025-03-16T14:20:14.724Z"},{"type":"heater","value":12,"timestamp":"2025-03-16T14:20:15.749Z"},{"type":"heater","value":11,"timestamp":"2025-03-16T14:20:16.669Z"},{"type":"heater","value":10,"timestamp":"2025-03-16T14:20:17.714Z"},{"type":"heater","value":10,"timestamp":"2025-03-16T14:20:18.717Z"},{"type":"heater","value":9,"timestamp":"2025-03-16T14:20:19.752Z"},{"type":"heater","value":9,"timestamp":"2025-03-16T14:20:20.665Z"},{"type":"heater","value":10,"timestamp":"2025-03-16T14:20:21.719Z"},{"type":"heater","value":11,"timestamp":"2025-03-16T14:20:22.775Z"},{"type":"heater","value":11,"timestamp":"2025-03-16T14:20:23.792Z"},{"type":"heater","value":13,"timestamp":"2025-03-16T14:20:24.759Z"},{"type":"heater","value":14,"timestamp":"2025-03-16T14:20:25.679Z"},{"type":"heater","value":15,"timestamp":"2025-03-16T14:20:26.742Z"},{"type":"heater","value":15,"timestamp":"2025-03-16T14:20:27.732Z"},{"type":"heater","value":16,"timestamp":"2025-03-16T14:20:28.752Z"},{"type":"heater","value":16,"timestamp":"2025-03-16T14:20:29.780Z"},{"type":"heater","value":17,"timestamp":"2025-03-16T14:20:30.732Z"},{"type":"heater","value":18,"timestamp":"2025-03-16T14:20:31.736Z"},{"type":"heater","value":21,"timestamp":"2025-03-16T14:20:32.759Z"},{"type":"heater","value":20,"timestamp":"2025-03-16T14:20:33.808Z"},{"type":"heater","value":20,"timestamp":"2025-03-16T14:20:34.693Z"},{"type":"heater","value":21,"timestamp":"2025-03-16T14:20:35.746Z"},{"type":"heater","value":21,"timestamp":"2025-03-16T14:20:36.743Z"},{"type":"heater","value":22,"timestamp":"2025-03-16T14:20:37.765Z"},{"type":"heater","value":23,"timestamp":"2025-03-16T14:20:38.685Z"},{"type":"heater","value":23,"timestamp":"2025-03-16T14:20:39.711Z"},{"type":"heater","value":24,"timestamp":"2025-03-16T14:20:40.744Z"},{"type":"fan","value":98,"timestamp":"2025-03-16T14:20:41.224Z"},{"type":"heater","value":24,"timestamp":"2025-03-16T14:20:41.761Z"},{"type":"heater","value":25,"timestamp":"2025-03-16T14:20:42.681Z"},{"type":"heater","value":26,"timestamp":"2025-03-16T14:20:43.708Z"},{"type":"heater","value":27,"timestamp":"2025-03-16T14:20:44.757Z"},{"type":"heater","value":28,"timestamp":"2025-03-16T14:20:45.753Z"},{"type":"heater","value":29,"timestamp":"2025-03-16T14:20:46.775Z"},{"type":"heater","value":30,"timestamp":"2025-03-16T14:20:47.699Z"},{"type":"heater","value":30,"timestamp":"2025-03-16T14:20:48.725Z"},{"type":"heater","value":30,"timestamp":"2025-03-16T14:20:49.858Z"},{"type":"heater","value":30,"timestamp":"2025-03-16T14:20:50.766Z"},{"type":"heater","value":30,"timestamp":"2025-03-16T14:20:51.689Z"},{"type":"heater","value":31,"timestamp":"2025-03-16T14:20:52.716Z"},{"type":"heater","value":31,"timestamp":"2025-03-16T14:20:53.791Z"},{"type":"heater","value":32,"timestamp":"2025-03-16T14:20:54.765Z"},{"type":"heater","value":33,"timestamp":"2025-03-16T14:20:55.784Z"},{"type":"heater","value":34,"timestamp":"2025-03-16T14:20:56.709Z"},{"type":"heater","value":35,"timestamp":"2025-03-16T14:20:57.763Z"},{"type":"heater","value":35,"timestamp":"2025-03-16T14:20:58.768Z"},{"type":"heater","value":35,"timestamp":"2025-03-16T14:20:59.792Z"},{"type":"heater","value":36,"timestamp":"2025-03-16T14:21:00.704Z"},{"type":"heater","value":36,"timestamp":"2025-03-16T14:21:01.734Z"},{"type":"heater","value":36,"timestamp":"2025-03-16T14:21:02.781Z"},{"type":"heater","value":36,"timestamp":"2025-03-16T14:21:03.791Z"},{"type":"heater","value":36,"timestamp":"2025-03-16T14:21:04.798Z"},{"type":"heater","value":37,"timestamp":"2025-03-16T14:21:05.757Z"},{"type":"heater","value":38,"timestamp":"2025-03-16T14:21:06.748Z"},{"type":"heater","value":38,"timestamp":"2025-03-16T14:21:07.784Z"},{"type":"heater","value":39,"timestamp":"2025-03-16T14:21:08.818Z"},{"type":"heater","value":39,"timestamp":"2025-03-16T14:21:09.714Z"},{"type":"heater","value":40,"timestamp":"2025-03-16T14:21:10.736Z"},{"type":"heater","value":41,"timestamp":"2025-03-16T14:21:11.797Z"},{"type":"heater","value":42,"timestamp":"2025-03-16T14:21:12.787Z"},{"type":"heater","value":42,"timestamp":"2025-03-16T14:21:13.861Z"},{"type":"heater","value":42,"timestamp":"2025-03-16T14:21:14.727Z"},{"type":"heater","value":42,"timestamp":"2025-03-16T14:21:15.755Z"},{"type":"heater","value":43,"timestamp":"2025-03-16T14:21:16.792Z"},{"type":"heater","value":43,"timestamp":"2025-03-16T14:21:17.840Z"},{"type":"heater","value":44,"timestamp":"2025-03-16T14:21:18.724Z"},{"type":"heater","value":45,"timestamp":"2025-03-16T14:21:19.760Z"},{"type":"heater","value":46,"timestamp":"2025-03-16T14:21:20.907Z"},{"type":"heater","value":46,"timestamp":"2025-03-16T14:21:21.798Z"},{"type":"heater","value":46,"timestamp":"2025-03-16T14:21:22.718Z"},{"type":"heater","value":46,"timestamp":"2025-03-16T14:21:23.883Z"},{"type":"heater","value":47,"timestamp":"2025-03-16T14:21:24.763Z"},{"type":"heater","value":48,"timestamp":"2025-03-16T14:21:25.806Z"},{"type":"heater","value":48,"timestamp":"2025-03-16T14:21:26.853Z"},{"type":"heater","value":48,"timestamp":"2025-03-16T14:21:27.737Z"},{"type":"heater","value":49,"timestamp":"2025-03-16T14:21:28.768Z"},{"type":"heater","value":49,"timestamp":"2025-03-16T14:21:29.829Z"},{"type":"heater","value":48,"timestamp":"2025-03-16T14:21:30.811Z"},{"type":"heater","value":49,"timestamp":"2025-03-16T14:21:31.732Z"},{"type":"heater","value":49,"timestamp":"2025-03-16T14:21:32.751Z"},{"type":"heater","value":49,"timestamp":"2025-03-16T14:21:33.822Z"},{"type":"heater","value":50,"timestamp":"2025-03-16T14:21:34.815Z"},{"type":"heater","value":51,"timestamp":"2025-03-16T14:21:35.879Z"},{"type":"heater","value":52,"timestamp":"2025-03-16T14:21:36.749Z"},{"type":"heater","value":52,"timestamp":"2025-03-16T14:21:37.769Z"},{"type":"heater","value":52,"timestamp":"2025-03-16T14:21:38.833Z"},{"type":"heater","value":52,"timestamp":"2025-03-16T14:21:39.819Z"},{"type":"heater","value":53,"timestamp":"2025-03-16T14:21:40.745Z"},{"type":"heater","value":53,"timestamp":"2025-03-16T14:21:41.766Z"},{"type":"heater","value":53,"timestamp":"2025-03-16T14:21:42.795Z"},{"type":"heater","value":53,"timestamp":"2025-03-16T14:21:43.826Z"},{"type":"heater","value":54,"timestamp":"2025-03-16T14:21:44.734Z"},{"type":"heater","value":55,"timestamp":"2025-03-16T14:21:45.774Z"},{"type":"heater","value":55,"timestamp":"2025-03-16T14:21:46.781Z"},{"type":"heater","value":55,"timestamp":"2025-03-16T14:21:47.853Z"},{"type":"heater","value":55,"timestamp":"2025-03-16T14:21:48.846Z"},{"type":"heater","value":55,"timestamp":"2025-03-16T14:21:49.811Z"},{"type":"heater","value":56,"timestamp":"2025-03-16T14:21:50.783Z"},{"type":"heater","value":56,"timestamp":"2025-03-16T14:21:51.797Z"},{"type":"heater","value":57,"timestamp":"2025-03-16T14:21:52.852Z"},{"type":"heater","value":57,"timestamp":"2025-03-16T14:21:53.760Z"},{"type":"heater","value":57,"timestamp":"2025-03-16T14:21:54.852Z"},{"type":"heater","value":58,"timestamp":"2025-03-16T14:21:55.801Z"},{"type":"heater","value":58,"timestamp":"2025-03-16T14:21:56.854Z"},{"type":"heater","value":58,"timestamp":"2025-03-16T14:21:57.849Z"},{"type":"heater","value":58,"timestamp":"2025-03-16T14:21:58.763Z"},{"type":"heater","value":58,"timestamp":"2025-03-16T14:21:59.850Z"},{"type":"heater","value":58,"timestamp":"2025-03-16T14:22:00.818Z"},{"type":"heater","value":59,"timestamp":"2025-03-16T14:22:01.867Z"},{"type":"heater","value":59,"timestamp":"2025-03-16T14:22:02.754Z"},{"type":"heater","value":59,"timestamp":"2025-03-16T14:22:03.800Z"},{"type":"heater","value":60,"timestamp":"2025-03-16T14:22:04.803Z"},{"type":"heater","value":59,"timestamp":"2025-03-16T14:22:05.887Z"},{"type":"heater","value":60,"timestamp":"2025-03-16T14:22:06.760Z"},{"type":"heater","value":60,"timestamp":"2025-03-16T14:22:07.773Z"},{"type":"heater","value":61,"timestamp":"2025-03-16T14:22:08.808Z"},{"type":"heater","value":61,"timestamp":"2025-03-16T14:22:09.830Z"},{"type":"heater","value":62,"timestamp":"2025-03-16T14:22:10.865Z"},{"type":"heater","value":63,"timestamp":"2025-03-16T14:22:11.767Z"},{"type":"heater","value":63,"timestamp":"2025-03-16T14:22:12.798Z"},{"type":"heater","value":63,"timestamp":"2025-03-16T14:22:13.815Z"},{"type":"heater","value":64,"timestamp":"2025-03-16T14:22:14.886Z"},{"type":"heater","value":64,"timestamp":"2025-03-16T14:22:15.814Z"},{"type":"heater","value":64,"timestamp":"2025-03-16T14:22:16.799Z"},{"type":"heater","value":64,"timestamp":"2025-03-16T14:22:17.826Z"},{"type":"heater","value":65,"timestamp":"2025-03-16T14:22:18.835Z"},{"type":"heater","value":66,"timestamp":"2025-03-16T14:22:19.977Z"},{"type":"heater","value":66,"timestamp":"2025-03-16T14:22:20.782Z"},{"type":"heater","value":66,"timestamp":"2025-03-16T14:22:21.805Z"},{"type":"heater","value":67,"timestamp":"2025-03-16T14:22:22.827Z"},{"type":"heater","value":66,"timestamp":"2025-03-16T14:22:23.913Z"},{"type":"heater","value":66,"timestamp":"2025-03-16T14:22:24.891Z"},{"type":"heater","value":66,"timestamp":"2025-03-16T14:22:25.798Z"},{"type":"heater","value":67,"timestamp":"2025-03-16T14:22:26.879Z"},{"type":"heater","value":67,"timestamp":"2025-03-16T14:22:27.846Z"},{"type":"heater","value":68,"timestamp":"2025-03-16T14:22:28.899Z"},{"type":"heater","value":67,"timestamp":"2025-03-16T14:22:29.792Z"},{"type":"heater","value":68,"timestamp":"2025-03-16T14:22:30.813Z"},{"type":"heater","value":68,"timestamp":"2025-03-16T14:22:31.950Z"},{"type":"heater","value":68,"timestamp":"2025-03-16T14:22:32.908Z"},{"type":"heater","value":68,"timestamp":"2025-03-16T14:22:33.800Z"},{"type":"heater","value":69,"timestamp":"2025-03-16T14:22:34.812Z"},{"type":"heater","value":69,"timestamp":"2025-03-16T14:22:35.886Z"},{"type":"heater","value":69,"timestamp":"2025-03-16T14:22:36.852Z"},{"type":"heater","value":69,"timestamp":"2025-03-16T14:22:37.908Z"},{"type":"heater","value":69,"timestamp":"2025-03-16T14:22:38.807Z"},{"type":"heater","value":70,"timestamp":"2025-03-16T14:22:40.045Z"},{"type":"heater","value":70,"timestamp":"2025-03-16T14:22:40.861Z"},{"type":"heater","value":70,"timestamp":"2025-03-16T14:22:41.933Z"},{"type":"heater","value":70,"timestamp":"2025-03-16T14:22:42.812Z"},{"type":"heater","value":71,"timestamp":"2025-03-16T14:22:43.817Z"},{"type":"heater","value":71,"timestamp":"2025-03-16T14:22:44.861Z"},{"type":"heater","value":71,"timestamp":"2025-03-16T14:22:45.867Z"},{"type":"heater","value":71,"timestamp":"2025-03-16T14:22:46.819Z"},{"type":"heater","value":72,"timestamp":"2025-03-16T14:22:47.813Z"},{"type":"heater","value":72,"timestamp":"2025-03-16T14:22:48.836Z"},{"type":"heater","value":72,"timestamp":"2025-03-16T14:22:49.861Z"},{"type":"heater","value":73,"timestamp":"2025-03-16T14:22:50.936Z"},{"type":"heater","value":73,"timestamp":"2025-03-16T14:22:51.817Z"},{"type":"heater","value":73,"timestamp":"2025-03-16T14:22:52.831Z"},{"type":"heater","value":74,"timestamp":"2025-03-16T14:22:53.905Z"},{"type":"heater","value":74,"timestamp":"2025-03-16T14:22:54.878Z"},{"type":"heater","value":74,"timestamp":"2025-03-16T14:22:55.833Z"},{"type":"heater","value":74,"timestamp":"2025-03-16T14:22:56.863Z"},{"type":"heater","value":74,"timestamp":"2025-03-16T14:22:57.861Z"},{"type":"heater","value":74,"timestamp":"2025-03-16T14:22:58.875Z"},{"type":"heater","value":75,"timestamp":"2025-03-16T14:22:59.794Z"},{"type":"heater","value":75,"timestamp":"2025-03-16T14:23:00.831Z"},{"type":"heater","value":75,"timestamp":"2025-03-16T14:23:01.844Z"},{"type":"heater","value":75,"timestamp":"2025-03-16T14:23:02.884Z"},{"type":"heater","value":75,"timestamp":"2025-03-16T14:23:03.892Z"},{"type":"heater","value":76,"timestamp":"2025-03-16T14:23:04.844Z"},{"type":"heater","value":76,"timestamp":"2025-03-16T14:23:05.880Z"},{"type":"heater","value":76,"timestamp":"2025-03-16T14:23:06.862Z"},{"type":"heater","value":76,"timestamp":"2025-03-16T14:23:07.887Z"},{"type":"heater","value":76,"timestamp":"2025-03-16T14:23:08.806Z"},{"type":"heater","value":77,"timestamp":"2025-03-16T14:23:09.842Z"},{"type":"heater","value":77,"timestamp":"2025-03-16T14:23:10.853Z"},{"type":"heater","value":77,"timestamp":"2025-03-16T14:23:11.983Z"},{"type":"heater","value":77,"timestamp":"2025-03-16T14:23:12.902Z"},{"type":"heater","value":78,"timestamp":"2025-03-16T14:23:13.854Z"},{"type":"heater","value":78,"timestamp":"2025-03-16T14:23:14.865Z"},{"type":"heater","value":78,"timestamp":"2025-03-16T14:23:15.873Z"},{"type":"heater","value":78,"timestamp":"2025-03-16T14:23:16.895Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:17.816Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:18.856Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:19.869Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:20.901Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:21.810Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:22.967Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:23.893Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:24.887Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:25.925Z"},{"type":"heater","value":79,"timestamp":"2025-03-16T14:23:26.965Z"},{"type":"heater","value":80,"timestamp":"2025-03-16T14:23:27.863Z"},{"type":"heater","value":80,"timestamp":"2025-03-16T14:23:28.877Z"},{"type":"heater","value":80,"timestamp":"2025-03-16T14:23:29.909Z"},{"type":"heater","value":80,"timestamp":"2025-03-16T14:23:30.820Z"},{"type":"heater","value":80,"timestamp":"2025-03-16T14:23:31.876Z"},{"type":"heater","value":80,"timestamp":"2025-03-16T14:23:32.971Z"},{"type":"heater","value":81,"timestamp":"2025-03-16T14:23:33.997Z"},{"type":"heater","value":81,"timestamp":"2025-03-16T14:23:34.918Z"},{"type":"heater","value":82,"timestamp":"2025-03-16T14:23:35.887Z"},{"type":"heater","value":82,"timestamp":"2025-03-16T14:23:36.885Z"},{"type":"heater","value":82,"timestamp":"2025-03-16T14:23:37.887Z"},{"type":"heater","value":83,"timestamp":"2025-03-16T14:23:38.913Z"},{"type":"heater","value":83,"timestamp":"2025-03-16T14:23:39.830Z"},{"type":"heater","value":83,"timestamp":"2025-03-16T14:23:40.889Z"},{"type":"heater","value":83,"timestamp":"2025-03-16T14:23:41.920Z"},{"type":"heater","value":83,"timestamp":"2025-03-16T14:23:42.905Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:43.829Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:44.901Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:45.905Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:46.897Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:47.971Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:48.847Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:49.902Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:50.931Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:51.920Z"},{"type":"heater","value":84,"timestamp":"2025-03-16T14:23:52.844Z"},{"type":"heater","value":85,"timestamp":"2025-03-16T14:23:53.913Z"},{"type":"heater","value":85,"timestamp":"2025-03-16T14:23:54.901Z"},{"type":"heater","value":85,"timestamp":"2025-03-16T14:23:55.910Z"},{"type":"heater","value":85,"timestamp":"2025-03-16T14:23:56.932Z"},{"type":"heater","value":85,"timestamp":"2025-03-16T14:23:57.857Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:23:58.990Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:23:59.921Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:00.930Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:01.847Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:02.928Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:03.913Z"},{"type":"heater","value":85,"timestamp":"2025-03-16T14:24:04.922Z"},{"type":"heater","value":85,"timestamp":"2025-03-16T14:24:05.950Z"},{"type":"heater","value":85,"timestamp":"2025-03-16T14:24:06.876Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:07.923Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:08.935Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:09.948Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:10.857Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:11.923Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:12.925Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:13.933Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:14.888Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:15.894Z"},{"type":"heater","value":86,"timestamp":"2025-03-16T14:24:16.935Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:17.990Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:18.955Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:19.877Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:20.951Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:21.938Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:22.942Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:23.884Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:24.898Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:25.945Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:24:26.971Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:24:27.959Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:24:28.883Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:24:29.956Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:30.948Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:31.961Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:32.927Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:33.902Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:34.926Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:36.014Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:24:36.866Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:24:37.891Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:24:38.960Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:39.960Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:40.964Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:41.906Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:42.911Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:43.932Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:44.970Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:45.893Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:46.910Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:47.937Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:48.972Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:49.976Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:24:50.915Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:51.929Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:52.948Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:53.978Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:54.905Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:55.974Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:56.985Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:57.994Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:58.994Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:24:59.958Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:00.932Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:01.998Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:02.989Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:03.908Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:04.929Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:05.962Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:07.007Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:08.004Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:08.951Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:09.948Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:11.008Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:12.004Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:12.913Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:13.943Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:14.969Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:16.036Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:16.918Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:17.950Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:18.953Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:20.526Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:21.023Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:21.929Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:22.948Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:23.974Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:25.032Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:25.924Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:26.962Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:27.966Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:28.991Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:30.030Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:30.938Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:31.970Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:32.990Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:34.044Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:34.934Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:35.971Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:36.979Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:38.003Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:38.943Z"},{"type":"heater","value":91,"timestamp":"2025-03-16T14:25:39.963Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:40.972Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:41.998Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:43.081Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:43.958Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:44.965Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:45.994Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:47.800Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:47.976Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:48.960Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:49.984Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:51.011Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:52.065Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:52.959Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:53.979Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:55.001Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:56.034Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:56.987Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:57.972Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:25:59.282Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:00.020Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:00.985Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:01.974Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:02.992Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:04.012Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:05.037Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:06.083Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:06.987Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:08.398Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:09.029Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:09.986Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:10.982Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:12.005Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:13.036Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:14.642Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:14.988Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:15.992Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:17.017Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:18.048Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:18.967Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:19.996Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:21.016Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:22.041Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:22.958Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:24.031Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:25.006Z"},{"type":"heater","value":90,"timestamp":"2025-03-16T14:26:26.032Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:27.054Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:27.975Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:29.009Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:30.033Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:31.052Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:31.973Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:33.023Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:34.116Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:35.043Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:36.062Z"},{"type":"heater","value":89,"timestamp":"2025-03-16T14:26:37.036Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:38.021Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:39.033Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:40.062Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:40.981Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:42.035Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:43.031Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:44.563Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:44.993Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:45.997Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:47.431Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:48.060Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:49.070Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:49.988Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:51.055Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:52.041Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:53.272Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:53.983Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:55.007Z"},{"type":"heater","value":88,"timestamp":"2025-03-16T14:26:56.048Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:57.062Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:58.082Z"},{"type":"heater","value":87,"timestamp":"2025-03-16T14:26:59.001Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:00.060Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:01.049Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:02.364Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:02.996Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:04.021Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:05.060Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:06.070Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:06.990Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:08.016Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:09.074Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:10.066Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:11.274Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:12.009Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:13.100Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:14.539Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:15.097Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:16.001Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:17.034Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:18.088Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:19.077Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:20.420Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:21.017Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:22.045Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:23.482Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:24.090Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:25.011Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:26.035Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:27.092Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:28.088Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:29.004Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:30.035Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:31.055Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:32.386Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:33.120Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:34.125Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:35.562Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:36.109Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:37.118Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:38.016Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:39.044Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:40.074Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:41.208Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:42.115Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:43.035Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:44.063Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:45.116Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:46.115Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:47.026Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:48.053Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:49.078Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:50.187Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:51.023Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:52.041Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:53.295Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:54.129Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:55.148Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:56.038Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:57.064Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:58.087Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:27:59.536Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:00.037Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:01.062Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:02.505Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:03.145Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:04.137Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:05.060Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:06.077Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:07.149Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:08.450Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:09.048Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:10.078Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:11.553Z"},{"type":"heater","value":0,"timestamp":"2025-03-16T14:28:12.114Z"}],"profile":{"steps":[{"duration":10,"setpoint":40,"interpolation":"linear"},{"duration":360,"setpoint":220,"interpolation":"ease-out"}]}} \ No newline at end of file diff --git a/python fig gen/fig-gen.py b/python fig gen/fig-gen.py new file mode 100644 index 0000000..ef8b82d --- /dev/null +++ b/python fig gen/fig-gen.py @@ -0,0 +1,123 @@ +import sys +import json +import pandas as pd +import numpy as np +from scipy.signal import savgol_filter +import plotly.graph_objs as go +from plotly.subplots import make_subplots + +#call with "python3 fig-gen.py roast.json", python3 being which command your system uses. +#In my case "pdm run python3 fig-gen.py ex_roast.json" as i'm using a .venv through PDM + +# Ensure the correct number of arguments +if len(sys.argv) != 2: + print("Usage: python fig-gen.py ") + sys.exit(1) + +# Get file name from arguments +file_path = sys.argv[1] + +# Check if the file is a JSON file +if not file_path.lower().endswith('.json'): + print("Error: Input file must be a JSON file.") + sys.exit(1) + +# Load the JSON data +with open(file_path, 'r') as file: + data = json.load(file) + +# Convert the measurements to a Pandas DataFrame +measurements = pd.json_normalize(data['measurements']) +measurements['timestamp'] = pd.to_datetime(measurements['timestamp']) +measurements['elapsed_time'] = (measurements['timestamp'] - measurements['timestamp'].min()).dt.total_seconds() + +# Set a threshold for detecting when the value is stationary for too long (e.g., 1 ms) +pause_threshold = 1e-3 # For example, 1 ms of no change + +# Calculate the difference between consecutive measurements +measurements['delta_BT'] = measurements['message.BT'].diff().abs() +measurements['delta_ET'] = measurements['message.ET'].diff().abs() + +# Identify pauses in the data (i.e., no change in values) +measurements['pause_BT'] = measurements['delta_BT'] <= pause_threshold +measurements['pause_ET'] = measurements['delta_ET'] <= pause_threshold + +# Interpolate during pauses (optional) +measurements['interpolated_BT'] = measurements['message.BT'].copy() +measurements['interpolated_ET'] = measurements['message.ET'].copy() + +# Use linear interpolation during pauses +measurements['interpolated_BT'] = measurements['interpolated_BT'].interpolate(method='linear') +measurements['interpolated_ET'] = measurements['interpolated_ET'].interpolate(method='linear') + +# Smooth BT and ET values using Savitzky-Golay filter on the interpolated data +window_length = 21 # Larger window for better smoothing (odd number) +polyorder = 2 # Polynomial order for smoothing +measurements['smoothed_BT'] = savgol_filter(measurements['interpolated_BT'], window_length, polyorder) +measurements['smoothed_ET'] = savgol_filter(measurements['interpolated_ET'], window_length, polyorder) + +# Add an offset to the temperature values if needed (e.g., 5°C) +BT_temperature_offset = 0 +ET_temperature_offset = 0 +measurements['smoothed_BT'] += BT_temperature_offset +measurements['smoothed_ET'] += ET_temperature_offset + +# Calculate rate of rise for ET and BT using smoothed values +measurements['rate_of_rise_BT'] = measurements['smoothed_BT'].diff() / measurements['elapsed_time'].diff() +measurements['rate_of_rise_ET'] = measurements['smoothed_ET'].diff() / measurements['elapsed_time'].diff() + +# Apply a threshold to limit ROR spikes +ror_threshold = 10 +measurements['capped_rate_of_rise_BT'] = np.clip(measurements['rate_of_rise_BT'], -ror_threshold, ror_threshold) +measurements['capped_rate_of_rise_ET'] = np.clip(measurements['rate_of_rise_ET'], -ror_threshold, ror_threshold) + +# Create a Plotly figure +fig = make_subplots(specs=[[{"secondary_y": True}]]) + +# Add traces for smoothed measurements +fig.add_trace(go.Scatter(x=measurements['elapsed_time'], y=measurements['smoothed_ET'], mode='lines', name='ET', line=dict(color='blue')), secondary_y=False) +fig.add_trace(go.Scatter(x=measurements['elapsed_time'], y=measurements['smoothed_BT'], mode='lines', name='BT', line=dict(color='orange')), secondary_y=False) +fig.add_trace(go.Scatter(x=measurements['elapsed_time'], y=measurements['message.Amb'], mode='lines', name='Amb', line=dict(color='green')), secondary_y=False) +fig.add_trace(go.Scatter(x=measurements['elapsed_time'], y=measurements['message.BurnerVal'], mode='lines', name='BurnerVal', line=dict(color='red')), secondary_y=False) +fig.add_trace(go.Scatter(x=measurements['elapsed_time'], y=measurements['message.FanVal'], mode='lines', name='FanVal', line=dict(color='purple')), secondary_y=False) + +# Add vertical lines for events +events = pd.json_normalize(data['events'], sep='_') +events['timestamp'] = pd.to_datetime(events['measurement_timestamp']) +events['elapsed_time'] = (events['timestamp'] - measurements['timestamp'].min()).dt.total_seconds() +for _, event in events.iterrows(): + fig.add_shape( + type="line", + x0=event['elapsed_time'], x1=event['elapsed_time'], + y0=0, y1=1, + xref="x", yref="paper", + line=dict(color="red", width=2, dash="dash") + ) + fig.add_annotation( + x=event['elapsed_time'], y=1.05, + text=event['label'], + showarrow=False, + xref="x", yref="paper", + textangle=-90, + font=dict(color="red") + ) + +# Add traces for rate of rise +fig.add_trace(go.Scatter(x=measurements['elapsed_time'], y=measurements['capped_rate_of_rise_ET'], mode='lines', name='ROR ET', line=dict(color='cyan', dash='dash')), secondary_y=True) +fig.add_trace(go.Scatter(x=measurements['elapsed_time'], y=measurements['capped_rate_of_rise_BT'], mode='lines', name='ROR BT', line=dict(color='olive', dash='dash')), secondary_y=True) + +# Update layout +fig.update_layout( + title='Measurements Over Time', + xaxis_title='Elapsed Time (seconds)', + yaxis_title='Measurement Values', + yaxis2_title='Rate of Rise (Scaled)', + legend=dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right", x=1), + height=1200 +) + +# Save the figure as an HTML file +fig.write_html("temperature_plot.html") + +# Show the plot +fig.show() diff --git a/python fig gen/guide.md b/python fig gen/guide.md new file mode 100644 index 0000000..f6d4d29 --- /dev/null +++ b/python fig gen/guide.md @@ -0,0 +1,33 @@ +# A guide how to for the gen + +## Prerequisites + +Have PMD installed + +## How to + +In the same dir as the .py, .toml and .lock + +```bash +pdm install +``` + +You now have the choice to either active the .venv + +### Activate venv + +```bash +pdm venv activate +``` + +Then + +```bash +python3 fig-gen.py ex_roast.json +``` + +### Directly through PDM + +```bash +pdm run python3 fig-gen.py ex_roast.json +``` diff --git a/python fig gen/pdm.lock b/python fig gen/pdm.lock new file mode 100644 index 0000000..4b98830 --- /dev/null +++ b/python fig gen/pdm.lock @@ -0,0 +1,1880 @@ +# This file is @generated by PDM. +# It is not intended for manual editing. + +[metadata] +groups = ["default"] +strategy = ["inherit_metadata"] +lock_version = "4.5.0" +content_hash = "sha256:253214273a0a7e90e2ffd495a6dc6cf49fe4f7700e7967e15138242005dfc43f" + +[[metadata.targets]] +requires_python = ">=3.13" + +[[package]] +name = "anyio" +version = "4.8.0" +requires_python = ">=3.9" +summary = "High level compatibility layer for multiple asynchronous event loop implementations" +groups = ["default"] +dependencies = [ + "exceptiongroup>=1.0.2; python_version < \"3.11\"", + "idna>=2.8", + "sniffio>=1.1", + "typing-extensions>=4.5; python_version < \"3.13\"", +] +files = [ + {file = "anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a"}, + {file = "anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a"}, +] + +[[package]] +name = "appnope" +version = "0.1.4" +requires_python = ">=3.6" +summary = "Disable App Nap on macOS >= 10.9" +groups = ["default"] +marker = "platform_system == \"Darwin\"" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +requires_python = ">=3.7" +summary = "Argon2 for Python" +groups = ["default"] +dependencies = [ + "argon2-cffi-bindings", + "typing-extensions; python_version < \"3.8\"", +] +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +requires_python = ">=3.6" +summary = "Low-level CFFI bindings for Argon2" +groups = ["default"] +dependencies = [ + "cffi>=1.0.1", +] +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, +] + +[[package]] +name = "arrow" +version = "1.3.0" +requires_python = ">=3.8" +summary = "Better dates & times for Python" +groups = ["default"] +dependencies = [ + "python-dateutil>=2.7.0", + "types-python-dateutil>=2.8.10", +] +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +requires_python = ">=3.8" +summary = "Annotate AST trees with source code positions" +groups = ["default"] +files = [ + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, +] + +[[package]] +name = "async-lru" +version = "2.0.4" +requires_python = ">=3.8" +summary = "Simple LRU cache for asyncio" +groups = ["default"] +dependencies = [ + "typing-extensions>=4.0.0; python_version < \"3.11\"", +] +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[[package]] +name = "attrs" +version = "25.1.0" +requires_python = ">=3.8" +summary = "Classes Without Boilerplate" +groups = ["default"] +files = [ + {file = "attrs-25.1.0-py3-none-any.whl", hash = "sha256:c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a"}, + {file = "attrs-25.1.0.tar.gz", hash = "sha256:1c97078a80c814273a76b2a298a932eb681c87415c11dee0a6921de7f1b02c3e"}, +] + +[[package]] +name = "babel" +version = "2.17.0" +requires_python = ">=3.8" +summary = "Internationalization utilities" +groups = ["default"] +dependencies = [ + "pytz>=2015.7; python_version < \"3.9\"", +] +files = [ + {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, + {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.13.3" +requires_python = ">=3.7.0" +summary = "Screen-scraping library" +groups = ["default"] +dependencies = [ + "soupsieve>1.2", + "typing-extensions>=4.0.0", +] +files = [ + {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, + {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, +] + +[[package]] +name = "bleach" +version = "6.2.0" +requires_python = ">=3.9" +summary = "An easy safelist-based HTML-sanitizing tool." +groups = ["default"] +dependencies = [ + "webencodings", +] +files = [ + {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, + {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, +] + +[[package]] +name = "bleach" +version = "6.2.0" +extras = ["css"] +requires_python = ">=3.9" +summary = "An easy safelist-based HTML-sanitizing tool." +groups = ["default"] +dependencies = [ + "bleach==6.2.0", + "tinycss2<1.5,>=1.1.0", +] +files = [ + {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, + {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, +] + +[[package]] +name = "certifi" +version = "2025.1.31" +requires_python = ">=3.6" +summary = "Python package for providing Mozilla's CA Bundle." +groups = ["default"] +files = [ + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +requires_python = ">=3.8" +summary = "Foreign Function Interface for Python calling C code." +groups = ["default"] +dependencies = [ + "pycparser", +] +files = [ + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +requires_python = ">=3.7" +summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +groups = ["default"] +files = [ + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +summary = "Cross-platform colored terminal text." +groups = ["default"] +marker = "sys_platform == \"win32\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.2" +requires_python = ">=3.8" +summary = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +groups = ["default"] +dependencies = [ + "traitlets>=4", +] +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[[package]] +name = "contourpy" +version = "1.3.1" +requires_python = ">=3.10" +summary = "Python library for calculating contours of 2D quadrilateral grids" +groups = ["default"] +dependencies = [ + "numpy>=1.23", +] +files = [ + {file = "contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2"}, + {file = "contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7"}, + {file = "contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3"}, + {file = "contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1"}, + {file = "contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82"}, + {file = "contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30"}, + {file = "contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f"}, + {file = "contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242"}, + {file = "contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1"}, + {file = "contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546"}, + {file = "contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699"}, +] + +[[package]] +name = "cycler" +version = "0.12.1" +requires_python = ">=3.8" +summary = "Composable style cycles" +groups = ["default"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[[package]] +name = "debugpy" +version = "1.8.12" +requires_python = ">=3.8" +summary = "An implementation of the Debug Adapter Protocol for Python" +groups = ["default"] +files = [ + {file = "debugpy-1.8.12-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:696d8ae4dff4cbd06bf6b10d671e088b66669f110c7c4e18a44c43cf75ce966f"}, + {file = "debugpy-1.8.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:898fba72b81a654e74412a67c7e0a81e89723cfe2a3ea6fcd3feaa3395138ca9"}, + {file = "debugpy-1.8.12-cp313-cp313-win32.whl", hash = "sha256:22a11c493c70413a01ed03f01c3c3a2fc4478fc6ee186e340487b2edcd6f4180"}, + {file = "debugpy-1.8.12-cp313-cp313-win_amd64.whl", hash = "sha256:fdb3c6d342825ea10b90e43d7f20f01535a72b3a1997850c0c3cefa5c27a4a2c"}, + {file = "debugpy-1.8.12-py2.py3-none-any.whl", hash = "sha256:274b6a2040349b5c9864e475284bce5bb062e63dce368a394b8cc865ae3b00c6"}, + {file = "debugpy-1.8.12.tar.gz", hash = "sha256:646530b04f45c830ceae8e491ca1c9320a2d2f0efea3141487c82130aba70dce"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +requires_python = ">=3.5" +summary = "Decorators for Humans" +groups = ["default"] +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "XML bomb protection for Python stdlib modules" +groups = ["default"] +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "executing" +version = "2.2.0" +requires_python = ">=3.8" +summary = "Get the currently executing AST node of a frame, and other information" +groups = ["default"] +files = [ + {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, + {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.1" +summary = "Fastest Python implementation of JSON schema" +groups = ["default"] +files = [ + {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, + {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, +] + +[[package]] +name = "fonttools" +version = "4.56.0" +requires_python = ">=3.8" +summary = "Tools to manipulate font files" +groups = ["default"] +files = [ + {file = "fonttools-4.56.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f20e2c0dfab82983a90f3d00703ac0960412036153e5023eed2b4641d7d5e692"}, + {file = "fonttools-4.56.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f36a0868f47b7566237640c026c65a86d09a3d9ca5df1cd039e30a1da73098a0"}, + {file = "fonttools-4.56.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62b4c6802fa28e14dba010e75190e0e6228513573f1eeae57b11aa1a39b7e5b1"}, + {file = "fonttools-4.56.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a05d1f07eb0a7d755fbe01fee1fd255c3a4d3730130cf1bfefb682d18fd2fcea"}, + {file = "fonttools-4.56.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0073b62c3438cf0058488c002ea90489e8801d3a7af5ce5f7c05c105bee815c3"}, + {file = "fonttools-4.56.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cad98c94833465bcf28f51c248aaf07ca022efc6a3eba750ad9c1e0256d278"}, + {file = "fonttools-4.56.0-cp313-cp313-win32.whl", hash = "sha256:d0cb73ccf7f6d7ca8d0bc7ea8ac0a5b84969a41c56ac3ac3422a24df2680546f"}, + {file = "fonttools-4.56.0-cp313-cp313-win_amd64.whl", hash = "sha256:62cc1253827d1e500fde9dbe981219fea4eb000fd63402283472d38e7d8aa1c6"}, + {file = "fonttools-4.56.0-py3-none-any.whl", hash = "sha256:1088182f68c303b50ca4dc0c82d42083d176cba37af1937e1a976a31149d4d14"}, + {file = "fonttools-4.56.0.tar.gz", hash = "sha256:a114d1567e1a1586b7e9e7fc2ff686ca542a82769a296cef131e4c4af51e58f4"}, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +requires_python = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +summary = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +groups = ["default"] +dependencies = [ + "cached-property>=1.3.0; python_version < \"3.8\"", +] +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +requires_python = ">=3.7" +summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +groups = ["default"] +dependencies = [ + "typing-extensions; python_version < \"3.8\"", +] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +requires_python = ">=3.8" +summary = "A minimal low-level HTTP client." +groups = ["default"] +dependencies = [ + "certifi", + "h11<0.15,>=0.13", +] +files = [ + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, +] + +[[package]] +name = "httpx" +version = "0.28.1" +requires_python = ">=3.8" +summary = "The next generation HTTP client." +groups = ["default"] +dependencies = [ + "anyio", + "certifi", + "httpcore==1.*", + "idna", +] +files = [ + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, +] + +[[package]] +name = "idna" +version = "3.10" +requires_python = ">=3.6" +summary = "Internationalized Domain Names in Applications (IDNA)" +groups = ["default"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +requires_python = ">=3.8" +summary = "IPython Kernel for Jupyter" +groups = ["default"] +dependencies = [ + "appnope; platform_system == \"Darwin\"", + "comm>=0.1.1", + "debugpy>=1.6.5", + "ipython>=7.23.1", + "jupyter-client>=6.1.12", + "jupyter-core!=5.0.*,>=4.12", + "matplotlib-inline>=0.1", + "nest-asyncio", + "packaging", + "psutil", + "pyzmq>=24", + "tornado>=6.1", + "traitlets>=5.4.0", +] +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[[package]] +name = "ipython" +version = "8.32.0" +requires_python = ">=3.10" +summary = "IPython: Productive Interactive Computing" +groups = ["default"] +dependencies = [ + "colorama; sys_platform == \"win32\"", + "decorator", + "exceptiongroup; python_version < \"3.11\"", + "jedi>=0.16", + "matplotlib-inline", + "pexpect>4.3; sys_platform != \"win32\" and sys_platform != \"emscripten\"", + "prompt-toolkit<3.1.0,>=3.0.41", + "pygments>=2.4.0", + "stack-data", + "traitlets>=5.13.0", + "typing-extensions>=4.6; python_version < \"3.12\"", +] +files = [ + {file = "ipython-8.32.0-py3-none-any.whl", hash = "sha256:cae85b0c61eff1fc48b0a8002de5958b6528fa9c8defb1894da63f42613708aa"}, + {file = "ipython-8.32.0.tar.gz", hash = "sha256:be2c91895b0b9ea7ba49d33b23e2040c352b33eb6a519cca7ce6e0c743444251"}, +] + +[[package]] +name = "ipywidgets" +version = "8.1.5" +requires_python = ">=3.7" +summary = "Jupyter interactive widgets" +groups = ["default"] +dependencies = [ + "comm>=0.1.3", + "ipython>=6.1.0", + "jupyterlab-widgets~=3.0.12", + "traitlets>=4.3.1", + "widgetsnbextension~=4.0.12", +] +files = [ + {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, + {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +requires_python = ">=3.7" +summary = "Operations with ISO 8601 durations" +groups = ["default"] +dependencies = [ + "arrow>=0.15.0", +] +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[[package]] +name = "jedi" +version = "0.19.2" +requires_python = ">=3.6" +summary = "An autocompletion tool for Python that can be used for text editors." +groups = ["default"] +dependencies = [ + "parso<0.9.0,>=0.8.4", +] +files = [ + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +requires_python = ">=3.7" +summary = "A very fast and expressive template engine." +groups = ["default"] +dependencies = [ + "MarkupSafe>=2.0", +] +files = [ + {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"}, + {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"}, +] + +[[package]] +name = "json5" +version = "0.10.0" +requires_python = ">=3.8.0" +summary = "A Python implementation of the JSON5 data format." +groups = ["default"] +files = [ + {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, + {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +requires_python = ">=3.7" +summary = "Identify specific nodes in a JSON document (RFC 6901) " +groups = ["default"] +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +requires_python = ">=3.8" +summary = "An implementation of JSON Schema validation for Python" +groups = ["default"] +dependencies = [ + "attrs>=22.2.0", + "importlib-resources>=1.4.0; python_version < \"3.9\"", + "jsonschema-specifications>=2023.03.6", + "pkgutil-resolve-name>=1.3.10; python_version < \"3.9\"", + "referencing>=0.28.4", + "rpds-py>=0.7.1", +] +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +requires_python = ">=3.9" +summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +groups = ["default"] +dependencies = [ + "referencing>=0.31.0", +] +files = [ + {file = "jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf"}, + {file = "jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +extras = ["format-nongpl"] +requires_python = ">=3.8" +summary = "An implementation of JSON Schema validation for Python" +groups = ["default"] +dependencies = [ + "fqdn", + "idna", + "isoduration", + "jsonpointer>1.13", + "jsonschema==4.23.0", + "rfc3339-validator", + "rfc3986-validator>0.1.0", + "uri-template", + "webcolors>=24.6.0", +] +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[[package]] +name = "jupyter" +version = "1.1.1" +summary = "Jupyter metapackage. Install all the Jupyter components in one go." +groups = ["default"] +dependencies = [ + "ipykernel", + "ipywidgets", + "jupyter-console", + "jupyterlab", + "nbconvert", + "notebook", +] +files = [ + {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"}, + {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"}, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +requires_python = ">=3.8" +summary = "Jupyter protocol implementation and client libraries" +groups = ["default"] +dependencies = [ + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "jupyter-core!=5.0.*,>=4.12", + "python-dateutil>=2.8.2", + "pyzmq>=23.0", + "tornado>=6.2", + "traitlets>=5.3", +] +files = [ + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +requires_python = ">=3.7" +summary = "Jupyter terminal console" +groups = ["default"] +dependencies = [ + "ipykernel>=6.14", + "ipython", + "jupyter-client>=7.0.0", + "jupyter-core!=5.0.*,>=4.12", + "prompt-toolkit>=3.0.30", + "pygments", + "pyzmq>=17", + "traitlets>=5.4", +] +files = [ + {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, + {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, +] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +requires_python = ">=3.8" +summary = "Jupyter core package. A base package on which Jupyter projects rely." +groups = ["default"] +dependencies = [ + "platformdirs>=2.5", + "pywin32>=300; sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"", + "traitlets>=5.3", +] +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[[package]] +name = "jupyter-events" +version = "0.12.0" +requires_python = ">=3.9" +summary = "Jupyter Event System library" +groups = ["default"] +dependencies = [ + "jsonschema[format-nongpl]>=4.18.0", + "packaging", + "python-json-logger>=2.0.4", + "pyyaml>=5.3", + "referencing", + "rfc3339-validator", + "rfc3986-validator>=0.1.1", + "traitlets>=5.3", +] +files = [ + {file = "jupyter_events-0.12.0-py3-none-any.whl", hash = "sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb"}, + {file = "jupyter_events-0.12.0.tar.gz", hash = "sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b"}, +] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +requires_python = ">=3.8" +summary = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +groups = ["default"] +dependencies = [ + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "jupyter-server>=1.1.2", +] +files = [ + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, +] + +[[package]] +name = "jupyter-server" +version = "2.15.0" +requires_python = ">=3.9" +summary = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +groups = ["default"] +dependencies = [ + "anyio>=3.1.0", + "argon2-cffi>=21.1", + "jinja2>=3.0.3", + "jupyter-client>=7.4.4", + "jupyter-core!=5.0.*,>=4.12", + "jupyter-events>=0.11.0", + "jupyter-server-terminals>=0.4.4", + "nbconvert>=6.4.4", + "nbformat>=5.3.0", + "overrides>=5.0", + "packaging>=22.0", + "prometheus-client>=0.9", + "pywinpty>=2.0.1; os_name == \"nt\"", + "pyzmq>=24", + "send2trash>=1.8.2", + "terminado>=0.8.3", + "tornado>=6.2.0", + "traitlets>=5.6.0", + "websocket-client>=1.7", +] +files = [ + {file = "jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3"}, + {file = "jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084"}, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +requires_python = ">=3.8" +summary = "A Jupyter Server Extension Providing Terminals." +groups = ["default"] +dependencies = [ + "pywinpty>=2.0.3; os_name == \"nt\"", + "terminado>=0.8.3", +] +files = [ + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, +] + +[[package]] +name = "jupyterlab" +version = "4.3.5" +requires_python = ">=3.8" +summary = "JupyterLab computational environment" +groups = ["default"] +dependencies = [ + "async-lru>=1.0.0", + "httpx>=0.25.0", + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "importlib-resources>=1.4; python_version < \"3.9\"", + "ipykernel>=6.5.0", + "jinja2>=3.0.3", + "jupyter-core", + "jupyter-lsp>=2.0.0", + "jupyter-server<3,>=2.4.0", + "jupyterlab-server<3,>=2.27.1", + "notebook-shim>=0.2", + "packaging", + "setuptools>=40.8.0", + "tomli>=1.2.2; python_version < \"3.11\"", + "tornado>=6.2.0", + "traitlets", +] +files = [ + {file = "jupyterlab-4.3.5-py3-none-any.whl", hash = "sha256:571bbdee20e4c5321ab5195bc41cf92a75a5cff886be5e57ce78dfa37a5e9fdb"}, + {file = "jupyterlab-4.3.5.tar.gz", hash = "sha256:c779bf72ced007d7d29d5bcef128e7fdda96ea69299e19b04a43635a7d641f9d"}, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +requires_python = ">=3.8" +summary = "Pygments theme using JupyterLab CSS variables" +groups = ["default"] +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.3" +requires_python = ">=3.8" +summary = "A set of server components for JupyterLab and JupyterLab like applications." +groups = ["default"] +dependencies = [ + "babel>=2.10", + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "jinja2>=3.0.3", + "json5>=0.9.0", + "jsonschema>=4.18.0", + "jupyter-server<3,>=1.21", + "packaging>=21.3", + "requests>=2.31", +] +files = [ + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.13" +requires_python = ">=3.7" +summary = "Jupyter interactive widgets for JupyterLab" +groups = ["default"] +files = [ + {file = "jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54"}, + {file = "jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed"}, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +requires_python = ">=3.10" +summary = "A fast implementation of the Cassowary constraint solver" +groups = ["default"] +files = [ + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, + {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, + {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, + {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, + {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, + {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, + {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +requires_python = ">=3.9" +summary = "Safely add untrusted strings to HTML/XML markup." +groups = ["default"] +files = [ + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "matplotlib" +version = "3.10.0" +requires_python = ">=3.10" +summary = "Python plotting package" +groups = ["default"] +dependencies = [ + "contourpy>=1.0.1", + "cycler>=0.10", + "fonttools>=4.22.0", + "kiwisolver>=1.3.1", + "numpy>=1.23", + "packaging>=20.0", + "pillow>=8", + "pyparsing>=2.3.1", + "python-dateutil>=2.7", +] +files = [ + {file = "matplotlib-3.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25"}, + {file = "matplotlib-3.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2"}, + {file = "matplotlib-3.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf"}, + {file = "matplotlib-3.10.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae"}, + {file = "matplotlib-3.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06"}, + {file = "matplotlib-3.10.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593"}, + {file = "matplotlib-3.10.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e"}, + {file = "matplotlib-3.10.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede"}, + {file = "matplotlib-3.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c"}, + {file = "matplotlib-3.10.0.tar.gz", hash = "sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +requires_python = ">=3.8" +summary = "Inline Matplotlib backend for Jupyter" +groups = ["default"] +dependencies = [ + "traitlets", +] +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[[package]] +name = "mistune" +version = "3.1.1" +requires_python = ">=3.8" +summary = "A sane and fast Markdown parser with useful plugins and renderers" +groups = ["default"] +dependencies = [ + "typing-extensions; python_version < \"3.11\"", +] +files = [ + {file = "mistune-3.1.1-py3-none-any.whl", hash = "sha256:02106ac2aa4f66e769debbfa028509a275069dcffce0dfa578edd7b991ee700a"}, + {file = "mistune-3.1.1.tar.gz", hash = "sha256:e0740d635f515119f7d1feb6f9b192ee60f0cc649f80a8f944f905706a21654c"}, +] + +[[package]] +name = "narwhals" +version = "1.25.2" +requires_python = ">=3.8" +summary = "Extremely lightweight compatibility layer between dataframe libraries" +groups = ["default"] +files = [ + {file = "narwhals-1.25.2-py3-none-any.whl", hash = "sha256:e645f7fc1f8c0a3563a6cdcd0191586cdf88470ad90f0818abba7ceb6c181b00"}, + {file = "narwhals-1.25.2.tar.gz", hash = "sha256:37594746fc06fe4a588967a34a2974b1f3a7ad6ff1571b6e31ac5e58c9591000"}, +] + +[[package]] +name = "nbclient" +version = "0.10.2" +requires_python = ">=3.9.0" +summary = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +groups = ["default"] +dependencies = [ + "jupyter-client>=6.1.12", + "jupyter-core!=5.0.*,>=4.12", + "nbformat>=5.1", + "traitlets>=5.4", +] +files = [ + {file = "nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d"}, + {file = "nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"}, +] + +[[package]] +name = "nbconvert" +version = "7.16.6" +requires_python = ">=3.8" +summary = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." +groups = ["default"] +dependencies = [ + "beautifulsoup4", + "bleach[css]!=5.0.0", + "defusedxml", + "importlib-metadata>=3.6; python_version < \"3.10\"", + "jinja2>=3.0", + "jupyter-core>=4.7", + "jupyterlab-pygments", + "markupsafe>=2.0", + "mistune<4,>=2.0.3", + "nbclient>=0.5.0", + "nbformat>=5.7", + "packaging", + "pandocfilters>=1.4.1", + "pygments>=2.4.1", + "traitlets>=5.1", +] +files = [ + {file = "nbconvert-7.16.6-py3-none-any.whl", hash = "sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b"}, + {file = "nbconvert-7.16.6.tar.gz", hash = "sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582"}, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +requires_python = ">=3.8" +summary = "The Jupyter Notebook format" +groups = ["default"] +dependencies = [ + "fastjsonschema>=2.15", + "jsonschema>=2.6", + "jupyter-core!=5.0.*,>=4.12", + "traitlets>=5.1", +] +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +requires_python = ">=3.5" +summary = "Patch asyncio to allow nested event loops" +groups = ["default"] +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "notebook" +version = "7.3.2" +requires_python = ">=3.8" +summary = "Jupyter Notebook - A web-based notebook environment for interactive computing" +groups = ["default"] +dependencies = [ + "jupyter-server<3,>=2.4.0", + "jupyterlab-server<3,>=2.27.1", + "jupyterlab<4.4,>=4.3.4", + "notebook-shim<0.3,>=0.2", + "tornado>=6.2.0", +] +files = [ + {file = "notebook-7.3.2-py3-none-any.whl", hash = "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288"}, + {file = "notebook-7.3.2.tar.gz", hash = "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8"}, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +requires_python = ">=3.7" +summary = "A shim layer for notebook traits and config" +groups = ["default"] +dependencies = [ + "jupyter-server<3,>=1.8", +] +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[[package]] +name = "numpy" +version = "2.2.2" +requires_python = ">=3.10" +summary = "Fundamental package for array computing in Python" +groups = ["default"] +files = [ + {file = "numpy-2.2.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b208cfd4f5fe34e1535c08983a1a6803fdbc7a1e86cf13dd0c61de0b51a0aadc"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d0bbe7dd86dca64854f4b6ce2ea5c60b51e36dfd597300057cf473d3615f2369"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:22ea3bb552ade325530e72a0c557cdf2dea8914d3a5e1fecf58fa5dbcc6f43cd"}, + {file = "numpy-2.2.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:128c41c085cab8a85dc29e66ed88c05613dccf6bc28b3866cd16050a2f5448be"}, + {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:250c16b277e3b809ac20d1f590716597481061b514223c7badb7a0f9993c7f84"}, + {file = "numpy-2.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0c8854b09bc4de7b041148d8550d3bd712b5c21ff6a8ed308085f190235d7ff"}, + {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b6fb9c32a91ec32a689ec6410def76443e3c750e7cfc3fb2206b985ffb2b85f0"}, + {file = "numpy-2.2.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:57b4012e04cc12b78590a334907e01b3a85efb2107df2b8733ff1ed05fce71de"}, + {file = "numpy-2.2.2-cp313-cp313-win32.whl", hash = "sha256:4dbd80e453bd34bd003b16bd802fac70ad76bd463f81f0c518d1245b1c55e3d9"}, + {file = "numpy-2.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:5a8c863ceacae696aff37d1fd636121f1a512117652e5dfb86031c8d84836369"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:b3482cb7b3325faa5f6bc179649406058253d91ceda359c104dac0ad320e1391"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9491100aba630910489c1d0158034e1c9a6546f0b1340f716d522dc103788e39"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:41184c416143defa34cc8eb9d070b0a5ba4f13a0fa96a709e20584638254b317"}, + {file = "numpy-2.2.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:7dca87ca328f5ea7dafc907c5ec100d187911f94825f8700caac0b3f4c384b49"}, + {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bc61b307655d1a7f9f4b043628b9f2b721e80839914ede634e3d485913e1fb2"}, + {file = "numpy-2.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fad446ad0bc886855ddf5909cbf8cb5d0faa637aaa6277fb4b19ade134ab3c7"}, + {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:149d1113ac15005652e8d0d3f6fd599360e1a708a4f98e43c9c77834a28238cb"}, + {file = "numpy-2.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:106397dbbb1896f99e044efc90360d098b3335060375c26aa89c0d8a97c5f648"}, + {file = "numpy-2.2.2-cp313-cp313t-win32.whl", hash = "sha256:0eec19f8af947a61e968d5429f0bd92fec46d92b0008d0a6685b40d6adf8a4f4"}, + {file = "numpy-2.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:97b974d3ba0fb4612b77ed35d7627490e8e3dff56ab41454d9e8b23448940576"}, + {file = "numpy-2.2.2.tar.gz", hash = "sha256:ed6906f61834d687738d25988ae117683705636936cc605be0bb208b23df4d8f"}, +] + +[[package]] +name = "overrides" +version = "7.7.0" +requires_python = ">=3.6" +summary = "A decorator to automatically detect mismatch when overriding a method." +groups = ["default"] +dependencies = [ + "typing; python_version < \"3.5\"", +] +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + +[[package]] +name = "packaging" +version = "24.2" +requires_python = ">=3.8" +summary = "Core utilities for Python packages" +groups = ["default"] +files = [ + {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, + {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, +] + +[[package]] +name = "pandas" +version = "2.2.3" +requires_python = ">=3.9" +summary = "Powerful data structures for data analysis, time series, and statistics" +groups = ["default"] +dependencies = [ + "numpy>=1.22.4; python_version < \"3.11\"", + "numpy>=1.23.2; python_version == \"3.11\"", + "numpy>=1.26.0; python_version >= \"3.12\"", + "python-dateutil>=2.8.2", + "pytz>=2020.1", + "tzdata>=2022.7", +] +files = [ + {file = "pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015"}, + {file = "pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0"}, + {file = "pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659"}, + {file = "pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb"}, + {file = "pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468"}, + {file = "pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2"}, + {file = "pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d"}, + {file = "pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a"}, + {file = "pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667"}, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Utilities for writing pandoc filters in python" +groups = ["default"] +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +requires_python = ">=3.6" +summary = "A Python Parser" +groups = ["default"] +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +summary = "Pexpect allows easy control of interactive console applications." +groups = ["default"] +marker = "sys_platform != \"win32\" and sys_platform != \"emscripten\"" +dependencies = [ + "ptyprocess>=0.5", +] +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[[package]] +name = "pillow" +version = "11.1.0" +requires_python = ">=3.9" +summary = "Python Imaging Library (Fork)" +groups = ["default"] +files = [ + {file = "pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc"}, + {file = "pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5"}, + {file = "pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352"}, + {file = "pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3"}, + {file = "pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9"}, + {file = "pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c"}, + {file = "pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861"}, + {file = "pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c"}, + {file = "pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547"}, + {file = "pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab"}, + {file = "pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9"}, + {file = "pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe"}, + {file = "pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756"}, + {file = "pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20"}, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +requires_python = ">=3.8" +summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +groups = ["default"] +files = [ + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, +] + +[[package]] +name = "plotly" +version = "6.0.0" +requires_python = ">=3.8" +summary = "An open-source, interactive data visualization library for Python" +groups = ["default"] +dependencies = [ + "narwhals>=1.15.1", + "packaging", +] +files = [ + {file = "plotly-6.0.0-py3-none-any.whl", hash = "sha256:f708871c3a9349a68791ff943a5781b1ec04de7769ea69068adcd9202e57653a"}, + {file = "plotly-6.0.0.tar.gz", hash = "sha256:c4aad38b8c3d65e4a5e7dd308b084143b9025c2cc9d5317fc1f1d30958db87d3"}, +] + +[[package]] +name = "prometheus-client" +version = "0.21.1" +requires_python = ">=3.8" +summary = "Python client for the Prometheus monitoring system." +groups = ["default"] +files = [ + {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, + {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.50" +requires_python = ">=3.8.0" +summary = "Library for building powerful interactive command lines in Python" +groups = ["default"] +dependencies = [ + "wcwidth", +] +files = [ + {file = "prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198"}, + {file = "prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab"}, +] + +[[package]] +name = "psutil" +version = "6.1.1" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +summary = "Cross-platform lib for process and system monitoring in Python." +groups = ["default"] +files = [ + {file = "psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8"}, + {file = "psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160"}, + {file = "psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3"}, + {file = "psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53"}, + {file = "psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649"}, + {file = "psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +summary = "Run a subprocess in a pseudo terminal" +groups = ["default"] +marker = "sys_platform != \"win32\" and sys_platform != \"emscripten\" or os_name != \"nt\"" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +summary = "Safely evaluate AST nodes without side effects" +groups = ["default"] +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +requires_python = ">=3.8" +summary = "C parser in Python" +groups = ["default"] +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pygments" +version = "2.19.1" +requires_python = ">=3.8" +summary = "Pygments is a syntax highlighting package written in Python." +groups = ["default"] +files = [ + {file = "pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c"}, + {file = "pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f"}, +] + +[[package]] +name = "pyparsing" +version = "3.2.1" +requires_python = ">=3.9" +summary = "pyparsing module - Classes and methods to define and execute parsing grammars" +groups = ["default"] +files = [ + {file = "pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1"}, + {file = "pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a"}, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +summary = "Extensions to the standard Python datetime module" +groups = ["default"] +dependencies = [ + "six>=1.5", +] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[[package]] +name = "python-json-logger" +version = "3.2.1" +requires_python = ">=3.8" +summary = "JSON Log Formatter for the Python Logging Package" +groups = ["default"] +dependencies = [ + "typing-extensions; python_version < \"3.10\"", +] +files = [ + {file = "python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090"}, + {file = "python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008"}, +] + +[[package]] +name = "pytz" +version = "2025.1" +summary = "World timezone definitions, modern and historical" +groups = ["default"] +files = [ + {file = "pytz-2025.1-py2.py3-none-any.whl", hash = "sha256:89dd22dca55b46eac6eda23b2d72721bf1bdfef212645d81513ef5d03038de57"}, + {file = "pytz-2025.1.tar.gz", hash = "sha256:c2db42be2a2518b28e65f9207c4d05e6ff547d1efa4086469ef855e4ab70178e"}, +] + +[[package]] +name = "pywin32" +version = "308" +summary = "Python for Window Extensions" +groups = ["default"] +marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +files = [ + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.15" +requires_python = ">=3.9" +summary = "Pseudo terminal support for Windows from Python." +groups = ["default"] +marker = "os_name == \"nt\"" +files = [ + {file = "pywinpty-2.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408"}, + {file = "pywinpty-2.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:a4560ad8c01e537708d2790dbe7da7d986791de805d89dd0d3697ca59e9e4901"}, + {file = "pywinpty-2.0.15.tar.gz", hash = "sha256:312cf39153a8736c617d45ce8b6ad6cd2107de121df91c455b10ce6bba7a39b2"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +requires_python = ">=3.8" +summary = "YAML parser and emitter for Python" +groups = ["default"] +files = [ + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyzmq" +version = "26.2.1" +requires_python = ">=3.7" +summary = "Python bindings for 0MQ" +groups = ["default"] +dependencies = [ + "cffi; implementation_name == \"pypy\"", +] +files = [ + {file = "pyzmq-26.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:099b56ef464bc355b14381f13355542e452619abb4c1e57a534b15a106bf8e23"}, + {file = "pyzmq-26.2.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:651726f37fcbce9f8dd2a6dab0f024807929780621890a4dc0c75432636871be"}, + {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57dd4d91b38fa4348e237a9388b4423b24ce9c1695bbd4ba5a3eada491e09399"}, + {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d51a7bfe01a48e1064131f3416a5439872c533d756396be2b39e3977b41430f9"}, + {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7154d228502e18f30f150b7ce94f0789d6b689f75261b623f0fdc1eec642aab"}, + {file = "pyzmq-26.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f1f31661a80cc46aba381bed475a9135b213ba23ca7ff6797251af31510920ce"}, + {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:290c96f479504439b6129a94cefd67a174b68ace8a8e3f551b2239a64cfa131a"}, + {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f2c307fbe86e18ab3c885b7e01de942145f539165c3360e2af0f094dd440acd9"}, + {file = "pyzmq-26.2.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b314268e716487bfb86fcd6f84ebbe3e5bec5fac75fdf42bc7d90fdb33f618ad"}, + {file = "pyzmq-26.2.1-cp313-cp313-win32.whl", hash = "sha256:edb550616f567cd5603b53bb52a5f842c0171b78852e6fc7e392b02c2a1504bb"}, + {file = "pyzmq-26.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:100a826a029c8ef3d77a1d4c97cbd6e867057b5806a7276f2bac1179f893d3bf"}, + {file = "pyzmq-26.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:6991ee6c43e0480deb1b45d0c7c2bac124a6540cba7db4c36345e8e092da47ce"}, + {file = "pyzmq-26.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:25e720dba5b3a3bb2ad0ad5d33440babd1b03438a7a5220511d0c8fa677e102e"}, + {file = "pyzmq-26.2.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:9ec6abfb701437142ce9544bd6a236addaf803a32628d2260eb3dbd9a60e2891"}, + {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e1eb9d2bfdf5b4e21165b553a81b2c3bd5be06eeddcc4e08e9692156d21f1f6"}, + {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90dc731d8e3e91bcd456aa7407d2eba7ac6f7860e89f3766baabb521f2c1de4a"}, + {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6a93d684278ad865fc0b9e89fe33f6ea72d36da0e842143891278ff7fd89c3"}, + {file = "pyzmq-26.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c1bb37849e2294d519117dd99b613c5177934e5c04a5bb05dd573fa42026567e"}, + {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:632a09c6d8af17b678d84df442e9c3ad8e4949c109e48a72f805b22506c4afa7"}, + {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:fc409c18884eaf9ddde516d53af4f2db64a8bc7d81b1a0c274b8aa4e929958e8"}, + {file = "pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:17f88622b848805d3f6427ce1ad5a2aa3cf61f12a97e684dab2979802024d460"}, + {file = "pyzmq-26.2.1.tar.gz", hash = "sha256:17d72a74e5e9ff3829deb72897a175333d3ef5b5413948cae3cf7ebf0b02ecca"}, +] + +[[package]] +name = "referencing" +version = "0.36.2" +requires_python = ">=3.9" +summary = "JSON Referencing + Python" +groups = ["default"] +dependencies = [ + "attrs>=22.2.0", + "rpds-py>=0.7.0", + "typing-extensions>=4.4.0; python_version < \"3.13\"", +] +files = [ + {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, + {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +requires_python = ">=3.8" +summary = "Python HTTP for Humans." +groups = ["default"] +dependencies = [ + "certifi>=2017.4.17", + "charset-normalizer<4,>=2", + "idna<4,>=2.5", + "urllib3<3,>=1.21.1", +] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "A pure python RFC3339 validator" +groups = ["default"] +dependencies = [ + "six", +] +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "Pure python rfc3986 validator" +groups = ["default"] +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rpds-py" +version = "0.22.3" +requires_python = ">=3.9" +summary = "Python bindings to Rust's persistent data structures (rpds)" +groups = ["default"] +files = [ + {file = "rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84"}, + {file = "rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518"}, + {file = "rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16"}, + {file = "rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f"}, + {file = "rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de"}, + {file = "rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3"}, + {file = "rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b"}, + {file = "rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730"}, + {file = "rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf"}, + {file = "rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d"}, +] + +[[package]] +name = "scipy" +version = "1.15.1" +requires_python = ">=3.10" +summary = "Fundamental algorithms for scientific computing in Python" +groups = ["default"] +dependencies = [ + "numpy<2.5,>=1.23.5", +] +files = [ + {file = "scipy-1.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:100193bb72fbff37dbd0bf14322314fc7cbe08b7ff3137f11a34d06dc0ee6b85"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:2114a08daec64980e4b4cbdf5bee90935af66d750146b1d2feb0d3ac30613692"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:6b3e71893c6687fc5e29208d518900c24ea372a862854c9888368c0b267387ab"}, + {file = "scipy-1.15.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:837299eec3d19b7e042923448d17d95a86e43941104d33f00da7e31a0f715d3c"}, + {file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82add84e8a9fb12af5c2c1a3a3f1cb51849d27a580cb9e6bd66226195142be6e"}, + {file = "scipy-1.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070d10654f0cb6abd295bc96c12656f948e623ec5f9a4eab0ddb1466c000716e"}, + {file = "scipy-1.15.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55cc79ce4085c702ac31e49b1e69b27ef41111f22beafb9b49fea67142b696c4"}, + {file = "scipy-1.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:c352c1b6d7cac452534517e022f8f7b8d139cd9f27e6fbd9f3cbd0bfd39f5bef"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0458839c9f873062db69a03de9a9765ae2e694352c76a16be44f93ea45c28d2b"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:af0b61c1de46d0565b4b39c6417373304c1d4f5220004058bdad3061c9fa8a95"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:71ba9a76c2390eca6e359be81a3e879614af3a71dfdabb96d1d7ab33da6f2364"}, + {file = "scipy-1.15.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14eaa373c89eaf553be73c3affb11ec6c37493b7eaaf31cf9ac5dffae700c2e0"}, + {file = "scipy-1.15.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f735bc41bd1c792c96bc426dece66c8723283695f02df61dcc4d0a707a42fc54"}, + {file = "scipy-1.15.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2722a021a7929d21168830790202a75dbb20b468a8133c74a2c0230c72626b6c"}, + {file = "scipy-1.15.1-cp313-cp313t-win_amd64.whl", hash = "sha256:bc7136626261ac1ed988dca56cfc4ab5180f75e0ee52e58f1e6aa74b5f3eacd5"}, + {file = "scipy-1.15.1.tar.gz", hash = "sha256:033a75ddad1463970c96a88063a1df87ccfddd526437136b6ee81ff0312ebdf6"}, +] + +[[package]] +name = "send2trash" +version = "1.8.3" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +summary = "Send file to trash natively under Mac OS X, Windows and Linux" +groups = ["default"] +files = [ + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, +] + +[[package]] +name = "setuptools" +version = "75.8.0" +requires_python = ">=3.9" +summary = "Easily download, build, install, upgrade, and uninstall Python packages" +groups = ["default"] +files = [ + {file = "setuptools-75.8.0-py3-none-any.whl", hash = "sha256:e3982f444617239225d675215d51f6ba05f845d4eec313da4418fdbb56fb27e3"}, + {file = "setuptools-75.8.0.tar.gz", hash = "sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6"}, +] + +[[package]] +name = "six" +version = "1.17.0" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +summary = "Python 2 and 3 compatibility utilities" +groups = ["default"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +requires_python = ">=3.7" +summary = "Sniff out which async library your code is running under" +groups = ["default"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.6" +requires_python = ">=3.8" +summary = "A modern CSS selector implementation for Beautiful Soup." +groups = ["default"] +files = [ + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +summary = "Extract data from python stack frames and tracebacks for informative displays" +groups = ["default"] +dependencies = [ + "asttokens>=2.1.0", + "executing>=1.2.0", + "pure-eval", +] +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[[package]] +name = "terminado" +version = "0.18.1" +requires_python = ">=3.8" +summary = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +groups = ["default"] +dependencies = [ + "ptyprocess; os_name != \"nt\"", + "pywinpty>=1.1.0; os_name == \"nt\"", + "tornado>=6.1.0", +] +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +requires_python = ">=3.8" +summary = "A tiny CSS parser" +groups = ["default"] +dependencies = [ + "webencodings>=0.4", +] +files = [ + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, +] + +[[package]] +name = "tornado" +version = "6.4.2" +requires_python = ">=3.8" +summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +groups = ["default"] +files = [ + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +requires_python = ">=3.8" +summary = "Traitlets Python configuration system" +groups = ["default"] +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20241206" +requires_python = ">=3.8" +summary = "Typing stubs for python-dateutil" +groups = ["default"] +files = [ + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +requires_python = ">=3.8" +summary = "Backported and Experimental Type Hints for Python 3.8+" +groups = ["default"] +files = [ + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, +] + +[[package]] +name = "tzdata" +version = "2025.1" +requires_python = ">=2" +summary = "Provider of IANA time zone data" +groups = ["default"] +files = [ + {file = "tzdata-2025.1-py2.py3-none-any.whl", hash = "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"}, + {file = "tzdata-2025.1.tar.gz", hash = "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +requires_python = ">=3.7" +summary = "RFC 6570 URI Template Processor" +groups = ["default"] +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +requires_python = ">=3.9" +summary = "HTTP library with thread-safe connection pooling, file post, and more." +groups = ["default"] +files = [ + {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"}, + {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"}, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +summary = "Measures the displayed width of unicode strings in a terminal" +groups = ["default"] +dependencies = [ + "backports-functools-lru-cache>=1.2.1; python_version < \"3.2\"", +] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "24.11.1" +requires_python = ">=3.9" +summary = "A library for working with the color formats defined by HTML and CSS." +groups = ["default"] +files = [ + {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, + {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +summary = "Character encoding aliases for legacy web content" +groups = ["default"] +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +requires_python = ">=3.8" +summary = "WebSocket client for Python with low level API options" +groups = ["default"] +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.13" +requires_python = ">=3.7" +summary = "Jupyter interactive widgets for Jupyter Notebook" +groups = ["default"] +files = [ + {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, + {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, +] diff --git a/python fig gen/pyproject.toml b/python fig gen/pyproject.toml new file mode 100644 index 0000000..9a1109a --- /dev/null +++ b/python fig gen/pyproject.toml @@ -0,0 +1,33 @@ +[project] +name = "yaeger-profiler" +version = "0.1.0" +description = "Default template for PDM package" +authors = [ + {name = "Matthew Burton", email = "19491784+matthew73210@users.noreply.github.com"}, +] +dependencies = [ + "jupyter", + "pandas", + "matplotlib", + "scipy", + "plotly>=6.0.0", +] +requires-python = ">=3.13" +readme = "README.md" +license = {text = "MIT"} + + +[tool.pdm] +distribution = false + +[[tool.pdm.source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[dependency-groups] +dev = [] + +[build-system] +requires = ["pdm-backend"] +build-backend = "pdm.backend" diff --git a/schema/YaegerV01.zip b/schema/YaegerV01.zip deleted file mode 100644 index 36c3168..0000000 Binary files a/schema/YaegerV01.zip and /dev/null differ diff --git a/src/CommandLoop.cpp b/src/CommandLoop.cpp index 9f36dc6..7c0aade 100644 --- a/src/CommandLoop.cpp +++ b/src/CommandLoop.cpp @@ -95,7 +95,7 @@ void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, // webSocket.broadcastTXT("message here"); } break; default: // send message to client - logf("msg: tp: %d, data: %s\n", type, data); + logf("unhandled message type: %d\n", type); // webSocket.sendBIN(num, payload, length); break; } diff --git a/src/main.cpp b/src/main.cpp index 07cc8a8..77061ad 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,5 +1,4 @@ -// lib for Over the Air (ota) programming #include #include #include //https://github.com/ayushsharma82/AsyncElegantOTA diff --git a/src/sensors.cpp b/src/sensors.cpp index f367262..de9840c 100644 --- a/src/sensors.cpp +++ b/src/sensors.cpp @@ -20,7 +20,7 @@ Adafruit_MAX31855 tcExhaust(MAX1CLK, MAX1CS, MAX1DO); Adafruit_MAX31855 tcBeans(MAX2CLK, MAX2CS, MAX2DO); const uint8_t kMovingAverageWindowSize = 10; -const uint8_t kSamplingWindowDuration = 100; +const uint8_t kSamplingWindowDuration = 400; MovingAverageFilter exhaustFilter(kMovingAverageWindowSize); MovingAverageFilter beansFilter(kMovingAverageWindowSize); diff --git a/src/wifi_setup.cpp b/src/wifi_setup.cpp index 3679c6b..38eaa83 100644 --- a/src/wifi_setup.cpp +++ b/src/wifi_setup.cpp @@ -1,19 +1,21 @@ +#include "WiFiType.h" +#include "esp32-hal.h" +#include "logging.h" #include #include #include #include -#include "logging.h" const char *wifiPrefsKey = "wifi"; const char *wifiSSIDKey = "ssid"; const char *wifiPassKey = "pass"; - class WiFiParams { private: String ssid = ""; String pass = ""; Preferences preferences; + public: String getSSID() { return ssid; } String getPass() { return pass; } @@ -25,8 +27,9 @@ class WiFiParams { WiFiParams params; - void setupAP() { + WiFi.mode(WIFI_AP); + delay(100); WiFi.softAP("Yaeger"); WiFi.setTxPower(WIFI_POWER_8_5dBm); } @@ -38,16 +41,18 @@ void connectToWifi() { WiFi.setTxPower(WIFI_POWER_8_5dBm); int wifiCounter = 0; while (WiFi.status() != WL_CONNECTED) { - if (WiFi.status() == WL_CONNECT_FAILED) { - log("Connect failed, restoring AP"); - setupAP(); - break; - } + if (WiFi.status() == WL_CONNECT_FAILED) { + log("Connect failed, restoring AP"); + setupAP(); + break; + } wifiCounter++; delay(1000); log("."); if (wifiCounter > 10) { - setupAP(); + WiFi.disconnect(true); + delay(100); + setupAP(); break; } } @@ -61,18 +66,18 @@ void connectToWifi() { void setupWifi() { // TODO: blink led // - - params.init(); + + params.init(); const char *hostname = "yaeger.local"; WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE, INADDR_NONE); WiFi.setHostname(hostname); if (params.hasCredentials()) { - log("trying to connect to wifi"); - connectToWifi(); + log("trying to connect to wifi"); + connectToWifi(); } else { - log("no wifi data found, setting up AP"); + log("no wifi data found, setting up AP"); setupAP(); } @@ -81,14 +86,14 @@ void setupWifi() { } } - // ---------------------------------------------------- // ------------------ WiFiParams ---------------------- // ---------------------------------------------------- // TODO: use this void WiFiParams::saveCredentials(String ssid, String pass) { - if (this->ssid == ssid && this->pass == pass) return; + if (this->ssid == ssid && this->pass == pass) + return; this->ssid = ssid; this->pass = pass;