Dateien nach "pg26" hochladen
This commit is contained in:
390
pg26/pndSRC.py
Normal file
390
pg26/pndSRC.py
Normal file
@@ -0,0 +1,390 @@
|
||||
import network
|
||||
import pndConfig as cfg
|
||||
from mqtt import MQTTClient
|
||||
import time
|
||||
import ntptime
|
||||
import machine
|
||||
import socket
|
||||
import array
|
||||
import gc
|
||||
import sys
|
||||
import ujson
|
||||
import dht
|
||||
from machine import Pin, I2C, ADC
|
||||
|
||||
class dtime():
|
||||
def __init__(self):
|
||||
year, mon, day, h, m, s, nope, nope2 = time.localtime()
|
||||
h = h + 2
|
||||
year = year - 2000
|
||||
if(h == 24 ):
|
||||
h = 0
|
||||
elif(h == 25):
|
||||
h = 1
|
||||
self.date = str(day) + "." + str(mon) + "." + str(year)
|
||||
if(m < 10):
|
||||
sM = "0" + str(m)
|
||||
else:
|
||||
sM = str(m)
|
||||
if(s < 10):
|
||||
sS = "0" + str(s)
|
||||
else:
|
||||
sS = str(s)
|
||||
if(h < 10):
|
||||
sH = "0" + str(h)
|
||||
else:
|
||||
sH = str(h)
|
||||
self.time = sH + ":" + sM+ ":" + sS
|
||||
|
||||
|
||||
class sens():
|
||||
ADC = False
|
||||
def __init__(self, id, type, pin):
|
||||
self.id = id
|
||||
self.type = type
|
||||
class_ = getattr(dht, self.type)
|
||||
self.sensor = class_(Pin(pin))
|
||||
|
||||
def update(self):
|
||||
self.sensor.measure()
|
||||
self.temp = self.sensor.temperature()
|
||||
self.hum = self.sensor.humidity()
|
||||
return self.temp, self.hum
|
||||
|
||||
def getStr(self):
|
||||
self.sensor.measure()
|
||||
self.temp = self.sensor.temperature()
|
||||
self.hum = self.sensor.humidity()
|
||||
return str(self.temp), str(self.hum)
|
||||
|
||||
class adcsens():
|
||||
ADC = True
|
||||
def __init__(self, id, pin):
|
||||
self.adc = ADC(Pin(pin))
|
||||
self.adc.atten(ADC.ATTN_11DB)
|
||||
self.adc.width(ADC.WIDTH_12BIT)
|
||||
self.id = id
|
||||
|
||||
def update(self):
|
||||
self.percent = (cfg.defaults.gc_adc_max-self.adc.read())*100/(cfg.defaults.gc_adc_max-cfg.defaults.gc_adc_min)
|
||||
self.value = self.adc.read()
|
||||
return self.percent
|
||||
|
||||
def getStr(self):
|
||||
self.update()
|
||||
return str(self.percent)
|
||||
|
||||
class display():
|
||||
def __init__(self):
|
||||
self.i2c = I2C(sda=Pin(4), scl=Pin(5))
|
||||
self.oled = ssd1306.SSD1306_I2C(64, 48, self.i2c)
|
||||
self.view = 0
|
||||
|
||||
def addTxt(self, text, posx, posy, color):
|
||||
self.oled.text(text, posx, posy, color)
|
||||
|
||||
def flush(self):
|
||||
self.oled.fill(1)
|
||||
self.oled.show()
|
||||
self.oled.fill(0)
|
||||
self.oled.show()
|
||||
|
||||
def show(self):
|
||||
self.oled.show()
|
||||
|
||||
def invert(self):
|
||||
if(self.view == 0):
|
||||
self.oled.invert(1)
|
||||
self.view = 1
|
||||
else:
|
||||
self.oled.invert(0)
|
||||
self.view = 0
|
||||
|
||||
def contrast(self, cont):
|
||||
self.oled.contrast(cont)
|
||||
|
||||
|
||||
|
||||
class mqtt():
|
||||
|
||||
def mqtt_callback(self, topic,msg):
|
||||
print(msg)
|
||||
|
||||
def connect(self):
|
||||
client = MQTTClient(cfg.gc_name, cfg.mqtt.gc_host,user=cfg.mqtt.gc_user, password=cfg.mqtt.gc_secret, port=cfg.mqtt.gc_port, keepalive=5)
|
||||
client.set_callback(self.mqtt_callback)
|
||||
client.connect()
|
||||
print('mqtt connected!')
|
||||
return client
|
||||
|
||||
def disconnect(self, client):
|
||||
client.disconnect()
|
||||
print('mqtt disconnected!')
|
||||
|
||||
|
||||
def publish(self, client, topic, msg ):
|
||||
client.publish(topic, msg)
|
||||
print('mqtt message send to topic: ' + topic )
|
||||
|
||||
def subscribe(self, client):
|
||||
client.subscribe(cfg.mqtt.gc_topic)
|
||||
|
||||
def ping(self):
|
||||
client = self.client
|
||||
try:
|
||||
client.ping()
|
||||
return True
|
||||
except Exception as e:
|
||||
return False
|
||||
|
||||
|
||||
class wifi():
|
||||
wlan = network.WLAN(network.STA_IF)
|
||||
lastTry = 0
|
||||
e = "wifi struggle"
|
||||
def connect(self):
|
||||
conntimeout = 0
|
||||
wlan = self.wlan
|
||||
wlan.active(False)
|
||||
wlan.active(True)
|
||||
wlan.connect(cfg.wifi.gc_ssid, cfg.wifi.gc_secret)
|
||||
print('connecting to: ' + cfg.wifi.gc_ssid)
|
||||
while not wlan.isconnected():
|
||||
print('connecting...')
|
||||
time.sleep(1)
|
||||
conntimeout = conntimeout + 1
|
||||
if(conntimeout > 20): break
|
||||
if(not wlan.isconnected()): ecx.handle(ecx(),self,self.e)
|
||||
|
||||
print(wlan.ifconfig())
|
||||
print('connected!')
|
||||
|
||||
def disconnect(self):
|
||||
wlan = self.wlan
|
||||
wlan.disconnect()
|
||||
wlan.active(False)
|
||||
print('disconnected!')
|
||||
|
||||
def reconnect(self):
|
||||
wlan = self.wlan
|
||||
wlan.disconnect()
|
||||
wlan.active(False)
|
||||
print('disconnected!')
|
||||
wlan.active(False)
|
||||
del wlan
|
||||
time.sleep(1)
|
||||
self.wlan = network.WLAN(network.STA_IF)
|
||||
self.wlan.active(True)
|
||||
conntimeout = 1
|
||||
self.wlan.connect(cfg.wifi.gc_ssid, cfg.wifi.gc_secret)
|
||||
print('connecting to: ' + cfg.wifi.gc_ssid)
|
||||
while not self.wlan.isconnected():
|
||||
print('connecting...')
|
||||
time.sleep(1)
|
||||
conntimeout = conntimeout + 1
|
||||
self.lastTry = 1
|
||||
if(conntimeout > 20): break
|
||||
|
||||
if(not self.wlan.isconnected()): ecx.handle(self, self.e)
|
||||
|
||||
def getMac(self):
|
||||
import ubinascii
|
||||
mac = ubinascii.hexlify(self.wlan.config('mac'),':').decode()
|
||||
return mac
|
||||
|
||||
def status(self):
|
||||
wlan = self.wlan
|
||||
status = wlan.status()
|
||||
if(status == 3):
|
||||
ip, netmask, gateway, dns = wlan.ifconfig()
|
||||
status = "\r\nWLan connected to: " + cfg.wifi.gc_ssid
|
||||
status += "\r\nWLan IP: " + ip
|
||||
status += "\r\nWLan NetMask: " + netmask
|
||||
status += "\r\nWLan Gateway: " + gateway
|
||||
status += "\r\nWLan DNS: " + dns
|
||||
return status
|
||||
else:
|
||||
return "\r\nnot connected"
|
||||
|
||||
def getIp(self):
|
||||
wlan = self.wlan
|
||||
ip, netmask, gateway, dns = wlan.ifconfig()
|
||||
return ip
|
||||
|
||||
def createAP(self):
|
||||
ap = network.WLAN(network.AP_IF)
|
||||
## ap.SetConfig(cfg.XY...)
|
||||
|
||||
ap.active(True)
|
||||
|
||||
## todo
|
||||
pass
|
||||
def disableAP(self):
|
||||
ap = network.WLAN(network.AP_IF)
|
||||
ap.active(False)
|
||||
|
||||
class bt():
|
||||
def __init__(self):
|
||||
import bluetooth
|
||||
self.bt = bluetooth.BLE()
|
||||
self.bt.active(False) # Bluetooth deaktivieren
|
||||
print("Bluetooth disabled:", not self.bt.active())
|
||||
|
||||
|
||||
class system():
|
||||
def __init__(self):
|
||||
|
||||
self.timeInit = time.time()
|
||||
|
||||
def setCallback(self, obj):
|
||||
self.cb = obj
|
||||
|
||||
def status(self):
|
||||
cpufq = machine.freq() / 1000000
|
||||
memfree = gc.mem_free() / 1024
|
||||
memusage = gc.mem_alloc() / 1024
|
||||
mem = memfree + memusage
|
||||
timeDiff = time.time()-self.timeInit
|
||||
(minutes, seconds) = divmod(timeDiff, 60)
|
||||
(hours, minutes) = divmod(minutes, 60)
|
||||
(days,hours) = divmod(hours, 24)
|
||||
system = "System:\nDevice: "+ cfg.gc_name + "\nSystem: " + sys.platform + "\nFirmware: " + sys.version
|
||||
system += "\n\nRessources:\nCPU Speed: " + "{:.0f}".format(cpufq) + "MHz"
|
||||
system += "\nMEM All: " + "{:.2f}".format(mem) + "Kb"
|
||||
system += "\nMEM Free: " + "{:.2f}".format(memfree) + "Kb"
|
||||
system += "\nMEM Used: " + "{:.2f}".format(memusage) + "Kb"
|
||||
system += "\nSYS Uptime: "+ str(days) + ":" + str(hours) + ":" + str(minutes) + ":" + str(seconds)
|
||||
system += "\nSYS MQTT Message Count: " + "{:.0f}".format(self.cb.cycle) + "Messages"
|
||||
return system
|
||||
|
||||
def statusJSON(self):
|
||||
|
||||
cpufq = machine.freq() / 1000000
|
||||
memfree = gc.mem_free() / 1024
|
||||
memusage = gc.mem_alloc() / 1024
|
||||
mem = memfree + memusage
|
||||
uptimeS = self.cb.cycle * 60
|
||||
uptimeM = uptimeS / 60
|
||||
uptimeH = uptimeM / 60
|
||||
uptimeD = uptimeH / 24
|
||||
jsSys = ujson.dumps({ "ip": self.cb.wifi.getIp(), "name": cfg.gc_name, "mqtt_msg_count": self.cb.cycle, "uptime_min" : uptimeM, "uptime_days" : "{:.2f}".format(uptimeD),
|
||||
"uptime_hr" : "{:.2f}".format(uptimeH), "memory" : "{:.2f}".format(mem), "mem_free" : "{:.2f}".format(memfree), "mem_usage" : "{:.2f}".format(memusage) })
|
||||
return jsSys
|
||||
|
||||
class ecx():
|
||||
def handle(obj, e):
|
||||
try:
|
||||
if(hasattr(obj, 'lastTry')):
|
||||
if(obj.lastTry == 1):
|
||||
print("FATAL ERROR - Restart device. Error: " + str(e))
|
||||
time.sleep(5)
|
||||
machine.reset()
|
||||
|
||||
print("FATAL ERROR - Trying recovery from: " + str(e))
|
||||
time.sleep(2)
|
||||
del obj
|
||||
import pnd as recoverPND
|
||||
fresh_runtime = recoverPND.rt()
|
||||
fresh_runtime.init(1)
|
||||
time.sleep(1)
|
||||
fresh_runtime.run()
|
||||
except:
|
||||
import pnd as lastPND
|
||||
last_runtime = lastPND.rt()
|
||||
last_runtime.init(1)
|
||||
time.sleep(1)
|
||||
last_runtime.run()
|
||||
|
||||
class webserver():
|
||||
sockl = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sockl.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
|
||||
def run(self):
|
||||
s = self.sockl
|
||||
s.bind(('', cfg.defaults.gc_websrvport))
|
||||
s.listen(5)
|
||||
print('WebServices up and running! Waiting for connections...')
|
||||
while True:
|
||||
try:
|
||||
conn, addr = s.accept()
|
||||
print('Got a connection from %s' % str(addr))
|
||||
request = conn.recv(1024)
|
||||
self.handler(str(request), conn)
|
||||
gc.collect()
|
||||
time.sleep(0.2)
|
||||
except Exception as e:
|
||||
pass
|
||||
|
||||
def handler(self, request, conn):
|
||||
#if json data handle with care
|
||||
json = request.find('/?json=')
|
||||
if(json == 6):
|
||||
self.JSONHandler(request, conn)
|
||||
exit()
|
||||
|
||||
|
||||
get = request.find('/?get=system')
|
||||
fun = request.find('/?fun=')
|
||||
print(get)
|
||||
response = ""
|
||||
if(get == 6):
|
||||
s = "jo läuft das ding :D"
|
||||
final = s.replace("\n", "<br>")
|
||||
response += '<html><head><title>Pundo Web Server</title></head><body><h1>Pundo Web Server</h1><p><strong>' + final + '</strong></p></body></html>'
|
||||
print("bin 2")
|
||||
conn.send('HTTP/1.1 200 OK\n')
|
||||
conn.send('Content-Type: text/html\n')
|
||||
conn.send('Connection: close\n\n')
|
||||
conn.sendall(response)
|
||||
conn.close()
|
||||
|
||||
elif(fun == 6):
|
||||
print('RFC')
|
||||
response += '<html><head><title>Pundo Web Server</title></head><body><h1>Pundo Web Server</h1><p><strong>RFC in progress...</strong></p></body></html>'
|
||||
conn.send('HTTP/1.1 200 OK\n')
|
||||
conn.send('Content-Type: text/html\n')
|
||||
conn.send('Connection: keep-alive\n')
|
||||
conn.send('Keep-Alive: timeout=30, max=100\n\n')
|
||||
conn.sendall(response)
|
||||
self.funHandler(response, conn)
|
||||
#conn.close()
|
||||
#time.sleep(3)
|
||||
#machine.reset()
|
||||
|
||||
else:
|
||||
response += '<html><head><title>Pundo Web Server</title></head><body><h1>Pundo Web Server</h1><p><strong>Wrong Command</strong></p></body></html>'
|
||||
conn.send('HTTP/1.1 200 OK\n')
|
||||
conn.send('Content-Type: text/html\n')
|
||||
conn.send('Connection: close\n\n')
|
||||
conn.sendall(response)
|
||||
conn.close()
|
||||
|
||||
|
||||
def JSONHandler(self, request, conn):
|
||||
pass
|
||||
def funHandler(self, request, conn):
|
||||
fun = request.find('/?fun=')
|
||||
|
||||
class pndIFBase:
|
||||
def pndObj(self, id:str) -> Object:
|
||||
"""Test pls hang on"""
|
||||
pass
|
||||
def pndTest(self) ->str:
|
||||
return "Still in development please hang on"
|
||||
|
||||
class httpRQ(pndIFBase):
|
||||
def pndObj(self):
|
||||
return self
|
||||
|
||||
def post(self, url, data):
|
||||
post_data = data ##ujson.dumps(data)
|
||||
request_url = url
|
||||
res = requests.post(request_url, headers = {'content-type': 'application/json'}, data = post_data)
|
||||
return res.text
|
||||
|
||||
|
||||
|
||||
|
||||
# init system
|
||||
#wifi = wifi()
|
||||
#Psystem = system()
|
||||
Reference in New Issue
Block a user