|
16 | 16 | # https://support.rachio.com/en_us/public-api-documentation-S1UydL1Fv
|
17 | 17 | # https://rachio.readme.io/reference/getting-started
|
18 | 18 | RACHIO_KEY = os.getenv("RACHIO_APIKEY")
|
| 19 | +RACHIO_PERSONID = os.getenv("RACHIO_PERSONID") |
19 | 20 |
|
20 | 21 | # Get WiFi details, ensure these are setup in settings.toml
|
21 | 22 | ssid = os.getenv("CIRCUITPY_WIFI_SSID")
|
@@ -100,125 +101,150 @@ def _format_datetime(datetime):
|
100 | 101 | print("Retrying in 10 seconds")
|
101 | 102 | print("✅ Wifi!")
|
102 | 103 |
|
103 |
| - try: |
104 |
| - print(" | Attempting to GET Rachio Authorization") |
| 104 | + # RETREIVE PERSONID AND PASTE IT TO SETTINGS.TOML |
| 105 | + if RACHIO_PERSONID is None or RACHIO_PERSONID == "": |
105 | 106 | try:
|
106 |
| - with requests.get( |
107 |
| - url=RACHIO_SOURCE, headers=RACHIO_HEADER |
108 |
| - ) as rachio_response: |
109 |
| - rachio_json = rachio_response.json() |
110 |
| - except ConnectionError as e: |
111 |
| - print("Connection Error:", e) |
112 |
| - print("Retrying in 10 seconds") |
113 |
| - print(" | ✅ Authorized") |
114 |
| - |
115 |
| - rachio_id = rachio_json["id"] |
116 |
| - if DEBUG: |
117 |
| - print(" | | Person ID: ", rachio_id) |
118 |
| - print(" | | This ID will be used for subsequent calls") |
119 |
| - print("\nFull API GET URL: ", RACHIO_SOURCE) |
120 |
| - print(rachio_json) |
121 |
| - |
122 |
| - except (ValueError, RuntimeError) as e: |
123 |
| - print(f"Failed to get data, retrying\n {e}") |
124 |
| - time.sleep(60) |
125 |
| - break |
126 |
| - |
127 |
| - try: |
128 |
| - print(" | Attempting to GET Rachio JSON") |
129 |
| - try: |
130 |
| - with requests.get( |
131 |
| - url=RACHIO_PERSON_SOURCE + rachio_id, headers=RACHIO_HEADER |
132 |
| - ) as rachio_response: |
133 |
| - rachio_json = rachio_response.json() |
134 |
| - except ConnectionError as e: |
135 |
| - print("Connection Error:", e) |
136 |
| - print("Retrying in 10 seconds") |
137 |
| - print(" | ✅ Rachio JSON") |
138 |
| - |
139 |
| - rachio_id = rachio_json["id"] |
140 |
| - rachio_id_ast = obfuscating_asterix(rachio_id, "append", 3) |
141 |
| - print(" | | UserID: ", rachio_id_ast) |
142 |
| - |
143 |
| - rachio_username = rachio_json["username"] |
144 |
| - rachio_username_ast = obfuscating_asterix(rachio_username, "append", 3) |
145 |
| - print(" | | Username: ", rachio_username_ast) |
146 |
| - |
147 |
| - rachio_name = rachio_json["fullName"] |
148 |
| - rachio_name_ast = obfuscating_asterix(rachio_name, "append", 3) |
149 |
| - print(" | | Full Name: ", rachio_name_ast) |
150 |
| - |
151 |
| - rachio_deleted = rachio_json["deleted"] |
152 |
| - if not rachio_deleted: |
153 |
| - print(" | | Account Status: Active") |
154 |
| - else: |
155 |
| - print(" | | Account Status?: Deleted!") |
156 |
| - |
157 |
| - rachio_createdate = rachio_json["createDate"] |
158 |
| - rachio_timezone_offset = rachio_json["devices"][0]["utcOffset"] |
159 |
| - # Rachio Unix time is in milliseconds, convert to seconds |
160 |
| - rachio_createdate_seconds = rachio_createdate // 1000 |
161 |
| - rachio_timezone_offset_seconds = rachio_timezone_offset // 1000 |
162 |
| - # Apply timezone offset in seconds |
163 |
| - local_unix_time = rachio_createdate_seconds + rachio_timezone_offset_seconds |
164 |
| - if DEBUG: |
165 |
| - print(f" | | Unix Registration Date: {rachio_createdate}") |
166 |
| - print(f" | | Unix Timezone Offset: {rachio_timezone_offset}") |
167 |
| - current_struct_time = time.localtime(local_unix_time) |
168 |
| - final_timestamp = "{}".format(_format_datetime(current_struct_time)) |
169 |
| - print(f" | | Registration Date: {final_timestamp}") |
170 |
| - |
171 |
| - rachio_devices = rachio_json["devices"][0]["name"] |
172 |
| - print(" | | Device: ", rachio_devices) |
173 |
| - |
174 |
| - rachio_model = rachio_json["devices"][0]["model"] |
175 |
| - print(" | | | Model: ", rachio_model) |
176 |
| - |
177 |
| - rachio_serial = rachio_json["devices"][0]["serialNumber"] |
178 |
| - rachio_serial_ast = obfuscating_asterix(rachio_serial, "append") |
179 |
| - print(" | | | Serial Number: ", rachio_serial_ast) |
180 |
| - |
181 |
| - rachio_mac = rachio_json["devices"][0]["macAddress"] |
182 |
| - rachio_mac_ast = obfuscating_asterix(rachio_mac, "append") |
183 |
| - print(" | | | MAC Address: ", rachio_mac_ast) |
184 |
| - |
185 |
| - rachio_status = rachio_json["devices"][0]["status"] |
186 |
| - print(" | | | Device Status: ", rachio_status) |
187 |
| - |
188 |
| - rachio_timezone = rachio_json["devices"][0]["timeZone"] |
189 |
| - print(" | | | Time Zone: ", rachio_timezone) |
190 |
| - |
191 |
| - # Latitude & Longtitude are used for smart watering & rain delays |
192 |
| - rachio_latitude = str(rachio_json["devices"][0]["latitude"]) |
193 |
| - rachio_lat_ast = obfuscating_asterix(rachio_latitude, "all") |
194 |
| - print(" | | | Latitude: ", rachio_lat_ast) |
195 |
| - |
196 |
| - rachio_longitude = str(rachio_json["devices"][0]["longitude"]) |
197 |
| - rachio_long_ast = obfuscating_asterix(rachio_longitude, "all") |
198 |
| - print(" | | | Longitude: ", rachio_long_ast) |
199 |
| - |
200 |
| - rachio_rainsensor = rachio_json["devices"][0]["rainSensorTripped"] |
201 |
| - print(" | | | Rain Sensor: ", rachio_rainsensor) |
202 |
| - |
203 |
| - rachio_zone0 = rachio_json["devices"][0]["zones"][0]["name"] |
204 |
| - rachio_zone1 = rachio_json["devices"][0]["zones"][1]["name"] |
205 |
| - rachio_zone2 = rachio_json["devices"][0]["zones"][2]["name"] |
206 |
| - rachio_zone3 = rachio_json["devices"][0]["zones"][3]["name"] |
207 |
| - zones = f"{rachio_zone0}, {rachio_zone1}, {rachio_zone2}, {rachio_zone3}" |
208 |
| - print(f" | | | Zones: {zones}") |
209 |
| - |
210 |
| - if DEBUG: |
211 |
| - print(f"\nFull API GET URL: {RACHIO_PERSON_SOURCE+rachio_id}") |
212 |
| - print(rachio_json) |
213 |
| - |
| 107 | + print(" | Attempting to GET Rachio Authorization") |
| 108 | + try: |
| 109 | + with requests.get( |
| 110 | + url=RACHIO_SOURCE, headers=RACHIO_HEADER |
| 111 | + ) as rachio_response: |
| 112 | + rachio_json = rachio_response.json() |
| 113 | + except ConnectionError as e: |
| 114 | + print("Connection Error:", e) |
| 115 | + print("Retrying in 10 seconds") |
| 116 | + print(" | ✅ Authorized") |
| 117 | + |
| 118 | + rachio_id = rachio_json["id"] |
| 119 | + print("\nADD THIS 🔑 TO YOUR SETTINGS.TOML FILE!") |
| 120 | + print(f'RACHIO_PERSONID = "{rachio_id}"') |
| 121 | + |
| 122 | + if DEBUG: |
| 123 | + print("\nFull API GET URL: ", RACHIO_SOURCE) |
| 124 | + print(rachio_json) |
| 125 | + |
| 126 | + except (ValueError, RuntimeError) as e: |
| 127 | + print(f"Failed to GET data: {e}") |
| 128 | + time.sleep(60) |
| 129 | + break |
| 130 | + print( |
| 131 | + "\nThis script can only continue when a proper APIKey & PersonID is used." |
| 132 | + ) |
214 | 133 | print("\nFinished!")
|
215 |
| - print(f"Board Uptime: {time_calc(time.monotonic())}") |
216 |
| - print(f"Next Update: {time_calc(SLEEP_TIME)}") |
217 | 134 | print("===============================")
|
| 135 | + time.sleep(SLEEP_TIME) |
218 | 136 |
|
219 |
| - except (ValueError, RuntimeError) as e: |
220 |
| - print(f"Failed to get data, retrying\n {e}") |
221 |
| - time.sleep(60) |
222 |
| - break |
223 |
| - |
224 |
| - time.sleep(SLEEP_TIME) |
| 137 | + # Main Script |
| 138 | + if RACHIO_PERSONID is not None and RACHIO_PERSONID != "": |
| 139 | + try: |
| 140 | + print(" | Attempting to GET Rachio JSON") |
| 141 | + try: |
| 142 | + with requests.get( |
| 143 | + url=RACHIO_PERSON_SOURCE + RACHIO_PERSONID, headers=RACHIO_HEADER |
| 144 | + ) as rachio_response: |
| 145 | + rachio_json = rachio_response.json() |
| 146 | + except ConnectionError as e: |
| 147 | + print("Connection Error:", e) |
| 148 | + print("Retrying in 10 seconds") |
| 149 | + print(" | ✅ Rachio JSON") |
| 150 | + response_headers = rachio_response.headers |
| 151 | + if DEBUG: |
| 152 | + print(f"Response Headers: {response_headers}") |
| 153 | + call_limit = int(response_headers["x-ratelimit-limit"]) |
| 154 | + calls_remaining = int(response_headers["x-ratelimit-remaining"]) |
| 155 | + calls_made_today = call_limit - calls_remaining |
| 156 | + |
| 157 | + print(" | | Headers:") |
| 158 | + print(f" | | | Date: {response_headers['date']}") |
| 159 | + print(f" | | | Maximum Daily Requests: {call_limit}") |
| 160 | + print(f" | | | Today's Requests: {calls_made_today}") |
| 161 | + print(f" | | | Remaining Requests: {calls_remaining}") |
| 162 | + print(f" | | | Limit Reset: {response_headers['x-ratelimit-reset']}") |
| 163 | + print(f" | | | Content Type: {response_headers['content-type']}") |
| 164 | + |
| 165 | + rachio_id = rachio_json["id"] |
| 166 | + rachio_id_ast = obfuscating_asterix(rachio_id, "append", 3) |
| 167 | + print(" | | PersonID: ", rachio_id_ast) |
| 168 | + |
| 169 | + rachio_username = rachio_json["username"] |
| 170 | + rachio_username_ast = obfuscating_asterix(rachio_username, "append", 3) |
| 171 | + print(" | | Username: ", rachio_username_ast) |
| 172 | + |
| 173 | + rachio_name = rachio_json["fullName"] |
| 174 | + rachio_name_ast = obfuscating_asterix(rachio_name, "append", 3) |
| 175 | + print(" | | Full Name: ", rachio_name_ast) |
| 176 | + |
| 177 | + rachio_deleted = rachio_json["deleted"] |
| 178 | + if not rachio_deleted: |
| 179 | + print(" | | Account Status: Active") |
| 180 | + else: |
| 181 | + print(" | | Account Status?: Deleted!") |
| 182 | + |
| 183 | + rachio_createdate = rachio_json["createDate"] |
| 184 | + rachio_timezone_offset = rachio_json["devices"][0]["utcOffset"] |
| 185 | + # Rachio Unix time is in milliseconds, convert to seconds |
| 186 | + rachio_createdate_seconds = rachio_createdate // 1000 |
| 187 | + rachio_timezone_offset_seconds = rachio_timezone_offset // 1000 |
| 188 | + # Apply timezone offset in seconds |
| 189 | + local_unix_time = rachio_createdate_seconds + rachio_timezone_offset_seconds |
| 190 | + if DEBUG: |
| 191 | + print(f" | | Unix Registration Date: {rachio_createdate}") |
| 192 | + print(f" | | Unix Timezone Offset: {rachio_timezone_offset}") |
| 193 | + current_struct_time = time.localtime(local_unix_time) |
| 194 | + final_timestamp = "{}".format(_format_datetime(current_struct_time)) |
| 195 | + print(f" | | Registration Date: {final_timestamp}") |
| 196 | + |
| 197 | + rachio_devices = rachio_json["devices"][0]["name"] |
| 198 | + print(" | | Device: ", rachio_devices) |
| 199 | + |
| 200 | + rachio_model = rachio_json["devices"][0]["model"] |
| 201 | + print(" | | | Model: ", rachio_model) |
| 202 | + |
| 203 | + rachio_serial = rachio_json["devices"][0]["serialNumber"] |
| 204 | + rachio_serial_ast = obfuscating_asterix(rachio_serial, "append") |
| 205 | + print(" | | | Serial Number: ", rachio_serial_ast) |
| 206 | + |
| 207 | + rachio_mac = rachio_json["devices"][0]["macAddress"] |
| 208 | + rachio_mac_ast = obfuscating_asterix(rachio_mac, "append") |
| 209 | + print(" | | | MAC Address: ", rachio_mac_ast) |
| 210 | + |
| 211 | + rachio_status = rachio_json["devices"][0]["status"] |
| 212 | + print(" | | | Device Status: ", rachio_status) |
| 213 | + |
| 214 | + rachio_timezone = rachio_json["devices"][0]["timeZone"] |
| 215 | + print(" | | | Time Zone: ", rachio_timezone) |
| 216 | + |
| 217 | + # Latitude & Longtitude are used for smart watering & rain delays |
| 218 | + rachio_latitude = str(rachio_json["devices"][0]["latitude"]) |
| 219 | + rachio_lat_ast = obfuscating_asterix(rachio_latitude, "all") |
| 220 | + print(" | | | Latitude: ", rachio_lat_ast) |
| 221 | + |
| 222 | + rachio_longitude = str(rachio_json["devices"][0]["longitude"]) |
| 223 | + rachio_long_ast = obfuscating_asterix(rachio_longitude, "all") |
| 224 | + print(" | | | Longitude: ", rachio_long_ast) |
| 225 | + |
| 226 | + rachio_rainsensor = rachio_json["devices"][0]["rainSensorTripped"] |
| 227 | + print(" | | | Rain Sensor: ", rachio_rainsensor) |
| 228 | + |
| 229 | + rachio_zone0 = rachio_json["devices"][0]["zones"][0]["name"] |
| 230 | + rachio_zone1 = rachio_json["devices"][0]["zones"][1]["name"] |
| 231 | + rachio_zone2 = rachio_json["devices"][0]["zones"][2]["name"] |
| 232 | + rachio_zone3 = rachio_json["devices"][0]["zones"][3]["name"] |
| 233 | + zones = f"{rachio_zone0}, {rachio_zone1}, {rachio_zone2}, {rachio_zone3}" |
| 234 | + print(f" | | | Zones: {zones}") |
| 235 | + |
| 236 | + if DEBUG: |
| 237 | + print(f"\nFull API GET URL: {RACHIO_PERSON_SOURCE+rachio_id}") |
| 238 | + print(rachio_json) |
| 239 | + |
| 240 | + print("\nFinished!") |
| 241 | + print(f"Board Uptime: {time_calc(time.monotonic())}") |
| 242 | + print(f"Next Update: {time_calc(SLEEP_TIME)}") |
| 243 | + print("===============================") |
| 244 | + |
| 245 | + except (ValueError, RuntimeError) as e: |
| 246 | + print(f"Failed to get data, retrying\n {e}") |
| 247 | + time.sleep(60) |
| 248 | + break |
| 249 | + |
| 250 | + time.sleep(SLEEP_TIME) |
0 commit comments