diff --git a/src/driver/nbiot.be b/src/driver/nbiot.be
new file mode 100644
index 0000000000000000000000000000000000000000..085598f1a9492339fe1ac085752dcc7e31369f37
--- /dev/null
+++ b/src/driver/nbiot.be
@@ -0,0 +1,122 @@
+import string
+
+class NBIoTDriverState
+  static var RESET = 1
+  static var INIT_COAP = 2
+  static var INIT_MQTT = 3
+  static var READY = 4
+  static var COAP_SET_OPTIONS = 5
+  static var COAP_SEND = 6
+  static var COAP_RECEIVE = 7
+end
+
+class NBIoTDriver
+  var ser
+  var state
+  var send_queue
+  var send_request
+  var ok_awaiting
+  var payload_awaiting
+  var retries
+
+  def init(rx, tx)
+    self.state = NBIoTDriverState.RESET
+    self.send_queue = []
+    self.send_request = nil
+    self.ok_awaiting = false
+    self.retries = 0
+
+    self.ser = serial(rx, tx, 115200, serial.SERIAL_8N1)
+  end
+
+  def check_ok()
+    if self.ok_awaiting
+      var msg = self.ser.read().asstring()
+      print(msg)
+
+      if string.find(msg,'OK') >= 0
+        self.ok_awaiting = false
+        
+        return true
+      else
+        if self.retries > 0
+          self.retries -= self.retries
+        end
+
+        return false
+      end
+    else
+      return false
+    end
+  end
+
+  def check_ok_or_send(cmd)
+    if self.check_ok()
+      return true
+    else
+      print('send ' + cmd)
+      self.ser.write(bytes().fromstring(cmd))
+      self.ok_awaiting = true
+
+      return false
+    end
+  end
+
+  def check_ready()
+    var msg = self.ser.read().asstring()
+    print(msg)
+
+    return string.find(msg,'RDY') >= 0
+  end
+
+  def reset()
+    self.ser.write(bytes().fromstring('AT+QRST=1\r\n'))
+    print('write AT+QRST')
+  end
+
+  def every_second()
+    if self.state == NBIoTDriverState.RESET
+      if !self.check_ready()
+        self.reset()
+      else
+        self.state = NBIoTDriverState.INIT_COAP
+      end
+    elif self.state == NBIoTDriverState.INIT_COAP
+      if self.check_ok_or_send('AT+QCOAPCREATE=1,0\r\n')
+        self.state = NBIoTDriverState.COAP_SET_OPTIONS
+      end
+    elif self.state == NBIoTDriverState.COAP_SET_OPTIONS
+      if self.check_ok_or_send('AT+QCOAPOPTION=1,11,\"test\"\r\n')
+        self.state = NBIoTDriverState.COAP_SEND
+      end
+    elif self.state == NBIoTDriverState.COAP_SEND
+      if self.check_ok_or_send('AT+QCOAPSEND=1,0,\"37.120.174.40\",5683,0\r\n')
+        self.state = NBIoTDriverState.COAP_RECEIVE
+      end
+    elif self.state == NBIoTDriverState.COAP_RECEIVE
+      var msg = self.ser.read().asstring()
+      print(msg)
+    else
+      print('duuude')
+    end
+  end
+end
+
+var nbiot = module('nbiot')
+
+nbiot.init = def (m)
+  class nbiot
+    var _driver
+
+    def init()
+      print('init')
+      self._driver = NBIoTDriver(19, 23)
+
+      tasmota.add_driver(self._driver)
+    end
+  end
+
+  return nbiot()
+end
+
+return nbiot
\ No newline at end of file