Initial commit - Support for Get Hydrometer and Get Fermentation Chamber

This commit is contained in:
2025-10-09 16:27:33 +02:00
commit df1be4c144
27 changed files with 1794 additions and 0 deletions

View File

@@ -0,0 +1,384 @@
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"serialNumber": "string",
"macAddress": "string",
"deviceType": "FermentationChamber",
"active": true,
"disabled": true,
"username": "string",
"connectionState": "string",
"status": "string",
"error": "string",
"lastActivityTime": "2025-10-09T11:56:29.302Z",
"rssi": 0,
"firmwareVersion": "string",
"isLatestFirmware": true,
"activeProfileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"activeProfileStepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"activeProfileSession": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"public": true,
"profileName": "string",
"rating": 0,
"ratingCount": 0,
"ratingScore": 0,
"copyCount": 0,
"viewCount": 0,
"profileTypeId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"steps": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"order": 0,
"controlType": "Target",
"endType": "Duration",
"durationType": "Start",
"operator": "Equals",
"length": 0,
"temperature": 0,
"minTemperature": 0,
"maxTemperature": 0,
"gravity": 0,
"pumpEnabled": true,
"pumpUtilisation": 0,
"heatingUtilisation": 0,
"pidEnabled": true,
"sensorDifferential": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"length": 0,
"profileStepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
]
}
],
"profileSessions": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "string",
"brewZillaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"fermentationChamberId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"hydrometerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"stillId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"temperatureControllerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"startDate": "2025-10-09T11:56:29.302Z",
"endDate": "2025-10-09T11:56:29.302Z",
"originalGravity": 0,
"finalGravity": 0,
"yeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"yeast": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"productId": "string",
"laboratory": "string",
"supplier": "string",
"keglandProductCode": "string",
"type": "string",
"form": "string",
"minTemperature": 0,
"maxTemperature": 0,
"flocculation": "string",
"attenuation": 0,
"notes": "string",
"bestFor": "string",
"maxReuse": 0,
"addToSecondary": true,
"amountType": "Weight",
"inventoryAmount": 0,
"archived": true,
"stockLevel": 0,
"globalYeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"isGlobal": true
},
"sentAlerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
]
}
]
},
"brewZillaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"fermentationChamberId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"hydrometerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"stillId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"temperatureControllerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"startDate": "2025-10-09T11:56:29.302Z",
"endDate": "2025-10-09T11:56:29.302Z",
"originalGravity": 0,
"finalGravity": 0,
"yeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"yeast": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"productId": "string",
"laboratory": "string",
"supplier": "string",
"keglandProductCode": "string",
"type": "string",
"form": "string",
"minTemperature": 0,
"maxTemperature": 0,
"flocculation": "string",
"attenuation": 0,
"notes": "string",
"bestFor": "string",
"maxReuse": 0,
"addToSecondary": true,
"amountType": "Weight",
"inventoryAmount": 0,
"archived": true,
"stockLevel": 0,
"globalYeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"isGlobal": true
},
"sentAlerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"estimatedEndDate": "2025-10-09T11:56:29.302Z",
"profileLength": 0,
"currentProfileTime": 0,
"remainingProfileTime": 0
},
"profileSessions": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "string",
"brewZillaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"fermentationChamberId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"hydrometerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"stillId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"temperatureControllerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"startDate": "2025-10-09T11:56:29.302Z",
"endDate": "2025-10-09T11:56:29.302Z",
"originalGravity": 0,
"finalGravity": 0,
"yeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"yeast": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"productId": "string",
"laboratory": "string",
"supplier": "string",
"keglandProductCode": "string",
"type": "string",
"form": "string",
"minTemperature": 0,
"maxTemperature": 0,
"flocculation": "string",
"attenuation": 0,
"notes": "string",
"bestFor": "string",
"maxReuse": 0,
"addToSecondary": true,
"amountType": "Weight",
"inventoryAmount": 0,
"archived": true,
"stockLevel": 0,
"globalYeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"isGlobal": true
},
"sentAlerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:56:29.302Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:56:29.302Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
]
}
],
"betaUpdates": true,
"bluetoothEnabled": true,
"graphZoomLevel": 0,
"temperature": 0,
"targetTemperature": 0,
"minTargetTemperature": 0,
"maxTargetTemperature": 0,
"totalRunTime": 0,
"coolingEnabled": true,
"coolingRunTime": 0,
"coolingStarts": 0,
"heatingEnabled": true,
"heatingRunTime": 0,
"heatingStarts": 0,
"heatingUtilisation": 0,
"highTempAlarm": 0,
"lowTempAlarm": 0,
"ntcBeta": 0,
"ntcRefResistance": 0,
"ntcRefTemperature": 0,
"pidCycleTime": 0,
"pidEnabled": true,
"pidProportional": 0,
"pidIntegral": 0,
"pidDerivative": 0,
"sensorDifferential": 0,
"sensorTimeout": 0,
"showGraph": true,
"soundsEnabled": true,
"tempUnit": "string",
"useInternalSensor": true,
"controlDeviceType": "string",
"controlDeviceMacAddress": "string",
"controlDeviceTemperature": 0,
"customerUse": "string",
"telemetryFrequency": 14440,
"compressorDelay": 10,
"modeSwitchDelay": 30,
"coolingHysteresis": 10,
"heatingHysteresis": 10,
"telemetry": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"rowKey": "string",
"createdOn": "2025-10-09T11:56:29.302Z",
"macAddress": "string",
"rssi": 0,
"controlDeviceType": "string",
"controlDeviceMacAddress": "string",
"controlDeviceTemperature": 0,
"temperature": 0,
"targetTemperature": 0,
"minTargetTemperature": 0,
"maxTargetTemperature": 0,
"totalRunTime": 0,
"compressorRunTime": 0,
"compressorStarts": 0,
"heatingRunTime": 0,
"heatingStarts": 0,
"auxillaryRunTime": 0,
"auxillaryStarts": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profileStepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profileSessionStartDate": "2025-10-09T11:56:29.302Z",
"profileSessionTime": 0,
"profileStepProgress": 0
}
],
"compressorRunTime": 0,
"compressorStarts": 0,
"auxillaryRunTime": 0,
"auxillaryStarts": 0,
"fanEnabled": true,
"lightEnabled": "AlwaysOn"
}

View File

@@ -0,0 +1,28 @@
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"rowKey": "string",
"createdOn": "2025-10-09T09:29:04.638Z",
"macAddress": "string",
"rssi": 0,
"controlDeviceType": "string",
"controlDeviceMacAddress": "string",
"controlDeviceTemperature": 0,
"temperature": 0,
"targetTemperature": 0,
"minTargetTemperature": 0,
"maxTargetTemperature": 0,
"totalRunTime": 0,
"compressorRunTime": 0,
"compressorStarts": 0,
"heatingRunTime": 0,
"heatingStarts": 0,
"auxillaryRunTime": 0,
"auxillaryStarts": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profileStepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profileSessionStartDate": "2025-10-09T09:29:04.638Z",
"profileSessionTime": 0,
"profileStepProgress": 0
}
]

View File

@@ -0,0 +1,386 @@
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"serialNumber": "string",
"macAddress": "string",
"deviceType": "FermentationChamber",
"active": true,
"disabled": true,
"username": "string",
"connectionState": "string",
"status": "string",
"error": "string",
"lastActivityTime": "2025-10-09T11:13:05.885Z",
"rssi": 0,
"firmwareVersion": "string",
"isLatestFirmware": true,
"activeProfileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"activeProfileStepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"activeProfileSession": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"public": true,
"profileName": "string",
"rating": 0,
"ratingCount": 0,
"ratingScore": 0,
"copyCount": 0,
"viewCount": 0,
"profileTypeId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"steps": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"order": 0,
"controlType": "Target",
"endType": "Duration",
"durationType": "Start",
"operator": "Equals",
"length": 0,
"temperature": 0,
"minTemperature": 0,
"maxTemperature": 0,
"gravity": 0,
"pumpEnabled": true,
"pumpUtilisation": 0,
"heatingUtilisation": 0,
"pidEnabled": true,
"sensorDifferential": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"length": 0,
"profileStepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
]
}
],
"profileSessions": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "string",
"brewZillaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"fermentationChamberId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"hydrometerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"stillId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"temperatureControllerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"startDate": "2025-10-09T11:13:05.885Z",
"endDate": "2025-10-09T11:13:05.885Z",
"originalGravity": 0,
"finalGravity": 0,
"yeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"yeast": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"productId": "string",
"laboratory": "string",
"supplier": "string",
"keglandProductCode": "string",
"type": "string",
"form": "string",
"minTemperature": 0,
"maxTemperature": 0,
"flocculation": "string",
"attenuation": 0,
"notes": "string",
"bestFor": "string",
"maxReuse": 0,
"addToSecondary": true,
"amountType": "Weight",
"inventoryAmount": 0,
"archived": true,
"stockLevel": 0,
"globalYeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"isGlobal": true
},
"sentAlerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
]
}
]
},
"brewZillaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"fermentationChamberId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"hydrometerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"stillId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"temperatureControllerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"startDate": "2025-10-09T11:13:05.885Z",
"endDate": "2025-10-09T11:13:05.885Z",
"originalGravity": 0,
"finalGravity": 0,
"yeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"yeast": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"productId": "string",
"laboratory": "string",
"supplier": "string",
"keglandProductCode": "string",
"type": "string",
"form": "string",
"minTemperature": 0,
"maxTemperature": 0,
"flocculation": "string",
"attenuation": 0,
"notes": "string",
"bestFor": "string",
"maxReuse": 0,
"addToSecondary": true,
"amountType": "Weight",
"inventoryAmount": 0,
"archived": true,
"stockLevel": 0,
"globalYeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"isGlobal": true
},
"sentAlerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
],
"estimatedEndDate": "2025-10-09T11:13:05.885Z",
"profileLength": 0,
"currentProfileTime": 0,
"remainingProfileTime": 0
},
"profileSessions": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"description": "string",
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profile": "string",
"brewZillaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"fermentationChamberId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"hydrometerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"stillId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"temperatureControllerId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"startDate": "2025-10-09T11:13:05.885Z",
"endDate": "2025-10-09T11:13:05.885Z",
"originalGravity": 0,
"finalGravity": 0,
"yeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"yeast": {
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "string",
"productId": "string",
"laboratory": "string",
"supplier": "string",
"keglandProductCode": "string",
"type": "string",
"form": "string",
"minTemperature": 0,
"maxTemperature": 0,
"flocculation": "string",
"attenuation": 0,
"notes": "string",
"bestFor": "string",
"maxReuse": 0,
"addToSecondary": true,
"amountType": "Weight",
"inventoryAmount": 0,
"archived": true,
"stockLevel": 0,
"globalYeastId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"isGlobal": true
},
"sentAlerts": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"deleted": true,
"createdOn": "2025-10-09T11:13:05.885Z",
"createdBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"modifiedOn": "2025-10-09T11:13:05.885Z",
"modifiedBy": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"alertText": "string",
"trigger": "StepStart",
"operator": "Equals",
"temperature": 0,
"gravity": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
]
}
],
"betaUpdates": true,
"bluetoothEnabled": true,
"graphZoomLevel": 0,
"temperature": 0,
"targetTemperature": 0,
"minTargetTemperature": 0,
"maxTargetTemperature": 0,
"totalRunTime": 0,
"coolingEnabled": true,
"coolingRunTime": 0,
"coolingStarts": 0,
"heatingEnabled": true,
"heatingRunTime": 0,
"heatingStarts": 0,
"heatingUtilisation": 0,
"highTempAlarm": 0,
"lowTempAlarm": 0,
"ntcBeta": 0,
"ntcRefResistance": 0,
"ntcRefTemperature": 0,
"pidCycleTime": 0,
"pidEnabled": true,
"pidProportional": 0,
"pidIntegral": 0,
"pidDerivative": 0,
"sensorDifferential": 0,
"sensorTimeout": 0,
"showGraph": true,
"soundsEnabled": true,
"tempUnit": "string",
"useInternalSensor": true,
"controlDeviceType": "string",
"controlDeviceMacAddress": "string",
"controlDeviceTemperature": 0,
"customerUse": "string",
"telemetryFrequency": 14440,
"compressorDelay": 10,
"modeSwitchDelay": 30,
"coolingHysteresis": 10,
"heatingHysteresis": 10,
"telemetry": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"rowKey": "string",
"createdOn": "2025-10-09T11:13:05.885Z",
"macAddress": "string",
"rssi": 0,
"controlDeviceType": "string",
"controlDeviceMacAddress": "string",
"controlDeviceTemperature": 0,
"temperature": 0,
"targetTemperature": 0,
"minTargetTemperature": 0,
"maxTargetTemperature": 0,
"totalRunTime": 0,
"compressorRunTime": 0,
"compressorStarts": 0,
"heatingRunTime": 0,
"heatingStarts": 0,
"auxillaryRunTime": 0,
"auxillaryStarts": 0,
"profileId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profileStepId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"profileSessionStartDate": "2025-10-09T11:13:05.885Z",
"profileSessionTime": 0,
"profileStepProgress": 0
}
],
"compressorRunTime": 0,
"compressorStarts": 0,
"auxillaryRunTime": 0,
"auxillaryStarts": 0,
"fanEnabled": true,
"lightEnabled": "AlwaysOn"
}
]

View File

@@ -0,0 +1,35 @@
{
"telemetry": [
{
"temperature": 17.5625,
"gravity": 1325.07,
"gravityVelocity": 0,
"battery": 0,
"version": "20250319_055542_b3788ba",
"id": "68423584-1a35-4341-b67c-78456f4ae9f3",
"rowKey": "2516424593326678442",
"createdOn": "2025-10-07T12:51:07.3321557+00:00",
"macAddress": "ac-15-18-df-84-94",
"rssi": -56
}
],
"temperature": 17.5625,
"gravity": 1325.07,
"gravityVelocity": 0,
"battery": 0,
"name": "Hegnsgården Yellow",
"macAddress": "ac-15-18-df-84-94",
"deviceType": "Hydrometer",
"active": false,
"disabled": false,
"lastActivityTime": "2025-10-07T12:51:07.3321557+00:00",
"rssi": -56,
"firmwareVersion": "20250319_055542_b3788ba",
"isLatestFirmware": true,
"modifiedOn": "2025-10-07T12:51:07.3603727+00:00",
"modifiedBy": "00000000-0000-0000-0000-000000000000",
"id": "2aa3b02c-78de-4715-8f5b-61bf7c3d1b62",
"deleted": false,
"createdOn": "2025-10-07T09:44:01.1515163+00:00",
"createdBy": "475ebc33-8e90-4be5-2424-08ddfbe49482"
}

View File

@@ -0,0 +1,14 @@
[
{
"temperature": 17.5625,
"gravity": 1325.07,
"gravityVelocity": 0,
"battery": 0,
"version": "20250319_055542_b3788ba",
"id": "50d5885c-b637-4343-bb47-cc76e9f3c0c1",
"rowKey": "2516424593326678442",
"createdOn": "2025-10-07T12:51:07.3321557+00:00",
"macAddress": "ac-15-18-df-84-94",
"rssi": -56
}
]

View File

@@ -0,0 +1,37 @@
[
{
"telemetry": [
{
"temperature": 17.5625,
"gravity": 1325.07,
"gravityVelocity": 0,
"battery": 0,
"version": "20250319_055542_b3788ba",
"id": "55462886-4400-4608-b283-3ce4426dafd3",
"rowKey": "2516424593326678442",
"createdOn": "2025-10-07T12:51:07.3321557+00:00",
"macAddress": "ac-15-18-df-84-94",
"rssi": -56
}
],
"temperature": 17.5625,
"gravity": 1325.07,
"gravityVelocity": 0,
"battery": 0,
"name": "Hegnsgården Yellow",
"macAddress": "ac-15-18-df-84-94",
"deviceType": "Hydrometer",
"active": false,
"disabled": false,
"lastActivityTime": "2025-10-07T12:51:07.3321557+00:00",
"rssi": -56,
"firmwareVersion": "20250319_055542_b3788ba",
"isLatestFirmware": false,
"modifiedOn": "2025-10-07T12:51:07.3603727+00:00",
"modifiedBy": "00000000-0000-0000-0000-000000000000",
"id": "2aa3b02c-78de-4715-8f5b-61bf7c3d1b62",
"deleted": false,
"createdOn": "2025-10-07T09:44:01.1515163+00:00",
"createdBy": "475ebc33-8e90-4be5-2424-08ddfbe49482"
}
]

View File

@@ -0,0 +1,6 @@
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IkYzM0E0QzYzNkZFOUE3RjBFNzVGQkRBQTQ1REIwOTdBQjUxRUVGMTlSUzI1NiIsIng1dCI6Ijh6cE1ZMl9wcF9Eblg3MnFSZHNKZXJVZTd4ayIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL2lkLnJhcHQuaW8iLCJuYmYiOjE3NTk5MjcyMjQsImlhdCI6MTc1OTkyNzIyNCwiZXhwIjoxNzU5OTMwODI0LCJhdWQiOiJyYXB0LWFwaSIsInNjb3BlIjpbIm9wZW5pZCIsInByb2ZpbGUiLCJyYXB0LWFwaSIsInJhcHQtYXBpLnB1YmxpYyJdLCJhbXIiOlsiY3VzdG9tIl0sImNsaWVudF9pZCI6InJhcHQtdXNlciIsInN1YiI6IjQ3NWViYzMzLThlOTAtNGJlNS0yNDI0LTA4ZGRmYmU0OTQ4MiIsImF1dGhfdGltZSI6MTc1OTkyNzIyNCwiaWRwIjoibG9jYWwiLCJmaXJzdG5hbWUiOiJKZXNwZXIiLCJsYXN0bmFtZSI6IkZ1c3NpbmcgTVx1MDBGOHJrIiwiY291bnRyeSI6IkRlbm1hcmsiLCJlbWFpbCI6ImpmbUBtb2Vya3MuZGsiLCJwcm9maWxlbmFtZSI6ImpmbSIsImVtYWlsY29uZmlybWVkIjoiZmFsc2UiLCJqdGkiOiI3RDM3QjcxMDNBMTc4QkQ0RkMwM0ZCRDNGNTBFMDY2MiJ9.HJtC6Cfps5rqsukMYFRi7S4awpz0KqJjSX1EdL1K6NMpxVEmqmiiA3LwXrsjCbu2FoLjswxyM7rCFqVBZnnQ71DcQJ9gJCe1Ddonj-l5SfA90KHjlvLPQOhvCLrYHc9ulDEi64Dz-WfH8V7WCy1fgl3lY8xmRstS8rjO-5jVwQFFlZvyOHoke09iMsRQmCyuiGYbqmn1i31VSK6L3fMuRfrc1o165T1Xts66vAupJ6nqEhHnAusvCM2gagEvAiXx3hH3xxid4K6zCQLvbg0jxKUHnKI9q2xVj30bW0C2_lKSDKpOOTLjWpjrwjVag5DYxYFggNVgTvF90f_hYddxFX8s9_dgY6EbTunSA1ki86r82Rw7Ebvfwy1phjNHllgu85Y73tIYADcQYxzjglNKPX1Dzed8liUOAXTHgL2Z9-4_q8bwmgNrGy9eH4K_PjyqEuuhDvy2GQxjhOojOXJOU-aSaE4KwaHTod1CZB-kaikMAKjsHDTi3cRspFU4sli665zgPZ2UKYsjTWSlqoKpA7wO3RrMKQiCrNEqyE0ldOi1ctCS-dBEBkuhc-THTwOqMDQTQ6Iqqk1dK72Nm8uB5TwPur-TP4YYxi1hY6w0jSOs0JzUVpaMGgAXg3CM_zhWgTE9S44R3gjxX6EsXayI5f5WtstxpHMbB3rO_DrZPjA",
"expires_in": 3600,
"token_type": "Bearer",
"scope": "openid profile rapt-api rapt-api.public"
}

View File

@@ -0,0 +1,83 @@
import pytest
import json
import responses
from rapt.client import Client
from rapt.fermentation_chamber import FermentationChamber
@pytest.fixture
def client():
yield Client("test", "test")
@responses.activate
def test_get_fermentation_chambers(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.get("https://api.rapt.io/api/fermentationchambers/getfermentationchambers", json=json_reader("./tests/json/get_fermentation_chambers_response.json"))
fermentation_chamber = FermentationChamber(client)
ferms = fermentation_chamber.get_fermentation_chambers()
assert ferms is not None
assert len(ferms) == 1
@responses.activate
def test_get_fermentation_chambers_500(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.add(
responses.GET,
"https://api.rapt.io/api/fermentationchambers/getfermentationchambers",
status=500,
)
fermentation_chamber = FermentationChamber(client)
ferms = fermentation_chamber.get_fermentation_chambers()
assert ferms is None
@responses.activate
def test_get_fermentation_chamber(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.get("https://api.rapt.io/api/fermentationchambers/getfermentationchamber", json=json_reader("./tests/json/get_fermentation_chamber_response.json"))
fermentation_chamber = FermentationChamber(client)
ferms = fermentation_chamber.get_fermentation_chamber("")
assert ferms is not None
@responses.activate
def test_get_fermentation_chamber_500(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.add(
responses.GET,
"https://api.rapt.io/api/fermentationchambers/getfermentationchamber",
status=500,
)
fermentation_chamber = FermentationChamber(client)
ferms = fermentation_chamber.get_fermentation_chamber("")
assert ferms is None
@responses.activate
def test_get_telemetry(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.get("https://api.rapt.io/api/fermentationchambers/gettelemetry", json=json_reader("./tests/json/get_fermentation_chamber_telemetry_response.json"))
fermentation_chamber = FermentationChamber(client)
telemetry = fermentation_chamber.get_telemetry("", "", "", "")
assert telemetry is not None
assert len(telemetry) == 1
@responses.activate
def test_get_telemetry_500(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.add(
responses.GET,
"https://api.rapt.io/api/fermentationchambers/gettelemetry",
status=500,
)
fermentation_chamber = FermentationChamber(client)
telemetry = fermentation_chamber.get_telemetry("", "", "", "")
assert telemetry is None
def json_reader(path):
with open(path) as f:
return json.load(f)

83
tests/test_hydrometer.py Normal file
View File

@@ -0,0 +1,83 @@
import pytest
import json
import responses
from rapt.client import Client
from rapt.hydrometer import Hydrometer
@pytest.fixture
def client():
yield Client("test", "test")
@responses.activate
def test_get_hydrometers(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.get("https://api.rapt.io/api/hydrometers/gethydrometers", json=json_reader("./tests/json/get_hydrometers_response.json"))
hydrometer = Hydrometer(client)
hydros = hydrometer.get_hydrometers()
assert hydros is not None
assert len(hydros) == 1
@responses.activate
def test_get_hydrometers_500(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.add(
responses.GET,
"https://api.rapt.io/api/hydrometers/gethydrometers",
status=500,
)
hydrometer = Hydrometer(client)
hydros = hydrometer.get_hydrometers()
assert hydros is None
@responses.activate
def test_get_hydrometer(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.get("https://api.rapt.io/api/hydrometers/gethydrometer", json=json_reader("./tests/json/get_hydrometer_response.json"))
hydrometer = Hydrometer(client)
hydros = hydrometer.get_hydrometer("")
assert hydros is not None
@responses.activate
def test_get_hydrometer_500(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.add(
responses.GET,
"https://api.rapt.io/api/hydrometers/gethydrometer",
status=500,
)
hydrometer = Hydrometer(client)
hydros = hydrometer.get_hydrometer("")
assert hydros is None
@responses.activate
def test_get_telemetry(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.get("https://api.rapt.io/api/hydrometers/gettelemetry", json=json_reader("./tests/json/get_hydrometer_telemetry_response.json"))
hydrometer = Hydrometer(client)
telemetry = hydrometer.get_telemetry("", "", "", "")
assert telemetry is not None
@responses.activate
def test_get_telemetry_500(client):
responses.post("https://id.rapt.io/connect/token", json=json_reader("./tests/json/token_response.json"))
responses.add(
responses.GET,
"https://api.rapt.io/api/hydrometers/gettelemetry",
status=500,
)
hydrometer = Hydrometer(client)
telemetry = hydrometer.get_telemetry("", "", "", "")
assert telemetry is None
def json_reader(path):
with open(path) as f:
return json.load(f)