Files
PiDoorbell/main.py
Ádám Kovács e60e4c8231 Use other GPIO
2023-11-26 09:28:06 +01:00

201 lines
5.6 KiB
Python

import rp2
import network
import ubinascii
import machine
import uos
from machine import Pin
from time import sleep
import urequests as requests
import time
import micropython_ota
from secrets import secrets
from settings import settings
# Set country to avoid possible errors
rp2.country('HU')
# Define blinking function for onboard LED to indicate error codes
def blink_onboard_led(num_blinks):
led = machine.Pin('LED', machine.Pin.OUT)
for i in range(num_blinks):
led.value(1)
time.sleep_ms(200)
led.value(0)
time.sleep_ms(200)
def connect_wifi():
wlan.active(True)
# If you need to disable powersaving mode
# wlan.config(pm = 0xa11140)
# See the MAC address in the wireless chip OTP
mac = ubinascii.hexlify(wlan.config('mac'),':').decode()
print('mac = ' + mac)
# Other things to query
# print(wlan.config('channel'))
# print(wlan.config('essid'))
# print(wlan.config('txpower'))
# Load login data from different file for safety reasons
pw = secrets['pw']
wlan.connect(ssid, pw)
# Wait for connection with 10 second timeout
timeout = 20
while timeout > 0:
if wlan.status() < 0 or wlan.status() >= 3:
break
timeout -= 1
print('Waiting for connection...')
blink_onboard_led(2)
time.sleep(1)
# Handle connection error
# Error meanings
# 0 Link Down
# 1 Link Join
# 2 Link NoIp
# 3 Link Up
# -1 Link Fail
# -2 Link NoNet
# -3 Link BadAuth
wlan_status = wlan.status()
blink_onboard_led(wlan_status)
if wlan_status != 3:
blink_onboard_led(5)
raise RuntimeError('Wi-Fi connection failed')
else:
blink_onboard_led(1)
print('Connected')
status = wlan.ifconfig()
print('ip = ' + status[0])
def disconnect_wifi():
wlan.disconnect()
wlan.active(False)
wlan.deinit()
print('Disconnected')
def send_notification(title, tags):
try:
send_notification_to_server('https://ntfy.sh/' + ntfy_topic, title, tags)
except:
print('Error sending notification')
blink_onboard_led(3)
send_notification_to_server('https://ntfy.adix.link/' + ntfy_topic, title, tags)
def send_notification_to_server(notify_url, title, tags):
print('Sending notification to ' + notify_url + '...')
# Send notification
request = requests.post(notify_url, data="Csengo", headers={
'Title': title,
'Priority': '5',
'X-Tags': tags
})
print(request.content)
request.close()
def set_cpu_to_high_freq():
machine.freq(125000000)
def set_cpu_to_low_freq():
machine.freq(20000000)
pass
set_cpu_to_high_freq()
ota_branch = settings['ota_branch']
ota_soft_reset_device=False
ntfy_topic = settings['ntfy_topic']
print('Starting up...')
wlan = network.WLAN(network.STA_IF)
ssid = secrets['ssid']
print('WiFi network to use on action: ' + ssid)
current_version = 'unknown'
if 'version' in uos.listdir():
with open('version', 'r') as current_version_file:
current_version = current_version_file.readline().strip()
door_bell = machine.Pin(28, machine.Pin.IN, machine.Pin.PULL_DOWN)
debug_mode = machine.Pin(15, machine.Pin.IN, machine.Pin.PULL_DOWN)
doorbell_last_state = False
doorbell_current_state = False
debug_last_state = False
debug_current_state = False
led = Pin('LED', Pin.OUT)
blink_onboard_led(2)
sleep(1)
try:
connect_wifi()
print("Checking version updates...")
#micropython_ota.reset_version()
micropython_ota.ota_update('https://iot-sw.adix.link', 'doorbell', ota_branch)
send_notification(title = 'Started (sw: ' + current_version + ')', tags = 'signal_strength')
sleep(2)
disconnect_wifi()
blink_onboard_led(1)
except Exception as e:
print('Error: Could not send became-online message :(')
print(e)
blink_onboard_led(4)
print('Changing frequency and beginning loop...')
set_cpu_to_low_freq()
while True:
doorbell_current_state = door_bell.value()
debug_current_state = debug_mode.value()
if debug_last_state == False and debug_current_state == True:
set_cpu_to_high_freq()
print('Frequency is set to default')
blink_onboard_led(5)
debug_last_state = debug_current_state
if doorbell_last_state == False and doorbell_current_state == True:
set_cpu_to_high_freq()
led.value(1)
print('Connecting to WiFi ' + ssid + '...')
connect_wifi()
print('Sending notification...')
send_notification(title = 'Dany Csengo', tags = 'bell')
time.sleep(1)
version_changed, remote_version = micropython_ota.check_version('https://iot-sw.adix.link', 'doorbell', ota_branch)
if version_changed:
send_notification(title = 'Updating to ' + remote_version, tags = 'new')
if ota_soft_reset_device:
print(f'Found new version {remote_version}, soft-resetting device...')
machine.soft_reset()
else:
print(f'Found new version {remote_version}, hard-resetting device...')
machine.reset()
else:
print('No new version available')
disconnect_wifi()
led.value(0)
time.sleep_ms(200)
blink_onboard_led(1)
# Sleep for 5 sec to avoid multiple triggers AND too frequent frequency change
print('Waiting 5 seconds before changing frequency...')
time.sleep(5)
set_cpu_to_low_freq()
doorbell_last_state = doorbell_current_state
time.sleep_ms(200)