Konubinix' opinionated web of thoughts

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