diff --git a/main.py b/main.py index 2956982..b7a482a 100644 --- a/main.py +++ b/main.py @@ -85,6 +85,9 @@ motion_timeout_ms = 18000 # Default value, it will be recalculated motion_started_ms = 0 motion_state_on = False +light_raw = 0 +light = 0 + running = True def web_thread(): @@ -113,23 +116,32 @@ def web_thread(): serverSocket.listen() last_wlan_status = wlan.status() + last_wlan_isconnected = wlan.isconnected() while running: try: reconnect_wifi = False - if wlan.status() != last_wlan_status: - last_wlan_status = wlan.status() + wlan_status = wlan.status() + wlan_is_connected = wlan.isconnected() + + if wlan_status != last_wlan_status or wlan_is_connected != last_wlan_isconnected: + print("WLAN status changed " + str(wlan_status) + " " + str(wlan_is_connected)) + + if wlan_status != last_wlan_status: print('WLAN status changed to ' + str(last_wlan_status)) - if wlan.status() < 0 or wlan.status() > 3: + if wlan_status < 0 or wlan_status > 3: reconnect_wifi = True if last_wlan_status == network.STAT_IDLE: reconnect_wifi = True - if not wlan.isconnected(): - reconnect_wifi = True + if not wlan_is_connected: + reconnect_wifi = True + + last_wlan_isconnected = wlan_is_connected + last_wlan_status = wlan_status if reconnect_wifi: print('Disconnecting from WiFi') @@ -137,7 +149,7 @@ def web_thread(): print('Reconnecting to WiFi') while not connect_wifi(wlan, ssid, pw, blink_onboard_led): print('Could not connect to WiFi, retrying in 5 seconds') - time.sleep(5) + time.sleep(10) print('Reconnected to WiFi') except Exception as e: print("caught exception in web loop in wlan checking {} {}".format(type(e).__name__, e)) @@ -162,7 +174,10 @@ def web_thread(): result_ok(cl, "{" + "\"humidity\": \"" + with_fallback_to_str(humidity, "NaN") + "\"," + - "\"temp\": \"" + with_fallback_to_str(temperature, "NaN")+"\""+ + "\"temp\": \"" + with_fallback_to_str(temperature, "NaN")+"\","+ + "\"motion\": \"" + with_fallback_to_str(motion_state_on, "NaN")+"\","+ + "\"light_raw\": \"" + with_fallback_to_str(light_raw, "NaN")+"\","+ + "\"light\": \"" + with_fallback_to_str(light, "NaN")+"\""+ "}", 'application/json') elif request.find('/toggle_temp') == GET_PATH_START: @@ -239,7 +254,15 @@ temperature""" + attrs + with_fallback_to_str(temperature, "NaN") + """ # HELP humidity Relative humidity in % # TYPE humidity gauge -humidity""" + attrs + with_fallback_to_str(humidity, "NaN")) +humidity""" + attrs + with_fallback_to_str(humidity, "NaN") + +""" +# HELP light Normalized light level +# TYPE light gauge +light""" + attrs + with_fallback_to_str(light, "NaN") + +""" +# HELP light_raw Raw light resistance value 0-65535 +# TYPE light_raw gauge +light_raw""" + attrs + with_fallback_to_str(light_raw, "NaN")) result_ok(cl, content) else: result_notfound(cl) @@ -268,6 +291,9 @@ def display_thread(): global temp_sht4x global humidity_sht4x + global light_raw + global light + global enable_temp global enable_hum global dim_light @@ -295,9 +321,9 @@ def display_thread(): sensor_update_delta = 3000 last_sensor_update_time = current_time_ms - sensor_update_delta - 1000 + sensor_lock_acquired = False while running: try: - sensor_lock_acquired = False try: if current_time_ms >= last_sensor_update_time + sensor_update_delta: sensor_lock_acquired = True @@ -321,14 +347,14 @@ def display_thread(): minute = ltime[4] # Light on a 0 - 65535 scale - light = photoRes.read_u16() + light_raw = photoRes.read_u16() # We want to use the minimum brightness in darker environments # So we scale the light value to a 0 - 15 scale but uses a 18 (0-17) scale with zeroes at the beggining # Because of this the lower (18 [extended range] - 16 [real range] + 1 [0 is 0 on the real range]) * 100 / 18 = 16.6% # the brightness will be 0 # We also chop of the top so instead of 18 we use a 20 scale but only subtract 3 from - light = light * 19 // 65535 - 3 + light = light_raw * 19 // 65535 - 3 if light < 0: light = 0 @@ -345,11 +371,13 @@ def display_thread(): elif not dim_light and last_brightness != 15: display.set_brightness(15) last_brightness = 15 - + + movement = True if pir_sensor.value() == 1 else False + if motion_state_on and current_time_ms >= motion_started_ms + motion_timeout_ms: motion_state_on = False - if motion_state_on == False and enable_motion_detection and pir_sensor.value() == 1: + if motion_state_on == False and enable_motion_detection and movement: motion_state_on = True motion_started_ms = current_time_ms display_mode = 0