From 72079a4eabc75347a4bfd1ec2ce7990d87e059f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Mon, 28 Sep 2026 11:29:44 +0200 Subject: [PATCH 1/2] Add action to monitor API support --- .github/catalog/models.json | 1 + .github/catalog/models/ECT02.json | 1 + .github/catalog/models/ISE03.json | 1 + .github/catalog/models/ISE05.json | 1 + .github/catalog/models/ISE06.json | 1 + .github/catalog/models/LPH27.json | 1 + .github/catalog/models/LPH31.json | 1 + .github/catalog/models/LPH32.json | 1 + .github/catalog/models/LPH33.json | 1 + .github/catalog/models/LPH37.json | 1 + .github/catalog/models/LPH60.json | 1 + .github/catalog/models/LPH61.json | 1 + .github/catalog/models/LPH62.json | 1 + .github/catalog/models/LPH63.json | 1 + .github/catalog/models/LPH64.json | 1 + .github/catalog/models/LPH65.json | 1 + .github/workflows/catalog.yml | 67 +++++++++++++++++++++++++++++++ .gitignore | 1 + 18 files changed, 84 insertions(+) create mode 100644 .github/catalog/models.json create mode 100644 .github/catalog/models/ECT02.json create mode 100644 .github/catalog/models/ISE03.json create mode 100644 .github/catalog/models/ISE05.json create mode 100644 .github/catalog/models/ISE06.json create mode 100644 .github/catalog/models/LPH27.json create mode 100644 .github/catalog/models/LPH31.json create mode 100644 .github/catalog/models/LPH32.json create mode 100644 .github/catalog/models/LPH33.json create mode 100644 .github/catalog/models/LPH37.json create mode 100644 .github/catalog/models/LPH60.json create mode 100644 .github/catalog/models/LPH61.json create mode 100644 .github/catalog/models/LPH62.json create mode 100644 .github/catalog/models/LPH63.json create mode 100644 .github/catalog/models/LPH64.json create mode 100644 .github/catalog/models/LPH65.json create mode 100644 .github/workflows/catalog.yml diff --git a/.github/catalog/models.json b/.github/catalog/models.json new file mode 100644 index 0000000..960b72a --- /dev/null +++ b/.github/catalog/models.json @@ -0,0 +1 @@ +{"ok":true,"data":{"models":[{"type":"ECT02","name":"LetPot ECT"},{"type":"ISE03","name":"LetPot ISE D1"},{"type":"ISE05","name":"LetPot ISE D2"},{"type":"ISE06","name":"LetPot ISE D3"},{"type":"LPH27","name":"LetPot LPH-SE"},{"type":"LPH31","name":"LetPot LPH-SE"},{"type":"LPH32","name":"LetPot LPH-SE"},{"type":"LPH33","name":"LetPot LPH-SE"},{"type":"LPH37","name":"LetPot LPH-SE"},{"type":"LPH60","name":"LetPot LPH-Max"},{"type":"LPH61","name":"LetPot LPH-Max"},{"type":"LPH62","name":"LetPot LPH-Max"},{"type":"LPH63","name":"LetPot LPH-Max"},{"type":"LPH64","name":"LetPot LPH-Max"},{"type":"LPH65","name":"LetPot LPH-Max"}]}} \ No newline at end of file diff --git a/.github/catalog/models/ECT02.json b/.github/catalog/models/ECT02.json new file mode 100644 index 0000000..875d387 --- /dev/null +++ b/.github/catalog/models/ECT02.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"ECT02","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"screen_switch","dataType":"boolean","mode":"rw","label":"Screen Switch"},{"key":"pump_mode","dataType":"boolean","mode":"rw","label":"Pump Mode"},{"key":"temp_mode","dataType":"enum","mode":"rw","label":"Temp Unit","options":[{"value":0,"label":"Celsius"},{"value":1,"label":"Fahrenheit"}]},{"key":"alarm_sound","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"ec_high_alarm","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"EC High Alarm"},{"key":"ec_low_alarm","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"EC Low Alarm"},{"key":"temp_high_alarm","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"Temp High Alarm"},{"key":"temp_low_alarm","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"Temp Low Alarm"},{"key":"ec_value","dataType":"number","mode":"ro","label":"EC Value"},{"key":"temp_value","dataType":"number","mode":"ro","label":"Temperature"},{"key":"pump_connected","dataType":"boolean","mode":"ro","label":"Pump Connected"},{"key":"pump_running","dataType":"boolean","mode":"ro","label":"Pump Running"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"ec_alarm","kind":"pair","dps":{"low":"ec_low_alarm","high":"ec_high_alarm"}},{"id":"temp_alarm","kind":"pair","dps":{"low":"temp_low_alarm","high":"temp_high_alarm"}}],"name":"LetPot ECT","statusCodes":[{"code":1,"severity":"error","label":"No Water (RPM)"},{"code":2,"severity":"warning","label":"EC Low"},{"code":4,"severity":"warning","label":"EC High"},{"code":8,"severity":"warning","label":"Temp Low"},{"code":16,"severity":"warning","label":"Temp High"},{"code":32,"severity":"error","label":"No Water (EC<10)"},{"code":128,"severity":"info","label":"Unknown status bit 128","description":"固件在报但位表未定义(prod 影子 22h 实测 4 次,老 api 也未定义)。占位登记消解码 warn 噪音,待固件位表确认后改名并评估 push。"}]}} \ No newline at end of file diff --git a/.github/catalog/models/ISE03.json b/.github/catalog/models/ISE03.json new file mode 100644 index 0000000..00a1e4a --- /dev/null +++ b/.github/catalog/models/ISE03.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"ISE03","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"pump_status","dataType":"boolean","mode":"ro","label":"Pump Status"},{"key":"pump_reason","dataType":"enum","mode":"ro","label":"Pump Trigger","options":[{"value":0,"label":"None"},{"value":1,"label":"Timer"},{"value":2,"label":"Other"}]},{"key":"cycle_switch","dataType":"boolean","mode":"rw","label":"Cycle Switch"},{"key":"pump_duration","dataType":"number","mode":"rw","min":0,"max":255,"step":1,"label":"Pump Duration"},{"key":"cycle_period","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"Cycle Period"},{"key":"delay_minutes","dataType":"number","mode":"rw","min":0,"max":255,"step":1,"label":"Delay Minutes"},{"key":"last_pump_reason","dataType":"number","mode":"ro","label":"Last Pump Reason"},{"key":"last_pump_ago","dataType":"number","mode":"ro","label":"Last Pump Ago (min)"},{"key":"next_pump_in","dataType":"number","mode":"ro","label":"Next Pump In (min)"},{"key":"uptime","dataType":"number","mode":"ro","label":"Uptime (min)"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[],"name":"LetPot ISE D1","statusCodes":[{"code":1,"severity":"error","label":"Tank Empty"},{"code":2,"severity":"error","label":"Pipe Blocked"},{"code":4,"severity":"warning","label":"Low Voltage"}]}} \ No newline at end of file diff --git a/.github/catalog/models/ISE05.json b/.github/catalog/models/ISE05.json new file mode 100644 index 0000000..5242f95 --- /dev/null +++ b/.github/catalog/models/ISE05.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"ISE05","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"pump_status","dataType":"boolean","mode":"ro","label":"Pump Status"},{"key":"pump_trigger","dataType":"enum","mode":"ro","label":"Pump Trigger","options":[{"value":0,"label":"Off"},{"value":1,"label":"Button"},{"value":2,"label":"APP"},{"value":3,"label":"Auto Cycle"}]},{"key":"manual_pump_minutes","dataType":"number","mode":"ro","label":"Manual Pump Time"},{"key":"remaining_seconds","dataType":"number","mode":"ro","label":"Remaining Seconds"},{"key":"cycle_switch","dataType":"boolean","mode":"rw","label":"Cycle Switch"},{"key":"cycle_period","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"Cycle Period (hours)"},{"key":"cycle_pump_minutes","dataType":"number","mode":"rw","min":1,"max":9999,"step":1,"label":"Cycle Pump Time (min)"},{"key":"cycle_water_mode","dataType":"enum","mode":"rw","label":"Cycle Water Mode","options":[{"value":0,"label":"Continuous"},{"value":1,"label":"Intermittent"}]},{"key":"intermittent_work_secs","dataType":"number","mode":"rw","min":1,"max":9999,"step":1,"label":"Work Duration (s)"},{"key":"intermittent_rest_secs","dataType":"number","mode":"rw","min":1,"max":9999,"step":1,"label":"Rest Duration (s)"},{"key":"single_pump_switch","dataType":"boolean","mode":"wo","label":"Single Pump"},{"key":"single_pump_minutes","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"Single Pump Time (min)"},{"key":"last_pump_reason","dataType":"number","mode":"ro","label":"Last Pump Reason"},{"key":"last_pump_ago","dataType":"number","mode":"ro","label":"Last Pump Ago (s)"},{"key":"next_pump_in","dataType":"number","mode":"ro","label":"Next Pump In (s)"},{"key":"pause_remaining_mins","dataType":"number","mode":"ro","label":"Pause Remaining (min)"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[],"name":"LetPot ISE D2","statusCodes":[{"code":1,"severity":"error","label":"Tank Empty"},{"code":2,"severity":"error","label":"Pipe Blocked"}]}} \ No newline at end of file diff --git a/.github/catalog/models/ISE06.json b/.github/catalog/models/ISE06.json new file mode 100644 index 0000000..3f9138d --- /dev/null +++ b/.github/catalog/models/ISE06.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"ISE06","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"pump_status","dataType":"boolean","mode":"ro","label":"Pump Status"},{"key":"pump_trigger","dataType":"enum","mode":"ro","label":"Pump Trigger","options":[{"value":0,"label":"Off"},{"value":1,"label":"Button"},{"value":2,"label":"APP"},{"value":3,"label":"Auto Cycle"}]},{"key":"manual_pump_minutes","dataType":"number","mode":"ro","label":"Manual Pump Time"},{"key":"remaining_seconds","dataType":"number","mode":"ro","label":"Remaining Seconds"},{"key":"cycle_switch","dataType":"boolean","mode":"rw","label":"Cycle Switch"},{"key":"cycle_period","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"Cycle Period (hours)"},{"key":"cycle_pump_minutes","dataType":"number","mode":"rw","min":1,"max":9999,"step":1,"label":"Cycle Pump Time (min)"},{"key":"cycle_water_mode","dataType":"enum","mode":"rw","label":"Cycle Water Mode","options":[{"value":0,"label":"Continuous"},{"value":1,"label":"Intermittent"}]},{"key":"intermittent_work_secs","dataType":"number","mode":"rw","min":1,"max":9999,"step":1,"label":"Work Duration (s)"},{"key":"intermittent_rest_secs","dataType":"number","mode":"rw","min":1,"max":9999,"step":1,"label":"Rest Duration (s)"},{"key":"single_pump_switch","dataType":"boolean","mode":"wo","label":"Single Pump"},{"key":"single_pump_minutes","dataType":"number","mode":"rw","min":0,"max":9999,"step":1,"label":"Single Pump Time (min)"},{"key":"last_pump_reason","dataType":"number","mode":"ro","label":"Last Pump Reason"},{"key":"last_pump_ago","dataType":"number","mode":"ro","label":"Last Pump Ago (s)"},{"key":"next_pump_in","dataType":"number","mode":"ro","label":"Next Pump In (s)"},{"key":"pause_remaining_mins","dataType":"number","mode":"ro","label":"Pause Remaining (min)"},{"key":"skip_water_hours","dataType":"number","mode":"wo","min":0,"max":255,"step":1,"unit":"hour","label":"Skip Watering"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[],"name":"LetPot ISE D3","statusCodes":[{"code":1,"severity":"error","label":"Tank Empty"},{"code":2,"severity":"error","label":"Pipe Blocked"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH27.json b/.github/catalog/models/LPH27.json new file mode 100644 index 0000000..3c4c732 --- /dev/null +++ b/.github/catalog/models/LPH27.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH27","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"buzzer_switch","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}}],"name":"LetPot LPH-SE","statusCodes":[{"code":1,"severity":"error","label":"Low Water / Low Nutrient"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH31.json b/.github/catalog/models/LPH31.json new file mode 100644 index 0000000..3f38092 --- /dev/null +++ b/.github/catalog/models/LPH31.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH31","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"brightness","dataType":"enum","mode":"rw","label":"Brightness","options":[{"value":1000,"label":"High"},{"value":500,"label":"Low"}]},{"key":"buzzer_switch","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"pump_status","dataType":"enum","mode":"ro","label":"Pump Status","options":[{"value":0,"label":"Resting"},{"value":1,"label":"Running"}]},{"key":"light_status","dataType":"enum","mode":"ro","label":"Light Status","options":[{"value":0,"label":"Off"},{"value":1,"label":"On"}]},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}}],"name":"LetPot LPH-SE","statusCodes":[{"code":1,"severity":"error","label":"Low Water / Low Nutrient"},{"code":2,"severity":"error","label":"Pump Fault"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH32.json b/.github/catalog/models/LPH32.json new file mode 100644 index 0000000..daee40b --- /dev/null +++ b/.github/catalog/models/LPH32.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH32","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"brightness","dataType":"enum","mode":"rw","label":"Brightness","options":[{"value":1000,"label":"High"},{"value":500,"label":"Low"}]},{"key":"buzzer_switch","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"pump_status","dataType":"enum","mode":"ro","label":"Pump Status","options":[{"value":0,"label":"Resting"},{"value":1,"label":"Running"}]},{"key":"light_status","dataType":"enum","mode":"ro","label":"Light Status","options":[{"value":0,"label":"Off"},{"value":1,"label":"On"}]},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}}],"name":"LetPot LPH-SE","statusCodes":[{"code":1,"severity":"error","label":"Low Water / Low Nutrient"},{"code":2,"severity":"error","label":"Pump Fault"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH33.json b/.github/catalog/models/LPH33.json new file mode 100644 index 0000000..817ca69 --- /dev/null +++ b/.github/catalog/models/LPH33.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH33","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"brightness","dataType":"enum","mode":"rw","label":"Brightness","options":[{"value":1000,"label":"High"},{"value":500,"label":"Low"}]},{"key":"buzzer_switch","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"pump_status","dataType":"enum","mode":"ro","label":"Pump Status","options":[{"value":0,"label":"Resting"},{"value":1,"label":"Running"}]},{"key":"light_status","dataType":"enum","mode":"ro","label":"Light Status","options":[{"value":0,"label":"Off"},{"value":1,"label":"On"}]},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}}],"name":"LetPot LPH-SE","statusCodes":[{"code":1,"severity":"error","label":"Low Water / Low Nutrient"},{"code":2,"severity":"error","label":"Pump Fault"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH37.json b/.github/catalog/models/LPH37.json new file mode 100644 index 0000000..ceba1c0 --- /dev/null +++ b/.github/catalog/models/LPH37.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH37","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"buzzer_switch","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}}],"name":"LetPot LPH-SE","statusCodes":[{"code":1,"severity":"error","label":"Low Water / Low Nutrient"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH60.json b/.github/catalog/models/LPH60.json new file mode 100644 index 0000000..abb09d4 --- /dev/null +++ b/.github/catalog/models/LPH60.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH60","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"water_mode","dataType":"enum","mode":"rw","label":"Water Mode","options":[{"value":0,"label":"Manual"},{"value":1,"label":"Auto"}]},{"key":"brightness","dataType":"number","mode":"rw","min":125,"max":1000,"step":125,"label":"Brightness"},{"key":"temp_unit","dataType":"enum","mode":"rw","label":"Temp Unit","options":[{"value":0,"label":"Fahrenheit"},{"value":1,"label":"Celsius"}]},{"key":"buzzer_switch","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"water_level","dataType":"number","mode":"ro","label":"Water Level"},{"key":"temperature","dataType":"number","mode":"ro","label":"Temperature"},{"key":"has_nutrient_function","dataType":"boolean","mode":"ro","label":"Has Nutrient Function"},{"key":"auto_water_pump_status","dataType":"number","mode":"ro","label":"Auto Water Pump"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}},{"id":"temperature","kind":"sensor","dps":{"value":"temperature","unit":"temp_unit"}}],"name":"LetPot LPH-Max","statusCodes":[{"code":1,"severity":"warning","label":"Low Nutrient"},{"code":2,"severity":"warning","label":"Low Water"},{"code":4,"severity":"error","label":"Auto Water Error"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH61.json b/.github/catalog/models/LPH61.json new file mode 100644 index 0000000..28c1665 --- /dev/null +++ b/.github/catalog/models/LPH61.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH61","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"water_mode","dataType":"enum","mode":"rw","label":"Water Mode","options":[{"value":0,"label":"Manual"},{"value":1,"label":"Auto"}]},{"key":"brightness","dataType":"number","mode":"rw","min":125,"max":1000,"step":125,"label":"Brightness"},{"key":"temp_unit","dataType":"enum","mode":"rw","label":"Temp Unit","options":[{"value":0,"label":"Fahrenheit"},{"value":1,"label":"Celsius"}]},{"key":"buzzer_switch","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"water_level","dataType":"number","mode":"ro","label":"Water Level"},{"key":"temperature","dataType":"number","mode":"ro","label":"Temperature"},{"key":"has_nutrient_function","dataType":"boolean","mode":"ro","label":"Has Nutrient Function"},{"key":"auto_water_pump_status","dataType":"number","mode":"ro","label":"Auto Water Pump"},{"key":"manual_nutrient","dataType":"boolean","mode":"wo","label":"Manual Nutrient"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}},{"id":"temperature","kind":"sensor","dps":{"value":"temperature","unit":"temp_unit"}}],"name":"LetPot LPH-Max","statusCodes":[{"code":1,"severity":"warning","label":"Low Nutrient"},{"code":2,"severity":"warning","label":"Low Water"},{"code":4,"severity":"error","label":"Auto Water Error"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH62.json b/.github/catalog/models/LPH62.json new file mode 100644 index 0000000..9b49d1d --- /dev/null +++ b/.github/catalog/models/LPH62.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH62","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"water_mode","dataType":"enum","mode":"rw","label":"Water Mode","options":[{"value":0,"label":"Manual"},{"value":1,"label":"Auto"}]},{"key":"brightness","dataType":"number","mode":"rw","min":125,"max":1000,"step":125,"label":"Brightness"},{"key":"temp_unit","dataType":"enum","mode":"rw","label":"Temp Unit","options":[{"value":0,"label":"Fahrenheit"},{"value":1,"label":"Celsius"}]},{"key":"buzzer_switch","dataType":"boolean","mode":"rw","label":"Alarm Sound"},{"key":"water_level","dataType":"number","mode":"ro","label":"Water Level"},{"key":"temperature","dataType":"number","mode":"ro","label":"Temperature"},{"key":"has_nutrient_function","dataType":"boolean","mode":"ro","label":"Has Nutrient Function"},{"key":"auto_water_pump_status","dataType":"number","mode":"ro","label":"Auto Water Pump"},{"key":"manual_nutrient","dataType":"boolean","mode":"wo","label":"Manual Nutrient"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}},{"id":"temperature","kind":"sensor","dps":{"value":"temperature","unit":"temp_unit"}}],"name":"LetPot LPH-Max","statusCodes":[{"code":1,"severity":"warning","label":"Low Nutrient"},{"code":2,"severity":"warning","label":"Low Water"},{"code":4,"severity":"error","label":"Auto Water Error"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH63.json b/.github/catalog/models/LPH63.json new file mode 100644 index 0000000..eef969d --- /dev/null +++ b/.github/catalog/models/LPH63.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH63","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"water_mode","dataType":"enum","mode":"rw","label":"Water Mode","options":[{"value":0,"label":"Manual"},{"value":1,"label":"Auto"}]},{"key":"brightness","dataType":"number","mode":"rw","min":125,"max":1000,"step":125,"label":"Brightness"},{"key":"water_level","dataType":"number","mode":"ro","min":10,"max":100,"label":"Water Level"},{"key":"temperature","dataType":"number","mode":"ro","min":0,"max":500,"label":"Temperature"},{"key":"temp_unit","dataType":"enum","mode":"ro","label":"Temperature Unit","options":[{"value":0,"label":"Fahrenheit"},{"value":1,"label":"Celsius"}]},{"key":"auto_water_pump_status","dataType":"enum","mode":"ro","label":"Auto Water Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"},{"value":2,"label":"Error"}]},{"key":"circulation_pump_status","dataType":"enum","mode":"ro","label":"Circulation Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"}]},{"key":"nutrient_pump_status","dataType":"enum","mode":"ro","label":"Nutrient Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"}]},{"key":"manual_nutrient","dataType":"boolean","mode":"wo","label":"Manual Nutrient"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}},{"id":"temperature","kind":"sensor","dps":{"value":"temperature","unit":"temp_unit"}}],"name":"LetPot LPH-Max","statusCodes":[{"code":1,"severity":"warning","label":"Low Nutrient"},{"code":2,"severity":"warning","label":"Low Water Level"},{"code":4,"severity":"error","label":"Auto Water Refill Error"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH64.json b/.github/catalog/models/LPH64.json new file mode 100644 index 0000000..c1abe9a --- /dev/null +++ b/.github/catalog/models/LPH64.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH64","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"water_mode","dataType":"enum","mode":"rw","label":"Water Mode","options":[{"value":0,"label":"Manual"},{"value":1,"label":"Auto"}]},{"key":"brightness","dataType":"number","mode":"rw","min":125,"max":1000,"step":125,"label":"Brightness"},{"key":"water_level","dataType":"number","mode":"ro","min":10,"max":100,"label":"Water Level"},{"key":"temperature","dataType":"number","mode":"ro","min":0,"max":500,"label":"Temperature"},{"key":"temp_unit","dataType":"enum","mode":"ro","label":"Temperature Unit","options":[{"value":0,"label":"Celsius"},{"value":1,"label":"Fahrenheit"}]},{"key":"auto_water_pump_status","dataType":"enum","mode":"ro","label":"Auto Water Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"},{"value":2,"label":"Error"}]},{"key":"circulation_pump_status","dataType":"enum","mode":"ro","label":"Circulation Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"}]},{"key":"nutrient_pump_status","dataType":"enum","mode":"ro","label":"Nutrient Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"},{"value":2,"label":"Not Starting"}]},{"key":"manual_nutrient","dataType":"boolean","mode":"wo","label":"Manual Nutrient"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}},{"id":"temperature","kind":"sensor","dps":{"value":"temperature","unit":"temp_unit"}}],"name":"LetPot LPH-Max","statusCodes":[{"code":1,"severity":"warning","label":"Low Nutrient"},{"code":2,"severity":"warning","label":"Low Water Level"},{"code":4,"severity":"error","label":"Auto Water Refill Error"}]}} \ No newline at end of file diff --git a/.github/catalog/models/LPH65.json b/.github/catalog/models/LPH65.json new file mode 100644 index 0000000..e8194a1 --- /dev/null +++ b/.github/catalog/models/LPH65.json @@ -0,0 +1 @@ +{"ok":true,"data":{"type":"LPH65","catalogVersion":"0.3.0","dataPoints":[{"key":"network_status","dataType":"number","mode":"ro","label":"Network Status"},{"key":"system_status","dataType":"number","mode":"ro","label":"System Status"},{"key":"main_switch","dataType":"boolean","mode":"rw","label":"Power Switch"},{"key":"pump_switch","dataType":"boolean","mode":"rw","label":"Pump Switch"},{"key":"light_mode","dataType":"enum","mode":"rw","label":"Light Mode","options":[{"value":0,"label":"Fruiting"},{"value":1,"label":"Leafy Greens"}]},{"key":"planting_days","dataType":"number","mode":"rw","min":0,"max":999,"step":1,"label":"Planting Days"},{"key":"light_on_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light On Hour"},{"key":"light_on_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light On Minute"},{"key":"light_off_hour","dataType":"number","mode":"rw","min":0,"max":23,"step":1,"label":"Light Off Hour"},{"key":"light_off_minute","dataType":"number","mode":"rw","min":0,"max":59,"step":1,"label":"Light Off Minute"},{"key":"water_mode","dataType":"enum","mode":"rw","label":"Water Mode","options":[{"value":0,"label":"Manual"},{"value":1,"label":"Auto"}]},{"key":"brightness","dataType":"number","mode":"rw","min":125,"max":1000,"step":125,"label":"Brightness"},{"key":"water_level","dataType":"number","mode":"ro","min":10,"max":100,"label":"Water Level"},{"key":"temperature","dataType":"number","mode":"ro","min":0,"max":500,"label":"Temperature"},{"key":"temp_unit","dataType":"enum","mode":"ro","label":"Temperature Unit","options":[{"value":0,"label":"Celsius"},{"value":1,"label":"Fahrenheit"}]},{"key":"auto_water_pump_status","dataType":"enum","mode":"ro","label":"Auto Water Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"},{"value":2,"label":"Error"}]},{"key":"circulation_pump_status","dataType":"enum","mode":"ro","label":"Circulation Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"}]},{"key":"nutrient_pump_status","dataType":"enum","mode":"ro","label":"Nutrient Pump","options":[{"value":0,"label":"Off"},{"value":1,"label":"Running"},{"value":2,"label":"Not Starting"}]},{"key":"manual_nutrient","dataType":"boolean","mode":"wo","label":"Manual Nutrient"},{"key":"command_result","dataType":"number","mode":"ro","label":"Command Result"}],"components":[{"id":"light_schedule","kind":"schedule","dps":{"onHour":"light_on_hour","onMinute":"light_on_minute","offHour":"light_off_hour","offMinute":"light_off_minute"}},{"id":"temperature","kind":"sensor","dps":{"value":"temperature","unit":"temp_unit"}}],"name":"LetPot LPH-Max","statusCodes":[{"code":1,"severity":"warning","label":"Low Nutrient"},{"code":2,"severity":"warning","label":"Low Water Level"},{"code":4,"severity":"error","label":"Auto Water Refill Error"}]}} \ No newline at end of file diff --git a/.github/workflows/catalog.yml b/.github/workflows/catalog.yml new file mode 100644 index 0000000..02c659d --- /dev/null +++ b/.github/workflows/catalog.yml @@ -0,0 +1,67 @@ +--- +name: Catalog check + +on: + schedule: + # Every Sunday at 12:00 UTC, on the default branch + - cron: "0 12 * * 7" + workflow_dispatch: + +permissions: {} + +jobs: + catalog-check: + runs-on: ubuntu-latest + outputs: + models: ${{ steps.model_matrix.outputs.models }} + steps: + - name: Check out repository catalog + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + sparse-checkout: | + .github/catalog + - name: Get supported models + id: supported_models + run: | + echo "response=$(curl --silent https://open.letpot.net/v1/models)" >> $GITHUB_OUTPUT + - name: Check supported models match stored + env: + json: ${{ steps.supported_models.outputs.response }} + run: | + existing=$(cat .github/catalog/models.json) + test "$json" == "$existing" + - name: Make model matrix + id: model_matrix + if: always() # Always run to prevent parsing error on loop + env: + json: ${{ steps.supported_models.outputs.response }} + run: | + types='[]' + + if [[ -n "$json" && "$json" != "null" ]]; then + types=$(jq -c '[.data.models[]?.type]' <<< "$json") + fi + + echo "models=$types" >> "$GITHUB_OUTPUT" + + catalog-loop: + runs-on: ubuntu-latest + needs: [catalog-check] + strategy: + matrix: + type: ${{ fromJSON(needs.catalog-check.outputs.models) }} + steps: + - name: Check out repository catalog + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + sparse-checkout: | + .github/catalog + - name: Check content matches support + env: + model: ${{ matrix.type }} + run: | + existing=$(cat ".github/catalog/models/$model.json") + response=$(curl --silent "https://open.letpot.net/v1/models/$model") + test "$response" == "$existing" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3da4a21..21faefc 100644 --- a/.gitignore +++ b/.gitignore @@ -167,4 +167,5 @@ cython_debug/ # option (not recommended) you can uncomment the following to ignore the entire idea folder. #.idea/ +.DS_Store scratchpad.py \ No newline at end of file From ef834573fcfebf5ab56c3e36b59cc2bbc4416d45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joris=20Pelgr=C3=B6m?= Date: Mon, 28 Sep 2026 11:37:38 +0200 Subject: [PATCH 2/2] Different cron syntax for GitHub Actions --- .github/workflows/catalog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/catalog.yml b/.github/workflows/catalog.yml index 02c659d..09d5641 100644 --- a/.github/workflows/catalog.yml +++ b/.github/workflows/catalog.yml @@ -4,7 +4,7 @@ name: Catalog check on: schedule: # Every Sunday at 12:00 UTC, on the default branch - - cron: "0 12 * * 7" + - cron: "0 12 * * 0" workflow_dispatch: permissions: {}