import time
import machine
import time
import utime
from umqtt.simple import MQTTClient
from machine import RTC
import micropython
import esp
import uasyncio
import gc
import ubinascii
import ntptime
import random
import sys
import onewire, ds18x20
try:
import urequests as requests
except:
import requests
bStartup = True
gc.collect()
esp.osdebug(None)
gpioNum = 22
sTemp = machine.Pin(gpioNum)
ds = ds18x20.DS18X20(onewire.OneWire(sTemp))
tSensors = ds.scan()
topic_pub_temp = b'esp/ds18b20/temperature'
message_interval = 20
last_message = time.time() - message_interval
pub_mqtt_server = 'mqttpub.fam-claes.be'
pub_mqtt_port = 8444
pub_mqtt_server = 'test.mosquitto.org'
pub_mqtt_port = 1883
def _to_romcode_string(bytearray_romcode):
string_hex_list = [str(ubinascii.hexlify(bytes([el])), 'utf8') for el in bytearray_romcode]
romcode_str = ''.join(string_hex_list)
return romcode_str
def getTempNow(sDevice):
ds.convert_temp()
return ds.read_temp(sDevice)
def get_id():
url = 'https://www.uuidtools.com/api/generate/v4'
response = requests.get(url)
if response.status_code == 200:
uid = response.text[2:-2]
print("UID = %s" % uid)
return uid
else:
print('Error')
print(response.text)
return '_n_a'
def get_localtime():
url = 'http://worldtimeapi.org/api/timezone/Europe/Brussels.txt'
response = requests.get(url)
if response.status_code == 200:
dtDict = response.text.split('\n')
now = dtDict[2].split(':',1)[1].strip()
dow = dtDict[3].split(':')[1].strip()
datePart, timePart = now.split('T')
year = int(datePart.split('-')[0])
month = int(datePart.split('-')[1])
day = int(datePart.split('-')[2])
hour = int(timePart.split(':')[0])
minute = int(timePart.split(':')[1])
second = int(timePart.split(':')[2].split('.')[0])
subsecond = int(timePart.split('.')[1].split('+')[0])
rtc = RTC()
rtc.init((year,month,day,dow,hour,minute,second,subsecond))
else:
print('Error')
print(response.text)
def connect_mqtt(pub_client_id):
global pub_mqtt_server, pub_mqtt_port
pub_client = MQTTClient(pub_client_id, pub_mqtt_server, port=pub_mqtt_port,keepalive=60 )
pub_client.connect()
print('Connected to public %s MQTT broker' % (pub_mqtt_server))
return pub_client
def restart_and_reconnect():
print('Failed to connect to MQTT broker. Reconnecting...')
utime.sleep_ms(15)
machine.reset()
async def run():
print("Syncing local time...")
get_localtime()
#ntptime.settime()
try:
pub_client_id = 'FamClaes_%s_%s' % (get_id(),ubinascii.hexlify(machine.unique_id()).decode())
pub_client = connect_mqtt(pub_client_id)
print('Start publishing...')
last_message = time.time()
except OSError as e:
restart_and_reconnect()
bStartup = True
while True:
try:
if (time.time() - last_message) > message_interval or bStartup == True:
bStartup = False
tSensors = ds.scan()
for s in tSensors:
aRomCode = _to_romcode_string(s)
#print ('Found sensor: %s' % aRomCode)
temp = str(getTempNow(s))
topic_pub_temp = b"CLSensors/temperature/%s" % aRomCode
topic_pub_ts = b"CLSensors/timestamp/%s" % aRomCode
now = utime.localtime()
ts = "{:02d}/{:02d}/{} {:02d}:{:02d}:{:02d}".format(now[2],now[1],now[0],now[3],now[4],now[5])
pub_client.publish(topic=topic_pub_temp, msg=temp, retain=False, qos=0 )
print('Published %s for %s' % (temp, topic_pub_temp))
pub_client.publish(topic=topic_pub_ts, msg=ts, retain=False, qos=0 )
#print('Published %s for %s' % (ts, topic_pub_ts))
last_message = time.time()
utime.sleep(1)
except OSError as e:
restart_and_reconnect()
if __name__ == '__main__':
try:
uasyncio.run(run())
except:
print ("Encountered error...rebooting")
restart_and_reconnect()
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20
Loading
ds18b20
ds18b20