-
Notifications
You must be signed in to change notification settings - Fork 2
Track pump activity #8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
| @@ -0,0 +1,126 @@ | ||||||
| """ | ||||||
| Pump Activity Tracker for GrowMax | ||||||
| Tracks pump dosing events and provides data for API reporting | ||||||
| """ | ||||||
|
|
||||||
| import utime | ||||||
|
|
||||||
|
|
||||||
| class PumpActivity: | ||||||
| """Represents a single pump activity event""" | ||||||
|
|
||||||
| def __init__(self, position, speed, duration, timestamp=None): | ||||||
| self.position = position # 1-8 | ||||||
| self.speed = speed # 0.0 - 1.0 | ||||||
| self.duration = duration # seconds | ||||||
| self.timestamp = timestamp or utime.time() | ||||||
| self.enabled = True | ||||||
| self.description = f"Pump {position} dose at {speed*100:.0f}% for {duration}s" | ||||||
|
|
||||||
|
|
||||||
| class PumpTracker: | ||||||
| """Tracks pump activities for reporting to OpenSensor API""" | ||||||
|
|
||||||
| def __init__(self, max_activities=50): | ||||||
| self.activities = [] | ||||||
| self.max_activities = max_activities | ||||||
| self.current_session_activities = [] | ||||||
|
|
||||||
| def record_pump_activity(self, position, speed, duration): | ||||||
| """Record a pump dosing event""" | ||||||
| activity = PumpActivity(position, speed, duration) | ||||||
|
|
||||||
| # Add to current session (for immediate reporting) | ||||||
| self.current_session_activities.append(activity) | ||||||
|
|
||||||
| # Add to historical activities | ||||||
| self.activities.append(activity) | ||||||
|
|
||||||
| # Keep only the most recent activities | ||||||
| if len(self.activities) > self.max_activities: | ||||||
| self.activities = self.activities[-self.max_activities:] | ||||||
|
|
||||||
| print(f"Recorded pump activity: {activity.description}") | ||||||
|
|
||||||
| def get_session_activities(self): | ||||||
| """Get activities from current session for API reporting""" | ||||||
| activities_data = [] | ||||||
|
|
||||||
| for activity in self.current_session_activities: | ||||||
| activities_data.append({ | ||||||
| "position": activity.position, | ||||||
| "enabled": activity.enabled, | ||||||
| "speed": activity.speed, | ||||||
| "duration": activity.duration, | ||||||
| "timestamp": activity.timestamp, | ||||||
| "description": activity.description | ||||||
| }) | ||||||
|
|
||||||
| return activities_data | ||||||
|
|
||||||
| def clear_session_activities(self): | ||||||
| """Clear current session activities after successful API report""" | ||||||
| self.current_session_activities.clear() | ||||||
|
|
||||||
| def get_recent_activities(self, minutes=60): | ||||||
| """Get activities from the last N minutes""" | ||||||
| cutoff_time = utime.time() - (minutes * 60) | ||||||
| recent_activities = [] | ||||||
|
|
||||||
| for activity in self.activities: | ||||||
| if activity.timestamp >= cutoff_time: | ||||||
| recent_activities.append({ | ||||||
| "position": activity.position, | ||||||
| "enabled": activity.enabled, | ||||||
| "speed": activity.speed, | ||||||
| "duration": activity.duration, | ||||||
| "timestamp": activity.timestamp, | ||||||
| "description": activity.description | ||||||
| }) | ||||||
|
|
||||||
| return recent_activities | ||||||
|
|
||||||
| def get_pump_statistics(self): | ||||||
| """Get pump usage statistics""" | ||||||
| stats = { | ||||||
| "total_activities": len(self.activities), | ||||||
| "session_activities": len(self.current_session_activities), | ||||||
| "pump_usage": {} | ||||||
| } | ||||||
|
|
||||||
| # Calculate per-pump statistics | ||||||
| for position in range(1, 9): # Pumps 1-8 | ||||||
|
||||||
| for position in range(1, 9): # Pumps 1-8 | |
| for position in range(1, NUM_PUMPS + 1): # Iterate over all pumps |
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -8,6 +8,7 @@ | |||||
| from growmax.pump import Pump | ||||||
| from growmax.utils import api | ||||||
| from growmax.utils.configs import get_config_value, get_moisture_threshold_for_position | ||||||
| from growmax.pump_tracker import get_pump_activities_for_api, clear_reported_activities | ||||||
| from growmax.utils.displays import boot_sequence, display_basic_stats, display_ph_reading, display_scd4x_reading | ||||||
| from growmax.utils.mcu import get_gpio_for_mcu | ||||||
| from growmax.utils.relays import initialize_relay_board | ||||||
|
|
@@ -113,18 +114,38 @@ def main(): | |||||
| report_data["pH"] = { | ||||||
| "pH": ph_reading | ||||||
| } | ||||||
|
|
||||||
| # Collect pump activities for reporting | ||||||
| pump_activities = get_pump_activities_for_api() | ||||||
| relay_activities = [] | ||||||
|
|
||||||
| # Add pump activities as "pumps" data | ||||||
| if pump_activities: | ||||||
| report_data["pumps"] = { | ||||||
| "pumps": pump_activities | ||||||
| } | ||||||
|
|
||||||
| # Add relay activities (auto-refill) | ||||||
| if relay_refilled: | ||||||
| relay_activities.append({ | ||||||
| "position": relay_water_position, | ||||||
| "enabled": True, | ||||||
| "seconds": relay_refill_duration, | ||||||
| "description": "Auto refill water reservoir" | ||||||
| }) | ||||||
|
|
||||||
| if relay_activities: | ||||||
| report_data["relays"] = { | ||||||
| "relays": [ | ||||||
| { | ||||||
| "position": relay_water_position, | ||||||
| "enabled": True, | ||||||
| "seconds": relay_refill_duration, | ||||||
| "description": "Auto refill water reservoir" | ||||||
| } | ||||||
| ] | ||||||
| "relays": relay_activities | ||||||
| } | ||||||
| api.report_environment_data(report_data) | ||||||
|
|
||||||
| # Report to API | ||||||
| try: | ||||||
| api.report_environment_data(report_data) | ||||||
| # Clear pump activities after successful report | ||||||
| clear_reported_activities() | ||||||
| except Exception as e: | ||||||
| print(f"Error reporting to API: {e}") | ||||||
|
||||||
| print(f"Error reporting to API: {e}") | |
| logging.error(f"Error reporting to API: {e}", exc_info=True) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[nitpick] Using print for production logging can clutter stdout; consider using the logging module at a debug or info level instead.