Plant Moisture Sensor
Fleeting
on the server
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import logging
import os
from datetime import datetime, timedelta
import requests
from flask import Blueprint, request
blueprint = Blueprint("basilic", __name__)
logger = logging.getLogger(__name__)
schedules = [(8, 30), (12, 0), (18, 0), (22, 0)]
if os.environ.get("BASILIC_DEBUG") == "true":
schedules = [
(hour, minute)
for hour in range(23)
for minute in (
0,
# 15,
30,
# 45,
# 50,
# 55
)
]
@blueprint.route("/basilic")
def record():
# called with http://home:9911/basilic?value={value}
value = int(request.args.get("value"))
priority = "low" if value > 1500 else "high"
requests.post(
"http://home:9705/basilic",
headers={
"title": "mp",
"priority": priority,
},
data=str(value),
)
now = datetime.now()
times = [
now.replace(hour=hour, minute=minute, second=0, microsecond=0)
for hour, minute in schedules
]
found = None
for prev, next in zip(times, times[1:]):
if prev <= now < next:
found = next
break
else:
found = times[0] + timedelta(days=1)
wait_seconds = (found - now).total_seconds() if priority == "low" else 600
logger.info(f"Waiting for {wait_seconds} (at {found})")
return str(wait_seconds)
on the MCU
from helpers import deep_sleep, lowpower, deep_sleep_handler, wifi, LatchingRelay, runner, dump_exception
import requests
from machine import Pin, ADC
import machine
import time
lowpower()
wifi.reset()
debug = Pin(16, Pin.IN)
sensor = ADC(36)
latching = LatchingRelay(
4, # d2
0, # d3
)
def wait(waiting_seconds):
if debug.value():
time.sleep(waiting_seconds)
else:
deep_sleep(waiting_seconds)
@runner(debugpin=debug)
def run():
try:
if debug.value():
wifi.on()
while True:
latching.a() # on
time.sleep(2)
value = sensor.read()
latching.b() # off
print(f"Uploading the value {value}")
with wifi:
waiting_seconds = int(float(requests.get(f"http://home:9911/basilic?value={value}").text))
print(f"going to sleep for {waiting_seconds}")
wait(waiting_seconds)
except Exception as e:
dump_exception(e, "error2.log")
waiting_seconds = 3600
print(f"dumped this error, waiting for {waiting_seconds}s before restarting")
wait(waiting_seconds)
Mon Nov 10 15:38:43 CET 2025
Checking the current installation
Reading install.json from mpremote
Writing into main.py in mpremote
Writing into conf.py in mpremote
Writing into helpers.py in mpremote
Writing into install.json in mpremote
Writing into error.log in mpremote
Writing into resetdeepsleep in mpremote
Mon Nov 10 15:44:07 CET 2025
Checking the current installation
Reading install.json from upesy
Writing into main.py in upesy
Writing into install.json in upesy
Writing into error.log in upesy
Writing into resetdeepsleep in upesy