Skip to content
Snippets Groups Projects
Commit d13c8ade authored by Strasser, Andreas's avatar Strasser, Andreas
Browse files

implemented power saving

parent 0f6cd69e
No related branches found
No related tags found
No related merge requests found
import string import string
import gpio
class NBIoTRequestType class NBIoTRequestType
static var MQTT = 1 static var MQTT = 1
static var COAP = 2 static var COAP = 2
static var NTP = 3 static var NTP = 3
static var PSM = 4
static var TEST = 69
end end
class NBIoTRequest class NBIoTRequest
var type var type
end end
class NBIoTTestRequest : NBIoTRequest
var msg
var cmd
def init(msg, cmd)
self.type = NBIoTRequestType.TEST
self.msg = msg
self.cmd = cmd
end
end
class NBIoTMQTTRequest : NBIoTRequest class NBIoTMQTTRequest : NBIoTRequest
var type var type
var host var host
...@@ -32,12 +46,6 @@ class NBIoTMQTTRequest : NBIoTRequest ...@@ -32,12 +46,6 @@ class NBIoTMQTTRequest : NBIoTRequest
end end
end end
class NBIoTNTPRequest : NBIoTRequest
def init()
self.type = NBIoTRequestType.NTP
end
end
class NBIoTCOAPRequest : NBIoTRequest class NBIoTCOAPRequest : NBIoTRequest
var host var host
var port var port
...@@ -59,6 +67,26 @@ class NBIoTCOAPRequest : NBIoTRequest ...@@ -59,6 +67,26 @@ class NBIoTCOAPRequest : NBIoTRequest
end end
end end
class NBIoTNTPRequest : NBIoTRequest
var callback
def init(callback)
self.type = NBIoTRequestType.NTP
self.callback = callback
end
end
class NBIoTPSMRequest : NBIoTRequest
var value
var callback
def init(value, callback)
self.type = NBIoTRequestType.PSM
self.value = value
self.callback = callback
end
end
class NBIoTMQTTConnection class NBIoTMQTTConnection
var host var host
var port var port
...@@ -84,6 +112,7 @@ class NBIoTMQTTConnection ...@@ -84,6 +112,7 @@ class NBIoTMQTTConnection
end end
class NBIoTDriverState class NBIoTDriverState
static var IDLE = 0
static var RESET = 1 static var RESET = 1
static var READY = 2 static var READY = 2
static var NTP_SYNC = 3 static var NTP_SYNC = 3
...@@ -97,6 +126,11 @@ class NBIoTDriverState ...@@ -97,6 +126,11 @@ class NBIoTDriverState
static var COAP_SEND = 11 static var COAP_SEND = 11
static var COAP_RECEIVE = 12 static var COAP_RECEIVE = 12
static var COAP_CLOSE = 13 static var COAP_CLOSE = 13
static var PSM_DISABLE = 14
static var PSM_INIT = 15
static var PSM_CFG = 16
static var PSM_ENABLE = 17
static var TEST = 69
end end
class NBIoTDriver class NBIoTDriver
...@@ -110,14 +144,16 @@ class NBIoTDriver ...@@ -110,14 +144,16 @@ class NBIoTDriver
var request_queue var request_queue
var request var request
var mqtt_connection var mqtt_connection
var psm_eint
def init(rx, tx) def init(rx, tx, psm_eint)
self.state = NBIoTDriverState.RESET self.state = NBIoTDriverState.PSM_DISABLE
self.rsp_awaiting = false self.rsp_awaiting = false
self.retries = self.MAX_RETRIES self.retries = self.MAX_RETRIES
self.request_queue = [] self.request_queue = []
self.request = nil self.request = nil
self.mqtt_connection = nil self.mqtt_connection = nil
self.psm_eint = psm_eint
self.ser = serial(rx, tx, 115200, serial.SERIAL_8N1) self.ser = serial(rx, tx, 115200, serial.SERIAL_8N1)
end end
...@@ -184,6 +220,8 @@ class NBIoTDriver ...@@ -184,6 +220,8 @@ class NBIoTDriver
if self.rsp_awaiting if self.rsp_awaiting
var rsp = self.ser.read().asstring() var rsp = self.ser.read().asstring()
print(rsp)
if string.find(rsp, msg) >= 0 if string.find(rsp, msg) >= 0
self.rsp_awaiting = false self.rsp_awaiting = false
...@@ -231,12 +269,22 @@ class NBIoTDriver ...@@ -231,12 +269,22 @@ class NBIoTDriver
end end
def every_second() def every_second()
if self.state == NBIoTDriverState.IDLE
return
# ---- retries exceeded ---- # # ---- retries exceeded ---- #
if self.retries < 1 && self.request != nil elif self.retries < 1 && self.request != nil
self.request = nil self.request = nil
self.mqtt_connection = nil
self.next_state(NBIoTDriverState.RESET) self.next_state(NBIoTDriverState.RESET)
tasmota.log('NBT: Maximum number of retries exceeded, skipping request', 2) tasmota.log('NBT: Maximum number of retries exceeded, skipping request', 2)
# ---- disable power saving mode ---- #
elif self.state == NBIoTDriverState.PSM_DISABLE
gpio.digital_write(self.psm_eint, 1)
if self.rsp_contains_msg_or_send('OK', 'AT+QSCLK=0\r\n')
self.next_state(NBIoTDriverState.RESET)
end
# ---- reset module ---- # # ---- reset module ---- #
elif self.state == NBIoTDriverState.RESET elif self.state == NBIoTDriverState.RESET
if self.rsp_contains_msg_or_send('RDY', 'AT+QRST=1\r\n') if self.rsp_contains_msg_or_send('RDY', 'AT+QRST=1\r\n')
...@@ -265,10 +313,22 @@ class NBIoTDriver ...@@ -265,10 +313,22 @@ class NBIoTDriver
self.mqtt_connection = mqtt_connection self.mqtt_connection = mqtt_connection
self.next_state(NBIoTDriverState.MQTT_OPEN) self.next_state(NBIoTDriverState.MQTT_OPEN)
end end
elif self.request.type == NBIoTRequestType.TEST
self.next_state(NBIoTDriverState.TEST)
elif self.request.type == NBIoTRequestType.PSM
if self.request.value
self.next_state(NBIoTDriverState.PSM_INIT)
else
self.next_state(NBIoTDriverState.PSM_DISABLE)
end
else else
self.finish_request() self.finish_request()
end end
end end
elif self.state == NBIoTDriverState.TEST
if self.rsp_contains_msg_or_send(self.request.msg, self.request.cmd + '\r\n')
self.next_state(NBIoTDriverState.READY)
end
# ---- fetch time from ntp server ---- # # ---- fetch time from ntp server ---- #
elif self.state == NBIoTDriverState.NTP_SYNC elif self.state == NBIoTDriverState.NTP_SYNC
var rsp = self.fetch_rsp_if_contains_msg_or_send('+QNTP: 0', 'AT+QNTP=1,\"0.at.pool.ntp.org\"\r\n') var rsp = self.fetch_rsp_if_contains_msg_or_send('+QNTP: 0', 'AT+QNTP=1,\"0.at.pool.ntp.org\"\r\n')
...@@ -277,6 +337,10 @@ class NBIoTDriver ...@@ -277,6 +337,10 @@ class NBIoTDriver
self.set_system_time(rsp) self.set_system_time(rsp)
self.next_state(NBIoTDriverState.READY) self.next_state(NBIoTDriverState.READY)
end end
elif self.state == NBIoTDriverState.TEST
if self.rsp_contains_msg_or_send(self.request.msg, self.request.cmd + '\r\n')
self.next_state(NBIoTDriverState.READY)
end
# ---- punlish mqtt message ---- # # ---- punlish mqtt message ---- #
elif self.state == NBIoTDriverState.MQTT_CHECK_CONN elif self.state == NBIoTDriverState.MQTT_CHECK_CONN
if self.retries == 1 if self.retries == 1
...@@ -320,6 +384,21 @@ class NBIoTDriver ...@@ -320,6 +384,21 @@ class NBIoTDriver
elif self.state == NBIoTDriverState.COAP_RECEIVE elif self.state == NBIoTDriverState.COAP_RECEIVE
var msg = self.ser.read().asstring() var msg = self.ser.read().asstring()
print(msg) print(msg)
# ---- enable power saving mode ---- #
elif self.state == NBIoTDriverState.PSM_INIT
if self.rsp_contains_msg_or_send('OK', 'AT+CEREG=5\r\n')
self.next_state(NBIoTDriverState.PSM_CFG)
end
elif self.state == NBIoTDriverState.PSM_CFG
if self.rsp_contains_msg_or_send('OK', 'AT+CPSMS=1,,,\"11100010\",\"00000001\"\r\n')
self.next_state(NBIoTDriverState.PSM_ENABLE)
end
elif self.state == NBIoTDriverState.PSM_ENABLE
gpio.digital_write(self.psm_eint, 0)
if self.rsp_contains_msg_or_send('OK', 'AT+QSCLK=1\r\n')
self.next_state(NBIoTDriverState.IDLE)
end
else else
tasmota.log('NBT: Invalid driver state, stopping driver', 2) tasmota.log('NBT: Invalid driver state, stopping driver', 2)
tasmota.remove_driver(self) tasmota.remove_driver(self)
...@@ -334,13 +413,19 @@ nbiot.init = def (m) ...@@ -334,13 +413,19 @@ nbiot.init = def (m)
var _driver var _driver
def init() def init()
self._driver = NBIoTDriver(19, 23) self._driver = NBIoTDriver(18, 23, 16)
tasmota.add_driver(self._driver) tasmota.add_driver(self._driver)
end end
def sync_time() def set_power_save_mode(value, callback)
var request = NBIoTNTPRequest() var request = NBIoTPSMRequest(value, callback)
self._driver.queue_request(request)
end
def sync_time(callback)
var request = NBIoTNTPRequest(callback)
self._driver.queue_request(request) self._driver.queue_request(request)
end end
...@@ -380,6 +465,12 @@ nbiot.init = def (m) ...@@ -380,6 +465,12 @@ nbiot.init = def (m)
return true return true
end end
end end
def test(msg, cmd)
var request = NBIoTTestRequest(msg, cmd)
self._driver.queue_request(request)
end
end end
return nbiot() return nbiot()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment