├── docker └── esp8266_STM │ ├── Dockerfile │ └── README.md └── projects ├── driver_ext └── SSD1306 │ ├── main.py │ └── ssd1306.py ├── driver_my ├── 25Qxxx │ ├── flash.py │ └── main.py ├── BMP180 │ ├── bmp180.py │ └── main.py └── SI7021 │ ├── README.md │ ├── main.py │ └── si7021.py ├── examples ├── 0. ESP32_lobo │ ├── examples │ │ ├── button_pin_test │ │ │ ├── button_control │ │ │ │ └── __init__.py │ │ │ ├── main.py │ │ │ └── relay_control │ │ │ │ └── __init__.py │ │ ├── button_switch_test │ │ │ ├── button_control │ │ │ │ └── __init__.py │ │ │ ├── main.py │ │ │ └── relay_control │ │ │ │ └── __init__.py │ │ ├── http_template │ │ │ ├── button_control │ │ │ │ └── __init__.py │ │ │ ├── httpse │ │ │ │ ├── __init__.py │ │ │ │ ├── route_led.py │ │ │ │ ├── route_system.py │ │ │ │ ├── runner.py │ │ │ │ └── runner32.py │ │ │ ├── main.py │ │ │ ├── mqttse │ │ │ │ └── __init__.py │ │ │ ├── relay_control │ │ │ │ └── __init__.py │ │ │ ├── runner │ │ │ │ └── __init__.py │ │ │ └── www │ │ │ │ ├── app.js │ │ │ │ ├── axios.min.js │ │ │ │ ├── css.min.js │ │ │ │ ├── favicon.ico │ │ │ │ ├── index.html │ │ │ │ ├── style.css │ │ │ │ ├── underscore.min.js │ │ │ │ └── vue.min.js │ │ └── realay_test │ │ │ ├── button_control │ │ │ └── __init__.py │ │ │ ├── main.py │ │ │ ├── relay_control │ │ │ └── __init__.py │ │ │ └── runner │ │ │ └── __init__.py │ └── modules │ │ ├── button_control │ │ └── __init__.py │ │ └── relay_control │ │ └── __init__.py ├── 1. ESP32_original │ └── examples │ │ └── basic_template │ │ ├── bmp180 │ │ └── __init__.py │ │ ├── boot.py │ │ ├── button_control │ │ └── __init__.py │ │ ├── ftpse │ │ └── __init__.py │ │ ├── httpse │ │ ├── __init__.py │ │ ├── route_led.py │ │ └── route_system.py │ │ ├── logging.py │ │ ├── main.py │ │ ├── mqttse │ │ └── __init__.py │ │ ├── networks.json │ │ ├── relay_control │ │ └── __init__.py │ │ ├── si7021 │ │ └── __init__.py │ │ ├── telnetse │ │ ├── __init__.py │ │ └── telnetio.py │ │ ├── uasyncio │ │ ├── __init__.py │ │ └── core.py │ │ ├── wifi │ │ └── __init__.py │ │ └── www │ │ ├── app.js │ │ ├── axios.min.js │ │ ├── css.min.js │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── style.css │ │ ├── underscore.min.js │ │ └── vue.min.js ├── 18B20 │ └── main.py ├── DHT22 │ └── main.py ├── ESP-32_LORA_OLED │ ├── main.py │ ├── si7021.py │ └── ssd1306.py ├── ESP-32_SeHttp_basic │ ├── main.py │ ├── sehttp.py │ └── www │ │ ├── app.js │ │ ├── axios.min.js │ │ ├── css.min.js │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── style.css │ │ ├── underscore.min.js │ │ └── vue.min.js ├── ESP-32_lobo_sram_SeHttp │ ├── httpse │ │ ├── __init__.py │ │ ├── route_led.py │ │ ├── route_system.py │ │ ├── runner.py │ │ └── runner32.py │ ├── main.py │ ├── mqttse │ │ └── __init__.py │ └── relay_control │ │ └── __init__.py ├── ESP8266_18B20_Relay_Button_MQTT │ ├── README.md │ ├── button_control.py │ ├── main.py │ ├── mqtt_simple.py │ └── relay_control.py ├── ESP8266_SeHttp │ ├── httpse │ │ ├── __init__.py │ │ ├── route_led.py │ │ ├── route_system.py │ │ └── runner.py │ ├── main.py │ ├── mqttse │ │ └── __init__.py │ ├── relay_control │ │ └── __init__.py │ └── www │ │ ├── app.js │ │ ├── axios.min.js │ │ ├── css.min.js │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── style.css │ │ ├── underscore.min.js │ │ └── vue.min.js ├── ESP8266_SeHttp_basic │ ├── main.py │ ├── sehttp.py │ └── www │ │ ├── app.js │ │ ├── axios.min.js │ │ ├── css.min.js │ │ ├── favicon.ico │ │ ├── index.html │ │ ├── style.css │ │ ├── underscore.min.js │ │ └── vue.min.js ├── LORA_receiver_ESP32 │ ├── LoRaReceiver.py │ ├── config_lora.py │ ├── controller.py │ ├── controller_esp.py │ ├── main.py │ ├── oled.py │ ├── ssd1306.py │ ├── sx127x.py │ └── test.py ├── LORA_sender_ESP8266 │ ├── LoRaSender.py │ ├── config.py │ ├── config_lora.py │ ├── controller.py │ ├── controller_esp.py │ ├── main.py │ ├── sx127x.py │ └── test.py ├── README.MD ├── S20_relay_control_R1_B1 │ ├── README.md │ ├── button_control.py │ ├── main.py │ ├── mqtt_simple.py │ └── relay_control.py ├── async │ ├── as2.py │ └── config.py ├── dragon_button_relay_push_only │ ├── main.py │ ├── pinButton.py │ └── relay.py ├── dragon_button_relay_state_save │ ├── main.py │ ├── pinButton.py │ └── relay.py ├── mqtt_dragon_relay │ ├── README.md │ ├── button_control.py │ ├── main.py │ ├── mainO.py │ ├── mqtt_simple.py │ ├── relay_control.py │ └── simple.py ├── mqtt_dragon_relay_18B20 │ ├── README.md │ ├── button_control.py │ ├── main.py │ ├── mqtt_simple.py │ └── relay_control.py ├── mqtt_dragon_relay_18B20_T_control_R1 │ ├── README.md │ ├── button_control.py │ ├── main.py │ ├── mqtt_simple.py │ └── relay_control.py ├── mqtt_dragon_relay_DAK │ ├── README.md │ ├── main.py │ └── simple.py ├── mqtt_relay │ ├── main.py │ └── simple.py ├── mqtt_relay_18B20 │ ├── main.py │ └── simple.py ├── mqtt_relay_1990a │ ├── boot.py │ ├── button_control │ │ └── __init__.py │ ├── main.py │ ├── relay_control.py │ └── simple.py ├── mqtt_si7021_class │ ├── asyn.mpy │ ├── basesensor.py │ ├── boot.py │ ├── checkconnection.py │ ├── config.py │ ├── metaclass.py │ ├── mqtt_helpers.py │ ├── mqttse │ │ ├── __init__.mpy │ │ └── __init__.py │ ├── si7021.mpy │ ├── si7021.py │ ├── si7021sensor.py │ └── uasyncio │ │ ├── __init__.mpy │ │ ├── __init__.py │ │ ├── core.mpy │ │ └── core.py ├── mqtt_si_bmp │ ├── bmp180.mpy │ ├── bmp180.py │ ├── main.py │ ├── si7021.mpy │ └── si7021.py └── touch_switch_test │ ├── main.py │ ├── relay_control │ └── __init__.py │ └── touch_switch_control │ └── __init__.py ├── modules_ext └── FTP-Server │ ├── Readme.md │ └── ftp.py └── modules_my ├── Button_control ├── button_control │ └── __init__.py └── touch_switch_control │ └── __init__.py ├── HttpSe ├── .vscode │ └── settings.json ├── demo │ ├── ESP8266 │ │ ├── httpse │ │ │ ├── __init__.py │ │ │ ├── route_led.py │ │ │ ├── route_system.py │ │ │ └── runner.py │ │ ├── main.py │ │ ├── mqttse │ │ │ └── __init__.py │ │ ├── relay_control │ │ │ └── __init__.py │ │ └── www │ │ │ ├── app.js │ │ │ ├── axios.min.js │ │ │ ├── css.min.js │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── style.css │ │ │ ├── underscore.min.js │ │ │ └── vue.min.js │ ├── ESP8266_basic │ │ ├── main.py │ │ ├── sehttp.py │ │ └── www │ │ │ ├── app.js │ │ │ ├── axios.min.js │ │ │ ├── css.min.js │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── style.css │ │ │ ├── underscore.min.js │ │ │ └── vue.min.js │ ├── ESP8266_simple │ │ ├── main.py │ │ ├── sehttp.py │ │ └── www │ │ │ ├── app.js │ │ │ ├── axios.min.js │ │ │ ├── css.min.js │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── style.css │ │ │ ├── underscore.min.js │ │ │ └── vue.min.js │ ├── esp32 │ │ ├── main.py │ │ ├── sehttp.py │ │ └── www │ │ │ ├── app.js │ │ │ ├── axios.min.js │ │ │ ├── css.min.js │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── style.css │ │ │ ├── underscore.min.js │ │ │ └── vue.min.js │ ├── esp32_basic │ │ ├── main.py │ │ ├── sehttp.py │ │ └── www │ │ │ ├── app.js │ │ │ ├── axios.min.js │ │ │ ├── css.min.js │ │ │ ├── favicon.ico │ │ │ ├── index.html │ │ │ ├── style.css │ │ │ ├── underscore.min.js │ │ │ └── vue.min.js │ └── esp32_lobo │ │ ├── httpse │ │ ├── __init__.py │ │ ├── route_led.py │ │ ├── route_system.py │ │ ├── runner.py │ │ └── runner32.py │ │ ├── main.py │ │ ├── mqttse │ │ └── __init__.py │ │ └── relay_control │ │ └── __init__.py ├── httpse │ ├── __init__.py │ ├── route_led.py │ ├── route_system.py │ ├── runner.py │ └── runner32.py ├── images │ └── webpage1.png ├── readme.md └── www │ ├── app.js │ ├── axios.min.js │ ├── css.min.js │ ├── favicon.ico │ ├── index.html │ ├── style.css │ ├── underscore.min.js │ └── vue.min.js ├── MqttSe ├── MANIFEST ├── README.md ├── README.rst ├── main.py ├── metadata.txt ├── mqttse │ └── __init__.py └── setup.py └── Relay_Led_control └── relay_control └── __init__.py /docker/esp8266_STM/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:16.04 2 | ARG VERSION=master 3 | 4 | ARG DEBIAN_FRONTEND=noninteractive 5 | 6 | RUN apt-get update \ 7 | && apt-get install -y make unrar-free autoconf automake libtool gcc g++ gperf \ 8 | flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial python-pip\ 9 | sed git unzip bash help2man wget bzip2 10 | 11 | RUN apt-get clean \ 12 | && rm -rf /var/lib/apt/lists/* \ 13 | && useradd --no-create-home micropython 14 | 15 | RUN git clone --recursive https://github.com/pfalcon/esp-open-sdk.git \ 16 | && git clone https://github.com/micropython/micropython.git \ 17 | && cd micropython && git checkout $VERSION && git submodule update --init \ 18 | && chown -R micropython:micropython ../esp-open-sdk ../micropython 19 | 20 | RUN apt-get update \ 21 | && apt-get install -y mc libtool-bin 22 | 23 | RUN pip install adafruit-ampy 24 | 25 | USER micropython 26 | 27 | RUN cd esp-open-sdk && make STANDALONE=y 28 | 29 | ENV PATH=/esp-open-sdk/xtensa-lx106-elf/bin:$PATH 30 | 31 | RUN cd micropython/mpy-cross && make 32 | 33 | RUN cd micropython/esp8266 && make axtls && make 34 | 35 | USER root 36 | RUN mkdir /mnt/dev 37 | ENV PATH=/micropython/mpy-cross:$PATH 38 | 39 | RUN apt-get update \ 40 | && apt-get install -y usbutils picocom 41 | -------------------------------------------------------------------------------- /projects/driver_ext/SSD1306/main.py: -------------------------------------------------------------------------------- 1 | import ssd1306 2 | from machine import I2C, Pin 3 | 4 | # OLED 128x64 5 | 6 | i2c = I2C(sda=Pin(22), scl=Pin(21)) 7 | display = ssd1306.SSD1306_I2C(128, 64, i2c) 8 | display.fill(0) 9 | 10 | display.text('Hello',10,10) 11 | display.show() 12 | -------------------------------------------------------------------------------- /projects/driver_my/25Qxxx/main.py: -------------------------------------------------------------------------------- 1 | import machine 2 | import uos 3 | from flash import FlashClass 4 | 5 | # pinCS = machine.Pin(machine.Pin.board.PB3, machine.Pin.OUT) 6 | 7 | flash_cs = machine.Pin.board.PB3 8 | flash_spi_bus = 3 9 | 10 | flash = FlashClass(flash_spi_bus, flash_cs) 11 | uos.mount(flash, '/fs') 12 | #uos.umount('/fs') 13 | # self.flash = FlashClass(intside) 14 | # self.umountflash() # In case mounted by prior tests. 15 | # self.mountflash() 16 | 17 | # import pyb, flash, os 18 | # f = flash.FlashClass(0) # If on right hand side pass 1 19 | # f.low_level_format() 20 | # pyb.mount(f, f.mountpoint, mkfs=True) 21 | # flash.cp('/sd/LiberationSerif-Regular45x44','/fc/') 22 | # os.listdir('/fc') 23 | # pyb.mount(None, '/fc') -------------------------------------------------------------------------------- /projects/driver_my/BMP180/main.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | import bmp180 4 | from machine import I2C, Pin, PWM 5 | 6 | tim1 = Timer(-1) 7 | tim2 = Timer(-1) 8 | tim3 = Timer(-1) 9 | 10 | 11 | 12 | def setup(): 13 | 14 | i2c = I2C(Pin(5), Pin(4)) 15 | 16 | global sensor_bmp 17 | sensor_bmp = bmp180.BMP180(i2c, debug=True) 18 | 19 | global pwm2 20 | pwm2 = PWM(Pin(2), freq=2, duty=512) 21 | 22 | 23 | 24 | def pubm(): 25 | bmp_temperature = sensor_bmp.temperature 26 | bmp_pressure = sensor_bmp.pressure 27 | 28 | print(bmp_temperature) 29 | print(bmp_pressure) 30 | 31 | 32 | def run_timer(): 33 | 34 | tim3.init(period=10000, mode=Timer.PERIODIC, callback=lambda t: pubm()) 35 | # tim1.init(period=10000, mode=Timer.ONE_SHOT, callback=lambda t: connect_mqtt_client()) 36 | 37 | 38 | def main(): 39 | run_timer() 40 | 41 | 42 | if __name__ == '__main__': 43 | setup() 44 | main() 45 | -------------------------------------------------------------------------------- /projects/driver_my/SI7021/README.md: -------------------------------------------------------------------------------- 1 | Micropython 1.9.3 2 | 3 | HTU21D, SI7021 - tested ESP32 4 | 5 | 6 | 7 | I2c test 8 | from machine import I2C, Pin 9 | from ustruct import unpack as unp 10 | import ustruct 11 | 12 | i2c = I2C(-1, sda=Pin(4), scl=Pin(5)) 13 | i2c.readfrom_mem(0x40, 0xE7, 1) 14 | 15 | i2c.writeto(0x40, ustruct.pack('b', 0xF3)) 16 | i2c.readfrom(0x40, 3) 17 | 18 | 19 | -------------------------------------------------------------------------------- /projects/driver_my/SI7021/main.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | import si7021 4 | from machine import I2C, Pin, PWM 5 | 6 | tim1 = Timer(-1) 7 | tim2 = Timer(-1) 8 | tim3 = Timer(-1) 9 | 10 | 11 | 12 | def setup(): 13 | 14 | #i2c = I2C(Pin(5), Pin(4)) #ESP8266 - ESP32 DEVKIT 15 | i2c = I2C(sda=Pin(4), scl=Pin(5)) #Wemos D1: pin4=D2, pin5=D1 16 | 17 | global sensor_si 18 | sensor_si = si7021.SI7021(i2c, debug=True) 19 | 20 | global pwm2 21 | pwm2 = PWM(Pin(2), freq=2, duty=512) #ESP8266 - ESP32 DEVKIT 22 | #pwm2 = PWM(Pin(25), freq=2, duty=512) #ESP32+LORA+OLED 23 | 24 | 25 | 26 | def pubm(): 27 | 28 | si_temperature = sensor_si.temperature 29 | si_humidity = sensor_si.humidity 30 | 31 | print(si_temperature) 32 | print(si_humidity) 33 | 34 | 35 | def run_timer(): 36 | 37 | tim3.init(period=10000, mode=Timer.PERIODIC, callback=lambda t: pubm()) 38 | # tim1.init(period=10000, mode=Timer.ONE_SHOT, callback=lambda t: connect_mqtt_client()) 39 | 40 | 41 | def main(): 42 | run_timer() 43 | 44 | 45 | if __name__ == '__main__': 46 | setup() 47 | main() 48 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/button_pin_test/button_control/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # ver 06.24.18 3 | # Copyright (c) 2018 Viktor Vorobjov 4 | # see: 5 | # examples\touch_switch_test 6 | # Holtek - Touch I/O Flash MCU BS83A02A-4/BS83A04A-3/BS83A04A-4 7 | 8 | # examples\button_switch_test 9 | # Mechanical Pin button 10 | # Touch pin button - TTP223 11 | # 12 | 13 | class ButtonControl: 14 | ''' 15 | Touch Button 16 | #BUTTON 17 | 18 | 19 | push_check by timer(esp8266) or thread(esp32/stm32) 20 | 21 | ''' 22 | 23 | # init 24 | def __init__(self, name=None, _pin=False, debug=False, on_value=1, off_value=0, 25 | state_on="ON", state_off="OFF"): 26 | 27 | self._switch = _pin 28 | self.name = name 29 | self.debug = debug 30 | self.status = 0 31 | 32 | self.button = None 33 | 34 | self.on_value = on_value 35 | self.off_value = off_value 36 | 37 | self.state_on = state_on 38 | self.state_off = state_off 39 | 40 | 41 | 42 | self._value = off_value 43 | 44 | self.cb = None 45 | 46 | self.change_state() 47 | 48 | 49 | 50 | def change_state(self): 51 | self._value = self._switch.value() 52 | 53 | if self._value == self.on_value: 54 | self.state = self.state_on 55 | elif self._value == self.off_value: 56 | self.state = self.state_off 57 | 58 | if self.cb: 59 | self.cb() 60 | 61 | self.status = 20 62 | 63 | 64 | 65 | def makebutton(self): 66 | while True: 67 | if self._switch.value() != self._value: 68 | self.change_state() 69 | self.status = 30 70 | 71 | yield True 72 | 73 | 74 | def start(self): 75 | self.button = self.makebutton() # Generator start 76 | next(self.button) 77 | 78 | if self.debug: 79 | print("Start Button") 80 | 81 | def stop(self): 82 | self.button = None # Generator stop 83 | 84 | @property 85 | def push_check(self): #Generator next 86 | ''' 87 | T 88 | ''' 89 | 90 | try: 91 | next(self.button) 92 | except StopIteration: 93 | if self.debug: 94 | print("Stop Iteration") 95 | return -255 96 | 97 | self.status = 10 98 | 99 | return self.status 100 | 101 | def set_callback(self, f): 102 | self.cb = f 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/button_pin_test/main.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import machine, _thread 4 | from machine import Pin 5 | from relay_control import RelayControl 6 | from button_control import ButtonControl 7 | 8 | _debug = True 9 | _message = "run in ... ." 10 | 11 | #Led 12 | LED_2_pin = Pin(2, Pin.INOUT) 13 | LED_2_on = 1 14 | LED_2 = RelayControl(name="Led2", _pin=LED_2_pin, on_value=LED_2_on, default=LED_2_on) 15 | 16 | #BUTTON 17 | 18 | b4_pin = Pin(4, Pin.IN, Pin.PULL_UP) 19 | b4 = ButtonControl(name="B4", _pin=b4_pin, debug=True, on_value=0, off_value=1) #TTP223 Active Gnd, Defaul VCC 20 | 21 | def b4_cb(): 22 | 23 | if b4.state == "ON": 24 | LED_2.change_state() 25 | 26 | if _debug: 27 | print("Button is = %s" % b4.state) 28 | print("Led is = %s" % LED_2.state) 29 | 30 | 31 | 32 | # #BUTTON CHECK 33 | def button_push_check(): 34 | 35 | while True: 36 | b4.push_check 37 | _thread.wait(200) 38 | 39 | 40 | def main(): 41 | if _debug: 42 | print("Main = %s" % _message) 43 | 44 | b4.start() 45 | b4.set_callback(b4_cb) 46 | 47 | th1 = _thread.start_new_thread("THRD_B4", button_push_check, ()) 48 | 49 | 50 | if __name__ == '__main__': 51 | main() 52 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/button_pin_test/relay_control/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # ver 06.24.18 3 | # Copyright (c) 2018 Viktor Vorobjov 4 | # see: 5 | # examples\button_pin_test 6 | # examples\button_switch_test 7 | # 8 | 9 | class RelayControl: 10 | ''' 11 | Relay Control with state 12 | #Led 13 | 14 | ''' 15 | 16 | # init 17 | def __init__(self, name=None, _pin=None, on_value=1, state_on="ON", state_off="OFF", default=0): 18 | self.name = name 19 | self._relay = _pin 20 | self.on_value = on_value 21 | self.cb = None 22 | self.state_on = state_on 23 | self.state_off = state_off 24 | self.change_state(default) 25 | 26 | def get_state(self): 27 | 28 | self.state = self.state_off 29 | 30 | if self.on_value == self._relay.value(): 31 | self.state = self.state_on 32 | 33 | return self.state 34 | 35 | def change_state(self, reguest_value=None): 36 | 37 | 38 | if reguest_value is not None: 39 | self._relay.value(reguest_value) 40 | else: 41 | if self._relay.value() == 1: 42 | self._relay.value(0) 43 | else: 44 | self._relay.value(1) 45 | 46 | self.get_state() 47 | 48 | if self.cb: 49 | self.cb(self) 50 | 51 | 52 | def set_callback(self, f): 53 | self.cb = f -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/button_switch_test/button_control/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # ver 06.24.18 3 | # Copyright (c) 2018 Viktor Vorobjov 4 | # see: 5 | # examples\touch_switch_test 6 | # Holtek - Touch I/O Flash MCU BS83A02A-4/BS83A04A-3/BS83A04A-4 7 | 8 | # examples\button_switch_test 9 | # Mechanical Pin button 10 | # Touch pin button - TTP223 11 | # 12 | 13 | class ButtonControl: 14 | ''' 15 | Touch Button 16 | #BUTTON 17 | 18 | 19 | push_check by timer(esp8266) or thread(esp32/stm32) 20 | 21 | ''' 22 | 23 | # init 24 | def __init__(self, name=None, _pin=False, debug=False, on_value=1, off_value=0, 25 | state_on="ON", state_off="OFF"): 26 | 27 | self._switch = _pin 28 | self.name = name 29 | self.debug = debug 30 | self.status = 0 31 | 32 | self.button = None 33 | 34 | self.on_value = on_value 35 | self.off_value = off_value 36 | 37 | self.state_on = state_on 38 | self.state_off = state_off 39 | 40 | 41 | 42 | self._value = off_value 43 | 44 | self.cb = None 45 | 46 | self.change_state() 47 | 48 | 49 | 50 | def change_state(self): 51 | self._value = self._switch.value() 52 | 53 | if self._value == self.on_value: 54 | self.state = self.state_on 55 | elif self._value == self.off_value: 56 | self.state = self.state_off 57 | 58 | if self.cb: 59 | self.cb() 60 | 61 | self.status = 20 62 | 63 | 64 | 65 | def makebutton(self): 66 | while True: 67 | if self._switch.value() != self._value: 68 | self.change_state() 69 | self.status = 30 70 | 71 | yield True 72 | 73 | 74 | def start(self): 75 | self.button = self.makebutton() # Generator start 76 | next(self.button) 77 | 78 | if self.debug: 79 | print("Start Button") 80 | 81 | def stop(self): 82 | self.button = None # Generator stop 83 | 84 | @property 85 | def push_check(self): #Generator next 86 | ''' 87 | T 88 | ''' 89 | 90 | try: 91 | next(self.button) 92 | except StopIteration: 93 | if self.debug: 94 | print("Stop Iteration") 95 | return -255 96 | 97 | self.status = 10 98 | 99 | return self.status 100 | 101 | def set_callback(self, f): 102 | self.cb = f 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/button_switch_test/main.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import machine, _thread 4 | from machine import Pin 5 | from relay_control import RelayControl 6 | from button_control import ButtonControl 7 | 8 | _debug = True 9 | _message = "run in ... ." 10 | 11 | #Led 12 | LED_2_pin = Pin(2, Pin.INOUT) 13 | LED_2_on = 1 14 | LED_2 = RelayControl(name="Led2", _pin=LED_2_pin, on_value=LED_2_on, default=1-LED_2_on) 15 | 16 | #BUTTON 17 | 18 | b4_pin = Pin(4, Pin.IN, Pin.PULL_UP) 19 | 20 | 21 | b4 = ButtonControl(name="B4", _pin=b4_pin, debug=True, on_value=1, off_value=0) #Holtek - BS83A02A-4 , Active VCC, default Gnd 22 | 23 | def b4_cb(): 24 | 25 | if b4.state == "ON": 26 | LED_2.change_state(LED_2_on) 27 | else: 28 | LED_2.change_state(1-LED_2_on) 29 | 30 | if _debug: 31 | print("Button is = %s" % b4.state) 32 | print("Led is = %s" % LED_2.state) 33 | 34 | 35 | 36 | # #BUTTON CHECK 37 | def button_push_check(): 38 | 39 | while True: 40 | b4.push_check 41 | _thread.wait(200) 42 | 43 | 44 | def main(): 45 | if _debug: 46 | print("Main = %s" % _message) 47 | 48 | b4.start() 49 | b4.set_callback(b4_cb) 50 | 51 | th1 = _thread.start_new_thread("THRD_B4", button_push_check, ()) 52 | 53 | 54 | if __name__ == '__main__': 55 | main() 56 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/button_switch_test/relay_control/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # ver 06.24.18 3 | # Copyright (c) 2018 Viktor Vorobjov 4 | # see: 5 | # examples\button_pin_test 6 | # examples\button_switch_test 7 | # 8 | 9 | class RelayControl: 10 | ''' 11 | Relay Control with state 12 | #Led 13 | 14 | ''' 15 | 16 | # init 17 | def __init__(self, name=None, _pin=None, on_value=1, state_on="ON", state_off="OFF", default=0): 18 | self.name = name 19 | self._relay = _pin 20 | self.on_value = on_value 21 | self.cb = None 22 | self.state_on = state_on 23 | self.state_off = state_off 24 | self.change_state(default) 25 | 26 | def get_state(self): 27 | 28 | self.state = self.state_off 29 | 30 | if self.on_value == self._relay.value(): 31 | self.state = self.state_on 32 | 33 | return self.state 34 | 35 | def change_state(self, reguest_value=None): 36 | 37 | 38 | if reguest_value is not None: 39 | self._relay.value(reguest_value) 40 | else: 41 | if self._relay.value() == 1: 42 | self._relay.value(0) 43 | else: 44 | self._relay.value(1) 45 | 46 | self.get_state() 47 | 48 | if self.cb: 49 | self.cb(self) 50 | 51 | 52 | def set_callback(self, f): 53 | self.cb = f -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/http_template/button_control/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # ver 06.24.18 3 | # Copyright (c) 2018 Viktor Vorobjov 4 | # see: 5 | # examples\touch_switch_test 6 | # Holtek - Touch I/O Flash MCU BS83A02A-4/BS83A04A-3/BS83A04A-4 7 | 8 | # examples\button_switch_test 9 | # Mechanical Pin button 10 | # Touch pin button - TTP223 11 | # 12 | 13 | class ButtonControl: 14 | ''' 15 | Touch Button 16 | #BUTTON 17 | 18 | 19 | push_check by timer(esp8266) or thread(esp32/stm32) 20 | 21 | ''' 22 | 23 | # init 24 | def __init__(self, name=None, _pin=False, debug=False, on_value=1, off_value=0, 25 | state_on="ON", state_off="OFF"): 26 | 27 | self._switch = _pin 28 | self.name = name 29 | self.debug = debug 30 | self.status = 0 31 | 32 | self.button = None 33 | 34 | self.on_value = on_value 35 | self.off_value = off_value 36 | 37 | self.state_on = state_on 38 | self.state_off = state_off 39 | 40 | 41 | 42 | self._value = off_value 43 | 44 | self.cb = None 45 | 46 | self.change_state() 47 | 48 | 49 | 50 | def change_state(self): 51 | self._value = self._switch.value() 52 | 53 | if self._value == self.on_value: 54 | self.state = self.state_on 55 | elif self._value == self.off_value: 56 | self.state = self.state_off 57 | 58 | if self.cb: 59 | self.cb() 60 | 61 | self.status = 20 62 | 63 | 64 | 65 | def makebutton(self): 66 | while True: 67 | if self._switch.value() != self._value: 68 | self.change_state() 69 | self.status = 30 70 | 71 | yield True 72 | 73 | 74 | def start(self): 75 | self.button = self.makebutton() # Generator start 76 | next(self.button) 77 | 78 | if self.debug: 79 | print("Start Button") 80 | 81 | def stop(self): 82 | self.button = None # Generator stop 83 | 84 | @property 85 | def push_check(self): #Generator next 86 | ''' 87 | T 88 | ''' 89 | 90 | try: 91 | next(self.button) 92 | except StopIteration: 93 | if self.debug: 94 | print("Stop Iteration") 95 | return -255 96 | 97 | self.status = 10 98 | 99 | return self.status 100 | 101 | def set_callback(self, f): 102 | self.cb = f 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/http_template/httpse/route_led.py: -------------------------------------------------------------------------------- 1 | 2 | class LedHandler: 3 | 4 | def __init__(self, debug=True, relay=None): 5 | self._debug = debug 6 | self._relay = relay 7 | self.route_handler = ("/led", "GET", self._handler) 8 | 9 | def _handler(self, res_path, query_params): 10 | response = {} 11 | 12 | # DEBUG curl -i 'http://192.168.10.112/led?set=&state=' 13 | if self._debug: 14 | print("_queryParams =", query_params) 15 | 16 | if 'set' in query_params: 17 | 18 | set = query_params["set"] 19 | if set == "1" or set == "0": 20 | set = int(query_params["set"]) 21 | self._relay.change_state(set) 22 | else: 23 | self._relay.change_state() 24 | 25 | if 'state' in query_params: 26 | rel_resp = 0 27 | if self._relay.state == self._relay.state_on: 28 | rel_resp = 1 29 | 30 | response = {'state': rel_resp} 31 | 32 | if self._debug: 33 | print("Response =", response) 34 | 35 | return response 36 | 37 | 38 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/http_template/httpse/route_system.py: -------------------------------------------------------------------------------- 1 | import gc 2 | 3 | class SystemHandler: 4 | 5 | def __init__(self, debug=True): 6 | self._debug = debug 7 | self.route_handler = ("/system", "GET" ,self._handler) 8 | 9 | 10 | def _handler(self, res_path, query_params): 11 | response = {} 12 | 13 | if self._debug: 14 | print("Debug") 15 | 16 | # curl -i 'http://192.168.10.111/system?memory=' 17 | if 'memory' in query_params: 18 | gc.collect() 19 | response['memory'] = { 20 | 'mem_alloc': gc.mem_alloc(), 21 | 'mem_free': gc.mem_free() 22 | } 23 | return response 24 | 25 | 26 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/http_template/httpse/runner.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | 4 | class ProcessRuner: 5 | 6 | def __init__(self, http_server=False ,timer_http=False, debug = True, run_period=100 ) : 7 | 8 | self._timer_http = timer_http 9 | self._debug = debug 10 | self._run_period = run_period 11 | self._http_server = http_server 12 | self._http_process = self._make_http_process() 13 | 14 | def _make_http_process(self): 15 | if self._debug: 16 | print("Make http process") 17 | while True: 18 | self._http_server.server_process() 19 | yield None 20 | 21 | def _run_http(self): 22 | try: 23 | next(self._http_process) 24 | except StopIteration: 25 | if self._debug: 26 | print("StopIteration") 27 | machine.reset() 28 | 29 | def run_timer(self): 30 | self._timer_http.init(period=self._run_period, mode=Timer.PERIODIC, callback=lambda t: self._run_http()) 31 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/http_template/httpse/runner32.py: -------------------------------------------------------------------------------- 1 | import _thread 2 | import gc 3 | 4 | class ProcessRuner: 5 | 6 | def __init__(self, http_server=False, debug=True): 7 | self._http_server = http_server 8 | self._debug = debug 9 | self._http_thread = None 10 | 11 | 12 | def _run_http_process(self): 13 | while True: 14 | self._http_server.server_process() 15 | _thread.wait(300) 16 | 17 | def start_http(self): 18 | 19 | _thread.stack_size(6 * 1024) 20 | # gc.collect() 21 | self._http_thread = _thread.start_new_thread("HtppSe", self._run_http_process, ()) 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/http_template/main.py: -------------------------------------------------------------------------------- 1 | 2 | #board DOIT devkit ESP32 3 | 4 | import utime 5 | from runner import Runner 6 | 7 | 8 | _debug = True 9 | _message = "Run in DEBUG . B4 Control Pin" 10 | 11 | def main(): 12 | 13 | print("Main = %s" % _message) 14 | 15 | r1 = Runner(debug=_debug) 16 | 17 | print("Wait: Press Control Button") 18 | utime.sleep_ms(5000) 19 | 20 | if r1.btn_ctrl.state != "ON": 21 | print("Start Main") 22 | r1.config() 23 | 24 | else: 25 | print("Control Button: Activate") 26 | 27 | import network 28 | sta = network.WLAN(network.STA_IF) 29 | sta.active(True) 30 | sta.connect("WIFI", "PASSWORD") 31 | utime.sleep_ms(5000) 32 | print(sta.ifconfig()) 33 | ftp = network.ftp.start(user="micro", password="python", buffsize=1024, timeout=300) 34 | print("FTP run is:%s" % ftp) 35 | 36 | 37 | 38 | return r1 39 | 40 | if __name__ == '__main__': 41 | r1 = main() 42 | -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/http_template/relay_control/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # ver 06.24.18 3 | # Copyright (c) 2018 Viktor Vorobjov 4 | # see: 5 | # examples\button_pin_test 6 | # examples\button_switch_test 7 | # 8 | 9 | class RelayControl: 10 | ''' 11 | Relay Control with state 12 | #Led 13 | 14 | ''' 15 | 16 | # init 17 | def __init__(self, name=None, _pin=None, on_value=1, state_on="ON", state_off="OFF", default=0): 18 | self.name = name 19 | self._relay = _pin 20 | self.on_value = on_value 21 | self.cb = None 22 | self.state_on = state_on 23 | self.state_off = state_off 24 | self.change_state(default) 25 | 26 | def get_state(self): 27 | 28 | self.state = self.state_off 29 | 30 | if self.on_value == self._relay.value(): 31 | self.state = self.state_on 32 | 33 | return self.state 34 | 35 | def change_state(self, reguest_value=None): 36 | 37 | 38 | if reguest_value is not None: 39 | self._relay.value(reguest_value) 40 | else: 41 | if self._relay.value() == 1: 42 | self._relay.value(0) 43 | else: 44 | self._relay.value(1) 45 | 46 | self.get_state() 47 | 48 | if self.cb: 49 | self.cb(self) 50 | 51 | 52 | def set_callback(self, f): 53 | self.cb = f -------------------------------------------------------------------------------- /projects/examples/0. ESP32_lobo/examples/http_template/www/css.min.js: -------------------------------------------------------------------------------- 1 | define(function(){if("undefined"==typeof window)return{load:function(a,b,c){c()}};var a=document.getElementsByTagName("head")[0],b=window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/)||0,c=!1,d=!0;b[1]||b[7]?c=parseInt(b[1])<6||parseInt(b[7])<=9:b[2]||b[8]?d=!1:b[4]&&(c=parseInt(b[4])<18);var e={};e.pluginBuilder="./css-builder";var f,g,h,i=function(){f=document.createElement("style"),a.appendChild(f),g=f.styleSheet||f.sheet},j=0,k=[],l=function(a){g.addImport(a),f.onload=function(){m()},j++,31==j&&(i(),j=0)},m=function(){h();var a=k.shift();return a?(h=a[1],void l(a[0])):void(h=null)},n=function(a,b){if(g&&g.addImport||i(),g&&g.addImport)h?k.push([a,b]):(l(a),h=b);else{f.textContent='@import "'+a+'";';var c=setInterval(function(){try{f.sheet.cssRules,clearInterval(c),b()}catch(a){}},10)}},o=function(b,c){var e=document.createElement("link");if(e.type="text/css",e.rel="stylesheet",d)e.onload=function(){e.onload=function(){},setTimeout(c,7)};else var f=setInterval(function(){for(var a=0;a= (self.level or _level) 38 | 39 | def log(self, level, msg, *args): 40 | if level >= (self.level or _level): 41 | _stream.write("%s:%s:" % (self._level_str(level), self.name)) 42 | if not args: 43 | print(msg, file=_stream) 44 | else: 45 | print(msg % args, file=_stream) 46 | 47 | def debug(self, msg, *args): 48 | self.log(DEBUG, msg, *args) 49 | 50 | def info(self, msg, *args): 51 | self.log(INFO, msg, *args) 52 | 53 | def warning(self, msg, *args): 54 | self.log(WARNING, msg, *args) 55 | 56 | def error(self, msg, *args): 57 | self.log(ERROR, msg, *args) 58 | 59 | def critical(self, msg, *args): 60 | self.log(CRITICAL, msg, *args) 61 | 62 | def exc(self, e, msg, *args): 63 | self.log(ERROR, msg, *args) 64 | sys.print_exception(e, _stream) 65 | 66 | def exception(self, msg, *args): 67 | self.exc(sys.exc_info()[1], msg, *args) 68 | 69 | 70 | _level = INFO 71 | _loggers = {} 72 | 73 | def getLogger(name): 74 | if name in _loggers: 75 | return _loggers[name] 76 | l = Logger(name) 77 | _loggers[name] = l 78 | return l 79 | 80 | def info(msg, *args): 81 | getLogger(None).info(msg, *args) 82 | 83 | def debug(msg, *args): 84 | getLogger(None).debug(msg, *args) 85 | 86 | def basicConfig(level=INFO, filename=None, stream=None, format=None): 87 | global _level, _stream 88 | _level = level 89 | if stream: 90 | _stream = stream 91 | if filename is not None: 92 | print("logging.basicConfig: filename arg is not supported") 93 | if format is not None: 94 | print("logging.basicConfig: format arg is not supported") 95 | -------------------------------------------------------------------------------- /projects/examples/1. ESP32_original/examples/basic_template/networks.json: -------------------------------------------------------------------------------- 1 | { 2 | "known_networks": { 3 | "InetAP_1": "12345678", 4 | "InetAP_2": "12345678", 5 | "InetAP_3": "12345678", 6 | "InetAP_4": "12345678", 7 | "InetAP_5": "12345678", 8 | }, 9 | "access_point": { 10 | "essid": "uPy-Dev(micro)", 11 | "channel": 11, 12 | "hidden": false, 13 | "password": "12345678", 14 | "authmode":3 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /projects/examples/1. ESP32_original/examples/basic_template/relay_control/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # ver 06.24.18 3 | # Copyright (c) 2018 Viktor Vorobjov 4 | # see: 5 | # examples\button_pin_test 6 | # examples\button_switch_test 7 | # 8 | 9 | class RelayControl: 10 | ''' 11 | Relay Control with state 12 | #Led 13 | 14 | ''' 15 | 16 | # init 17 | def __init__(self, name=None, _pin=None, on_value=1, state_on="ON", state_off="OFF", default=0): 18 | self.name = name 19 | self._relay = _pin 20 | self.on_value = on_value 21 | self.cb = None 22 | self.state = None 23 | self.state_on = state_on 24 | self.state_off = state_off 25 | self.change_state(default) 26 | 27 | def on(self): 28 | # print("on relay") 29 | self.change_state(self.on_value) 30 | 31 | def off(self): 32 | self.change_state(1 - self.on_value) 33 | 34 | def get_state(self): 35 | 36 | self.state = self.state_off 37 | 38 | if self.on_value == self._relay.value(): 39 | self.state = self.state_on 40 | 41 | return self.state 42 | 43 | def change_state(self, reguest_value=None): 44 | 45 | # print("change relay") 46 | if reguest_value is not None: 47 | self._relay.value(reguest_value) 48 | else: 49 | if self._relay.value() == 1: 50 | self._relay.value(0) 51 | else: 52 | self._relay.value(1) 53 | 54 | self.get_state() 55 | 56 | if self.cb: 57 | # print("relay cb") 58 | # print(self.cb) 59 | self.cb(self) 60 | 61 | 62 | def set_callback(self, f): 63 | self.cb = f -------------------------------------------------------------------------------- /projects/examples/1. ESP32_original/examples/basic_template/telnetse/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | import logging 3 | import uos 4 | import uasyncio as asyncio 5 | 6 | from .telnetio import TelnetIO 7 | 8 | log = logging.getLogger("telnet") 9 | log.setLevel(logging.INFO) 10 | 11 | 12 | class TelnetServer: 13 | 14 | def __init__(self, pswd="micro"): 15 | 16 | self.pswd = pswd 17 | 18 | self.sw_client = None 19 | self.run = False 20 | 21 | 22 | # On accepting client connection 23 | async def server(self, reader, writer): 24 | 25 | remote_addr = writer.extra["peername"] 26 | log.info("Telnet connection from: {}".format(remote_addr)) 27 | 28 | if self.sw_client: 29 | log.info("Close previous connection ...") 30 | self.stop() 31 | 32 | log.info("Get client connection ...") 33 | self.sw_client = TelnetIO(writer.s, self.pswd ) 34 | 35 | self.sw_client.socket.setblocking(False) 36 | self.sw_client.socket.sendall(bytes([255, 252, 34])) # dont allow line mode 37 | self.sw_client.socket.sendall(bytes([255, 251, 1])) # turn off local echo 38 | uos.dupterm(self.sw_client) 39 | 40 | loop = asyncio.get_event_loop() 41 | loop.create_task(self.client_rx()) 42 | 43 | 44 | # On receiving client data 45 | async def client_rx(self): 46 | 47 | while True: 48 | if self.sw_client != None: 49 | try: 50 | yield asyncio.IORead(self.sw_client.socket) 51 | uos.dupterm_notify(True) # dupterm_notify will somehow make a copy of sw_client 52 | 53 | except: 54 | # clean up 55 | log.info("Telnet client disconnected ...") 56 | yield asyncio.IOReadDone(self.sw_client.socket) 57 | self.stop() 58 | 59 | await asyncio.sleep_ms(1) 60 | else: 61 | await asyncio.sleep(1) 62 | 63 | 64 | def stop(self): 65 | 66 | if self.sw_client: 67 | self.sw_client.close() 68 | uos.dupterm_notify(self.sw_client.socket) # deactivate dupterm 69 | uos.dupterm(None) 70 | self.sw_client = None 71 | 72 | 73 | # Add server tasks to asyncio event loop 74 | # Server will run after loop has been started 75 | def start(self, addr="0.0.0.0", port=23): 76 | 77 | loop = asyncio.get_event_loop() 78 | if not self.run: 79 | loop.create_task(asyncio.start_server(self.server, addr, port)) 80 | log.info("Telnet server started on {}:{}".format(addr, port)) 81 | self.run = "{};{}".format(addr, port) 82 | 83 | return True 84 | 85 | 86 | -------------------------------------------------------------------------------- /projects/examples/1. ESP32_original/examples/basic_template/telnetse/telnetio.py: -------------------------------------------------------------------------------- 1 | import uio 2 | import errno 3 | 4 | 5 | class TelnetIO(uio.IOBase): 6 | 7 | def __init__(self, socket, pwd='micro'): 8 | self.socket = socket 9 | self.discard_count = 0 10 | self.hello() 11 | self.accept = 0 12 | self.c_pwd = '' 13 | self.pwd = pwd 14 | 15 | 16 | def hello(self): 17 | 18 | self.socket.write(b"Hello Telnet from uPY") 19 | self.socket.write(b"\r\n") 20 | self.socket.write(b"Enter Password") 21 | self.socket.write(b"\r\n") 22 | 23 | 24 | def readinto(self, b): 25 | readbytes = 0 26 | for i in range(len(b)): 27 | try: 28 | byte = 0 29 | # discard telnet control characters and 30 | # null bytes 31 | while (byte == 0): 32 | byte = self.socket.recv(1)[0] 33 | if byte == 0xFF: 34 | self.discard_count = 2 35 | byte = 0 36 | elif self.discard_count > 0: 37 | self.discard_count -= 1 38 | byte = 0 39 | 40 | b[i] = byte 41 | 42 | readbytes += 1 43 | except (IndexError, OSError) as e: 44 | if type(e) == IndexError or len(e.args) > 0 and e.args[0] == errno.EAGAIN: 45 | if readbytes == 0: 46 | return None 47 | else: 48 | return readbytes 49 | else: 50 | return None 51 | 52 | if not self.accept: 53 | # print("1. ACCEPT", b) 54 | if b == b'\x03': 55 | self.close() 56 | return None 57 | 58 | if b == b'\r': #Enter detect 59 | if self.pwd == self.c_pwd: 60 | self.accept = 1 61 | self.socket.write(b"Welcome") 62 | self.socket.write(b"\r\n") 63 | else: 64 | self.socket.write(b"Wrong Password") 65 | self.socket.write(b"\r\n") 66 | self.c_pwd = '' 67 | else: 68 | 69 | try: 70 | self.c_pwd += bytes(b).decode() 71 | except: 72 | # print("ERROR:") 73 | self.c_pwd = '' 74 | pass 75 | 76 | # print("3. exit") 77 | return None 78 | 79 | return readbytes 80 | 81 | 82 | 83 | def write(self, data): 84 | if self.accept: 85 | while len(data) > 0: 86 | 87 | try: 88 | written_bytes = self.socket.write(data) 89 | data = data[written_bytes:] 90 | except OSError as e: 91 | if len(e.args) > 0 and e.args[0] == errno.EAGAIN: 92 | pass 93 | else: 94 | self.close() 95 | break 96 | 97 | def close(self): 98 | self.socket.close() 99 | -------------------------------------------------------------------------------- /projects/examples/1. ESP32_original/examples/basic_template/wifi/__init__.py: -------------------------------------------------------------------------------- 1 | import network 2 | import json 3 | import uasyncio as asyncio 4 | 5 | 6 | import logging 7 | log = logging.getLogger("WIFI") 8 | log.setLevel(logging.INFO) 9 | 10 | class WifiManager: 11 | 12 | def __init__(self, debug=True): 13 | self.debug = debug 14 | self.status = False 15 | self.status_ap = False 16 | 17 | @classmethod 18 | def accesspoint(self): 19 | return network.WLAN(network.AP_IF) 20 | 21 | @classmethod 22 | def wlan(self): 23 | return network.WLAN(network.STA_IF) 24 | 25 | 26 | def get_config(self, config_file='/networks.json', type="sta"): 27 | 28 | try: 29 | with open(config_file, "r") as f: 30 | config = json.loads(f.read()) 31 | 32 | if type == "sta": 33 | return config["known_networks"] 34 | if type == "ap": 35 | return config["access_point"] 36 | except: 37 | log.debug("Error : Cann't loading config file") 38 | return False 39 | 40 | 41 | 42 | # async def _scan(self): 43 | # scan = None 44 | # try: 45 | # scan = self.wlan().scan() 46 | # except: 47 | # pass 48 | # return scan 49 | 50 | async def sta_start(self): 51 | 52 | config_sta = self.get_config(type="sta") 53 | self.status = False 54 | self.status_ap = False 55 | self.wlan().active(True) 56 | self.ap_start() 57 | 58 | while True: 59 | 60 | if self.status: 61 | await asyncio.sleep(15) 62 | 63 | ip = self.wlan().ifconfig() 64 | await asyncio.sleep(10) 65 | 66 | if ip[0] == "0.0.0.0": 67 | self.status = False 68 | if not self.status_ap: 69 | self.accesspoint().active(True) 70 | self.status_ap = True 71 | 72 | for ssid, pwd in config_sta.items(): 73 | self.wlan().connect(ssid, pwd) 74 | 75 | await asyncio.sleep(15) 76 | 77 | ip = self.wlan().ifconfig() 78 | if ip[0] != "0.0.0.0": 79 | break 80 | 81 | 82 | if ip[0] != "0.0.0.0": 83 | self.status = True 84 | if self.status_ap: 85 | self.accesspoint().active(False) 86 | self.status_ap = False 87 | 88 | 89 | # scan = await self._scan() 90 | # 91 | # for ap in scan: 92 | # if ap[0].decode("utf-8") in config_sta.keys(): 93 | # self.wlan().connect(ap[0].decode("utf-8"), config_sta[ap[0].decode("utf-8")]) 94 | 95 | 96 | 97 | 98 | 99 | def ap_start(self): 100 | 101 | config_ap = self.get_config(type="ap") 102 | 103 | self.accesspoint().active(True) 104 | self.accesspoint().config(essid=config_ap["essid"]) 105 | self.accesspoint().config(authmode=config_ap["authmode"], 106 | password=config_ap["password"], 107 | channel=config_ap["channel"]) 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | -------------------------------------------------------------------------------- /projects/examples/1. ESP32_original/examples/basic_template/www/css.min.js: -------------------------------------------------------------------------------- 1 | define(function(){if("undefined"==typeof window)return{load:function(a,b,c){c()}};var a=document.getElementsByTagName("head")[0],b=window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/)||0,c=!1,d=!0;b[1]||b[7]?c=parseInt(b[1])<6||parseInt(b[7])<=9:b[2]||b[8]?d=!1:b[4]&&(c=parseInt(b[4])<18);var e={};e.pluginBuilder="./css-builder";var f,g,h,i=function(){f=document.createElement("style"),a.appendChild(f),g=f.styleSheet||f.sheet},j=0,k=[],l=function(a){g.addImport(a),f.onload=function(){m()},j++,31==j&&(i(),j=0)},m=function(){h();var a=k.shift();return a?(h=a[1],void l(a[0])):void(h=null)},n=function(a,b){if(g&&g.addImport||i(),g&&g.addImport)h?k.push([a,b]):(l(a),h=b);else{f.textContent='@import "'+a+'";';var c=setInterval(function(){try{f.sheet.cssRules,clearInterval(c),b()}catch(a){}},10)}},o=function(b,c){var e=document.createElement("link");if(e.type="text/css",e.rel="stylesheet",d)e.onload=function(){e.onload=function(){},setTimeout(c,7)};else var f=setInterval(function(){for(var a=0;a>> import dht # >>> import machine # >>> d = dht.DHT22(machine.Pin(4)) # Then measure and read their values with: # # >>> d.measure() # >>> d.temperature() # >>> d.humidity() # global debug # debug = False DHT_1_pin = 4 DHT_2_pin = 5 tim1 = Timer(-1) tim2 = Timer(-1) global dht_m dht_m = 1 temp_pred = 50 on = 1 off = 0 RELAYS = [machine.Pin(i, machine.Pin.OUT, value=off) for i in (12, 13)] def dht_measure(): global dht_m if dht_m == 1: dht_m = 2 try: dHT_1.measure() except OSError: print("Couldn't measure") if dht_m == 2: dht_m = 1 try: dHT_2.measure() except OSError: print("Couldn't measure") def dht_relay(): # RELAYS[0].value(on) # RELAYS[1].value(on) dHT_1_temp = float(dHT_1.temperature()) or 0.0 dHT_2_temp = float(dHT_2.temperature()) or 0.0 dHT_temp_a = [] if dHT_1_temp > 0.0: dHT_temp_a.append(dHT_1_temp) if dHT_2_temp > 0.0: dHT_temp_a.append(dHT_2_temp) dht_count = len(dHT_temp_a) if dht_count: dHT_temp = (float(dHT_1_temp)+float(dHT_2_temp))/dht_count print("temp avg: %s" % (dHT_temp)) if dHT_temp < temp_pred: print("Relay on:") RELAYS[0].value(on) RELAYS[1].value(on) if dHT_temp > temp_pred-5: print("Relay off:") RELAYS[0].value(off) RELAYS[1].value(off) else: print("Relay off:") RELAYS[0].value(off) RELAYS[1].value(off) def run_timer(): tim1.init(period=10000, mode=Timer.PERIODIC, callback=lambda t: dht_measure()) tim2.init(period=15000, mode=Timer.PERIODIC, callback=lambda t: dht_relay()) def main(): global dHT_1 global dHT_2 dHT_1 = dht.DHT22(machine.Pin(DHT_1_pin)) dHT_2 = dht.DHT22(machine.Pin(DHT_2_pin)) run_timer() if __name__ == '__main__': main() -------------------------------------------------------------------------------- /projects/examples/ESP-32_LORA_OLED/main.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | import si7021 4 | from machine import I2C, Pin, PWM 5 | 6 | tim3 = Timer(3) 7 | tim2 = Timer(2) 8 | 9 | 10 | 11 | # OLED 128x64 12 | import ssd1306 13 | 14 | 15 | 16 | def setup(): 17 | 18 | #OLED RESET PIN 19 | pin16 = machine.Pin(16, machine.Pin.OUT) 20 | pin16.value(1) 21 | 22 | #i2c = I2C(Pin(5), Pin(4)) #ESP8266 - ESP32 DEVKIT 23 | i2c = I2C(sda=Pin(4), scl=Pin(15)) 24 | 25 | global sensor_si 26 | sensor_si = si7021.SI7021(i2c, debug=True) 27 | 28 | global display 29 | display = ssd1306.SSD1306_I2C(128, 64, i2c) 30 | 31 | display.fill(0) 32 | display.text('HELLO', 0, 10) 33 | display.show() 34 | 35 | global ping 36 | ping = "" 37 | 38 | global si_temperature 39 | si_temperature = -251 40 | global si_humidity 41 | si_humidity = -251 42 | 43 | global pwm2 44 | #pwm2 = PWM(Pin(2), freq=2, duty=512) #ESP8266 - ESP32 DEVKIT 45 | pwm2 = PWM(Pin(25), freq=2, duty=512) #ESP32+LORA+OLED 46 | 47 | 48 | 49 | def pubm(): 50 | global si_temperature 51 | si_temperature = sensor_si.temperature 52 | 53 | global si_humidity 54 | si_humidity = sensor_si.humidity 55 | 56 | print(si_temperature) 57 | print(si_humidity) 58 | 59 | 60 | def oled_status(): 61 | 62 | global ping 63 | if ping == "": 64 | ping = "o" 65 | else: 66 | ping = "" 67 | 68 | global display 69 | display.fill(0) 70 | display.text(ping, 115, 10) 71 | display.text('T:' + str(si_temperature), 0, 10) 72 | display.text('H:' + str(si_humidity), 0, 20) 73 | display.show() 74 | 75 | 76 | def run_timer(): 77 | 78 | tim3.init(period=10000, mode=Timer.PERIODIC, callback=lambda t: pubm()) 79 | tim2.init(period=2000, mode=Timer.PERIODIC, callback=lambda t: oled_status()) 80 | 81 | 82 | def main(): 83 | run_timer() 84 | 85 | 86 | if __name__ == '__main__': 87 | setup() 88 | main() 89 | -------------------------------------------------------------------------------- /projects/examples/ESP-32_SeHttp_basic/main.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | from machine import Pin 4 | 5 | 6 | import time 7 | import ubinascii 8 | 9 | import machine 10 | import ubinascii 11 | import sys 12 | import gc 13 | import os 14 | import network 15 | 16 | 17 | import sehttp 18 | 19 | debug = True 20 | 21 | 22 | led2 = machine.Pin(2, machine.Pin.OUT) 23 | 24 | 25 | def led_control(_resPath, _queryParams): 26 | 27 | # DEBUG curl -i 'http://192.168.10.112/led?set=&state=' 28 | if debug: 29 | print("_queryParams =", _queryParams) 30 | 31 | if 'set' in _queryParams: 32 | 33 | set = _queryParams["set"] 34 | if set == "1" or set == "0": 35 | set = int(_queryParams["set"]) 36 | led2.value(set) 37 | else: 38 | led2.value(1) if led2.value() == 0 else led2.value(0) 39 | 40 | if 'state' in _queryParams: 41 | return {'state': led2.value()} 42 | 43 | 44 | 45 | def slider_control(_resPath, _queryParams): 46 | print(_resPath) 47 | print(_queryParams) 48 | 49 | def api_control(_resPath, _queryParams): 50 | 51 | #api?foo=1 , curl -i 'http://192.168.10.111/api?foo=1' 52 | if 'foo' in _queryParams: 53 | if _queryParams["foo"] == "1": 54 | return {'foo': 'bar'} 55 | 56 | def system_info(_resPath, _queryParams): 57 | respone = {} 58 | 59 | # curl -i 'http://192.168.10.111/system?memory=' 60 | if 'memory' in _queryParams: 61 | mem_alloc = gc.mem_alloc() 62 | mem_free = gc.mem_free() 63 | respone['memory'] = { 64 | 'mem_alloc': mem_alloc, 65 | 'mem_free': mem_free 66 | } 67 | 68 | print(respone) 69 | return respone 70 | 71 | _routeHandlers = [ 72 | ( "/led", "GET", led_control ), 73 | ( "/slider", "GET", slider_control ), 74 | ( "/api", "GET", api_control ), 75 | ( "/system", "GET", system_info ), 76 | 77 | ] 78 | 79 | c_sehttp = sehttp.SimpleHttp(port=80, web_path="/www", debug=True, route_handlers=_routeHandlers ) 80 | 81 | import _thread 82 | import ftp 83 | ftp = _thread.start_new_thread(ftp.ftpserver,()) 84 | 85 | def main(): 86 | 87 | c_sehttp.start() 88 | 89 | if __name__ == '__main__': 90 | main() 91 | -------------------------------------------------------------------------------- /projects/examples/ESP-32_SeHttp_basic/www/css.min.js: -------------------------------------------------------------------------------- 1 | define(function(){if("undefined"==typeof window)return{load:function(a,b,c){c()}};var a=document.getElementsByTagName("head")[0],b=window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/)||0,c=!1,d=!0;b[1]||b[7]?c=parseInt(b[1])<6||parseInt(b[7])<=9:b[2]||b[8]?d=!1:b[4]&&(c=parseInt(b[4])<18);var e={};e.pluginBuilder="./css-builder";var f,g,h,i=function(){f=document.createElement("style"),a.appendChild(f),g=f.styleSheet||f.sheet},j=0,k=[],l=function(a){g.addImport(a),f.onload=function(){m()},j++,31==j&&(i(),j=0)},m=function(){h();var a=k.shift();return a?(h=a[1],void l(a[0])):void(h=null)},n=function(a,b){if(g&&g.addImport||i(),g&&g.addImport)h?k.push([a,b]):(l(a),h=b);else{f.textContent='@import "'+a+'";';var c=setInterval(function(){try{f.sheet.cssRules,clearInterval(c),b()}catch(a){}},10)}},o=function(b,c){var e=document.createElement("link");if(e.type="text/css",e.rel="stylesheet",d)e.onload=function(){e.onload=function(){},setTimeout(c,7)};else var f=setInterval(function(){for(var a=0;a= delays: 38 | 39 | if self.value == "off": 40 | if self.relay: 41 | self.relay.change_state() 42 | self.value = "on" 43 | self.status = 1 44 | 45 | self.status = 10 46 | yield None 47 | 48 | else: 49 | self.value = "off" 50 | 51 | 52 | yield True 53 | 54 | 55 | 56 | def start(self): 57 | 58 | self.button = self.makebutton() # Generator start 59 | next(self.button) 60 | 61 | def stop(self): 62 | 63 | self.button = None # Generator stop 64 | 65 | @property 66 | def push(self): 67 | ''' 68 | T 69 | ''' 70 | self.status = 0 71 | try: 72 | next(self.button) 73 | except StopIteration: 74 | if self.debug: 75 | print("StopIteration") 76 | return -255 77 | 78 | value = self.status 79 | 80 | return value 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /projects/examples/ESP8266_18B20_Relay_Button_MQTT/relay_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | Relay Control with state 7 | ''' 8 | 9 | # init 10 | def __init__(self, name = None, pin_num = None, on_value=0,): 11 | self._relay = Pin(pin_num, Pin.OUT, on_value) 12 | self.on_value = on_value 13 | self.save_state = False 14 | self.state = self.get_state(on_value) 15 | self.cb = None 16 | self.name = name 17 | 18 | 19 | def set_state(self, reguest_value): 20 | self._relay.value(reguest_value) 21 | self.state = self.get_state() 22 | if self.cb: 23 | self.cb(self) 24 | 25 | def get_state(self, value = None): 26 | 27 | if not value: 28 | value = self._relay.value() 29 | 30 | if self.on_value == value: 31 | return "ON" 32 | else: 33 | return "OFF" 34 | 35 | def change_state(self): 36 | 37 | if self._relay.value() == 1: 38 | self._relay.value(0) 39 | else: 40 | self._relay.value(1) 41 | 42 | self.state = self.get_state() 43 | if self.cb: 44 | self.cb(self) 45 | 46 | 47 | def set_callback(self, f): 48 | self.cb = f 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /projects/examples/ESP8266_SeHttp/httpse/route_led.py: -------------------------------------------------------------------------------- 1 | 2 | class LedHandler: 3 | 4 | def __init__(self, debug=True, relay=None): 5 | self._debug = debug 6 | self._relay = relay 7 | self.route_handler = ("/led", "GET", self._handler) 8 | 9 | def _handler(self, res_path, query_params): 10 | response = {} 11 | 12 | # DEBUG curl -i 'http://192.168.10.112/led?set=&state=' 13 | if self._debug: 14 | print("_queryParams =", query_params) 15 | 16 | if 'set' in query_params: 17 | 18 | set = query_params["set"] 19 | if set == "1" or set == "0": 20 | set = int(query_params["set"]) 21 | self._relay.set_state(set) 22 | else: 23 | self._relay.change_state() 24 | 25 | if 'state' in query_params: 26 | response = {'state': self._relay.state} 27 | 28 | if self._debug: 29 | print("Response =", response) 30 | 31 | return response 32 | 33 | 34 | -------------------------------------------------------------------------------- /projects/examples/ESP8266_SeHttp/httpse/route_system.py: -------------------------------------------------------------------------------- 1 | import gc 2 | 3 | class SystemHandler: 4 | 5 | def __init__(self, debug=True): 6 | self._debug = debug 7 | self.route_handler = ("/system", "GET" ,self._handler) 8 | 9 | 10 | def _handler(self, res_path, query_params): 11 | response = {} 12 | 13 | if self._debug: 14 | print("Debug") 15 | 16 | # curl -i 'http://192.168.10.111/system?memory=' 17 | if 'memory' in query_params: 18 | response['memory'] = { 19 | 'mem_alloc': gc.mem_alloc(), 20 | 'mem_free': gc.mem_free() 21 | } 22 | return response 23 | 24 | 25 | -------------------------------------------------------------------------------- /projects/examples/ESP8266_SeHttp/httpse/runner.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | 4 | class ProcessRuner: 5 | 6 | def __init__(self, http_server=False ,timer_http=False, debug = True, run_period=100 ) : 7 | 8 | self._timer_http = timer_http 9 | self._debug = debug 10 | self._run_period = run_period 11 | self._http_server = http_server 12 | self._http_process = self._make_http_process() 13 | 14 | def _make_http_process(self): 15 | if self._debug: 16 | print("Make http process") 17 | while True: 18 | self._http_server.server_process() 19 | yield None 20 | 21 | def _run_http(self): 22 | try: 23 | next(self._http_process) 24 | except StopIteration: 25 | if self._debug: 26 | print("StopIteration") 27 | machine.reset() 28 | 29 | def run_timer(self): 30 | self._timer_http.init(period=self._run_period, mode=Timer.PERIODIC, callback=lambda t: self._run_http()) 31 | -------------------------------------------------------------------------------- /projects/examples/ESP8266_SeHttp/main.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | 4 | from httpse import SimpleHttp 5 | from httpse.runner import ProcessRuner 6 | from httpse.route_system import SystemHandler 7 | from httpse.route_led import LedHandler 8 | from relay_control import RELAY 9 | from mqttse import MQTTClient 10 | 11 | import ubinascii 12 | 13 | client_id = b"esp8266_" + ubinascii.hexlify(machine.unique_id()) 14 | 15 | CONFIG = { 16 | "broker": '192.168.2.153', 17 | "port" : 1883, 18 | "sensor_pin": 14, 19 | "delay_between_message" : -500, 20 | "client_id": client_id, 21 | "r1_mode": "OFF", 22 | "r1_tmax": 20.5, 23 | "r1_tmin": 18, 24 | "topic": b"devices/"+client_id+"/#", 25 | "ping" : b"devices/"+client_id+"/ping", 26 | "sw1_set" : b"devices/"+client_id+"/sw1/set", 27 | "sw1_state" : b"devices/"+client_id+"/sw1/state", 28 | "sw2_set": b"devices/" + client_id + "/sw2/set", 29 | "sw2_state": b"devices/" + client_id + "/sw2/state", 30 | "DS18B20": b"devices/" + client_id + "/18b20", 31 | "t_ctr_r1_mode_set": b"devices/" + client_id + "/t_ctr_r1/mode/set", 32 | "t_ctr_r1_mode_state": b"devices/" + client_id + "/t_ctr_r1/mode/state", 33 | "t_ctr_r1_max": b"devices/" + client_id + "/t_ctr_r1/max", 34 | "t_ctr_r1_min": b"devices/" + client_id + "/t_ctr_r1/min", 35 | "m_delay": b"devices/" + client_id + "/m_delay", 36 | 37 | } 38 | 39 | def load_config(): 40 | import ujson as json 41 | try: 42 | with open("/config.json") as f: 43 | config = json.loads(f.read()) 44 | except (OSError, ValueError): 45 | print("Couldn't load /config.json") 46 | save_config() 47 | else: 48 | CONFIG.update(config) 49 | print("Loaded config from /config.json") 50 | 51 | def save_config(): 52 | import ujson as json 53 | try: 54 | with open("/config.json", "w") as f: 55 | f.write(json.dumps(CONFIG)) 56 | except OSError: 57 | print("Couldn't save /config.json") 58 | 59 | 60 | try: 61 | c_mqtt = MQTTClient(CONFIG['client_id'], CONFIG['broker'], CONFIG['port'], timeout=1, sbt=CONFIG['topic'], 62 | debug=False) 63 | 64 | except (OSError, ValueError): 65 | print("Couldn't connect to MQTT") 66 | 67 | timer_http = Timer(-1) 68 | _debug = True 69 | _routeHandlers = [] 70 | 71 | #System 72 | _routeHandlers.append(SystemHandler(debug=_debug).route_handler) 73 | 74 | 75 | #Led 76 | LED_2_pin = 2 77 | LED_2 = RELAY(name="Led2", pin_num=LED_2_pin, on_value=0, off_value=1, state_on=1, state_off=0, default=1) 78 | _routeHandlers.append(LedHandler(debug=_debug, relay=LED_2).route_handler) 79 | 80 | 81 | def main(): 82 | if _debug: 83 | print("Routes = %s" % _routeHandlers) 84 | 85 | server_sehttp = SimpleHttp(port=80, web_path="/www", debug=_debug, route_handlers=_routeHandlers) 86 | server_sehttp.start() 87 | 88 | if server_sehttp.started: 89 | server_sehttp_runner = ProcessRuner(http_server=server_sehttp, timer_http=timer_http, debug=_debug,run_period=100) 90 | server_sehttp_runner.run_timer() 91 | 92 | 93 | 94 | def ftp(): 95 | import ftp 96 | ftp.ftpserver() 97 | 98 | if __name__ == '__main__': 99 | main() 100 | 101 | # _routeHandlers = [ 102 | # ( "/led", "GET", led_control ), 103 | # ( "/slider", "GET", slider_control ), 104 | # ( "/api", "GET", api_control ), 105 | # ( "/system", "GET", system_info ), 106 | # 107 | # ] -------------------------------------------------------------------------------- /projects/examples/ESP8266_SeHttp/relay_control/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | Relay Control with state 7 | ''' 8 | 9 | # init 10 | def __init__(self, name = None, pin_num = None, on_value=1, off_value=0, state_on="ON", state_off="OFF", default = 0): 11 | self._relay = Pin(pin_num, Pin.OUT) 12 | self.on_value = on_value 13 | self.off_value = off_value 14 | self.cb = None 15 | self.name = name 16 | self.state_on = state_on 17 | self.state_off = state_off 18 | self.set_state(default) 19 | self.state = self.get_state() 20 | 21 | def save_state(self): 22 | self.state = self.get_state() 23 | if self.cb: 24 | self.cb(self) 25 | 26 | def set_state(self, reguest_value): 27 | self._relay.value(reguest_value) 28 | self.save_state() 29 | 30 | def get_state(self): 31 | 32 | if self.on_value == self._relay.value(): 33 | return self.state_on 34 | else: 35 | return self.state_off 36 | 37 | def change_state(self): 38 | 39 | if self._relay.value() == 1: 40 | self._relay.value(0) 41 | else: 42 | self._relay.value(1) 43 | 44 | self.save_state() 45 | 46 | 47 | def set_callback(self, f): 48 | self.cb = f 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /projects/examples/ESP8266_SeHttp/www/css.min.js: -------------------------------------------------------------------------------- 1 | define(function(){if("undefined"==typeof window)return{load:function(a,b,c){c()}};var a=document.getElementsByTagName("head")[0],b=window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/)||0,c=!1,d=!0;b[1]||b[7]?c=parseInt(b[1])<6||parseInt(b[7])<=9:b[2]||b[8]?d=!1:b[4]&&(c=parseInt(b[4])<18);var e={};e.pluginBuilder="./css-builder";var f,g,h,i=function(){f=document.createElement("style"),a.appendChild(f),g=f.styleSheet||f.sheet},j=0,k=[],l=function(a){g.addImport(a),f.onload=function(){m()},j++,31==j&&(i(),j=0)},m=function(){h();var a=k.shift();return a?(h=a[1],void l(a[0])):void(h=null)},n=function(a,b){if(g&&g.addImport||i(),g&&g.addImport)h?k.push([a,b]):(l(a),h=b);else{f.textContent='@import "'+a+'";';var c=setInterval(function(){try{f.sheet.cssRules,clearInterval(c),b()}catch(a){}},10)}},o=function(b,c){var e=document.createElement("link");if(e.type="text/css",e.rel="stylesheet",d)e.onload=function(){e.onload=function(){},setTimeout(c,7)};else var f=setInterval(function(){for(var a=0;amqtt_realy 11 | 12 | only Realy 13 | 14 | mqtt->relay_18B20 15 | 16 | realy + 18B20 17 | 18 | mqtt->mqtt_si_bmp 19 | 20 | SI7021 + BMP180 -------------------------------------------------------------------------------- /projects/examples/S20_relay_control_R1_B1/README.md: -------------------------------------------------------------------------------- 1 | #Test for Relay 2 | 3 | Home Assistant Config Example 4 | 5 | ``` yaml 6 | 7 | mqtt: 8 | broker: 192.168.2.153 9 | 10 | 11 | 12 | switch 1: 13 | - platform: mqtt 14 | name: "SW1" 15 | state_topic: "devices/esp8266_D_e302ee00/sw1/state" 16 | command_topic: "devices/esp8266_D_e302ee00/sw1/set" 17 | payload_on: "ON" 18 | payload_off: "OFF" 19 | optimistic: false 20 | qos: 0 21 | 22 | switch 11: 23 | - platform: mqtt 24 | name: "SW1 manual" 25 | state_topic: "devices/esp8266_D_e302ee00/sw1/state" 26 | command_topic: "devices/esp8266_D_e302ee00/sw1/set" 27 | payload_on: "ON" 28 | payload_off: "OFF" 29 | optimistic: true 30 | qos: 0 31 | retain: true 32 | 33 | switch 2: 34 | - platform: mqtt 35 | name: "SW2" 36 | state_topic: "devices/esp8266_D_e302ee00/sw2/state" 37 | command_topic: "devices/esp8266_D_e302ee00/sw2/set" 38 | payload_on: "ON" 39 | payload_off: "OFF" 40 | optimistic: false 41 | qos: 0 42 | 43 | switch 22: 44 | - platform: mqtt 45 | name: "SW2 manual" 46 | state_topic: "devices/esp8266_D_e302ee00/sw2/state" 47 | command_topic: "devices/esp8266_D_e302ee00/sw2/set" 48 | payload_on: "ON" 49 | payload_off: "OFF" 50 | optimistic: True 51 | qos: 0 52 | retain: True 53 | 54 | sensor 1: 55 | platform: mqtt 56 | name: "Temperature" 57 | state_topic: "devices/esp8266_D_e302ee00/18b20" 58 | qos: 0 59 | unit_of_measurement: "ºC" 60 | 61 | 62 | input_select: 63 | r1_thermostat_mode: 64 | name: R1 Thermostat Mode 65 | options: 66 | - "AUTO" 67 | - "M_T" 68 | - "OFF" 69 | icon: mdi:target 70 | 71 | 72 | automation: 73 | - alias: Set R1 Thermostat Mode Selector 74 | trigger: 75 | platform: mqtt 76 | topic: "devices/esp8266_D_e302ee00/t_ctr_r1/mode/set" 77 | action: 78 | service: input_select.select_option 79 | data_template: 80 | entity_id: input_select.r1_thermostat_mode 81 | option: '{{ trigger.payload }}' 82 | 83 | - alias: Set Thermostat Mode 84 | trigger: 85 | platform: state 86 | entity_id: input_select.r1_thermostat_mode 87 | action: 88 | service: mqtt.publish 89 | data_template: 90 | topic: "devices/esp8266_D_e302ee00/t_ctr_r1/mode/set" 91 | retain: true 92 | payload: '{{ states.input_select.r1_thermostat_mode.state }}' 93 | ``` -------------------------------------------------------------------------------- /projects/examples/S20_relay_control_R1_B1/button_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | 5 | class PinButton: 6 | ''' 7 | B 8 | ''' 9 | 10 | # init 11 | def __init__(self, pinNum, Pull, debug=False, relay_control=None, on_value=0): 12 | 13 | self._pin = Pin(pinNum, Pin.IN, Pull ) 14 | 15 | self.debug = debug 16 | self.status = 0 17 | 18 | self.value = "off" 19 | self._value = None 20 | 21 | self.relay = relay_control 22 | self.button = None 23 | 24 | self.on_value = on_value 25 | 26 | 27 | def makebutton(self): 28 | 29 | delays = -200 # mS delay 30 | 31 | while True: 32 | 33 | t_start = time.ticks_ms() 34 | self.status = 1 35 | 36 | if self._pin.value() == self.on_value: 37 | while time.ticks_diff(t_start, time.ticks_ms()) >= delays: 38 | 39 | if self.value == "off": 40 | if self.relay: 41 | self.relay.change_state() 42 | self.value = "on" 43 | self.status = 1 44 | 45 | self.status = 10 46 | yield None 47 | 48 | else: 49 | self.value = "off" 50 | 51 | 52 | yield True 53 | 54 | 55 | 56 | def start(self): 57 | 58 | self.button = self.makebutton() # Generator start 59 | next(self.button) 60 | 61 | def stop(self): 62 | 63 | self.button = None # Generator stop 64 | 65 | @property 66 | def push(self): 67 | ''' 68 | T 69 | ''' 70 | self.status = 0 71 | try: 72 | next(self.button) 73 | except StopIteration: 74 | if self.debug: 75 | print("StopIteration") 76 | return -255 77 | 78 | value = self.status 79 | 80 | return value 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /projects/examples/S20_relay_control_R1_B1/relay_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | from machine import Pin, PWM 4 | 5 | # pwm2 = PWM(Pin(12), freq=100, duty=1000) 6 | 7 | 8 | class RELAY: 9 | ''' 10 | Relay Control with state 11 | ''' 12 | 13 | # init 14 | def __init__(self, name = None, pin_num = None, on_value=0,): 15 | self._relay = PWM(Pin(pin_num), freq=100, duty=on_value) 16 | self.on_value = on_value 17 | self.save_state = False 18 | self.state = self.get_state(on_value) 19 | self.cb = None 20 | self.name = name 21 | 22 | 23 | def set_state(self, reguest_value): 24 | self._relay.duty(reguest_value) 25 | self.state = self.get_state() 26 | if self.cb: 27 | self.cb(self) 28 | 29 | def get_state(self, value = None): 30 | 31 | if not value: 32 | value = self._relay.duty() 33 | 34 | if self.on_value == value: 35 | return "ON" 36 | else: 37 | return "OFF" 38 | 39 | def change_state(self): 40 | 41 | if self._relay.duty() > 1000: 42 | self._relay.duty(0) 43 | else: 44 | self._relay.duty(1024) 45 | 46 | self.state = self.get_state() 47 | if self.cb: 48 | self.cb(self) 49 | 50 | 51 | def set_callback(self, f): 52 | self.cb = f 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /projects/examples/async/config.py: -------------------------------------------------------------------------------- 1 | def load_config(CONFIG): 2 | import ujson as json 3 | try: 4 | with open("/config.json") as f: 5 | config = json.loads(f.read()) 6 | except (OSError, ValueError): 7 | print("Couldn't load /config.json") 8 | save_config() 9 | else: 10 | CONFIG.update(config) 11 | print("Loaded config from /config.json") 12 | 13 | 14 | def save_config(): 15 | import ujson as json 16 | try: 17 | with open("/config.json", "w") as f: 18 | f.write(json.dumps(CONFIG)) 19 | except OSError: 20 | print("Couldn't save /config.json") -------------------------------------------------------------------------------- /projects/examples/dragon_button_relay_push_only/main.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Timer 3 | from machine import Pin 4 | import pinButton 5 | 6 | b2 = pinButton.PinButton(2, Pin.PULL_UP, debug=True, relay_control=12) 7 | b0 = pinButton.PinButton(0, Pin.PULL_UP, debug=True, relay_control=13) 8 | 9 | b0.start() 10 | b2.start() 11 | 12 | tim1 = Timer(-1) 13 | 14 | def push(): 15 | 16 | b0.push 17 | b2.push 18 | 19 | def run_timer(): 20 | 21 | tim1.init(period=500, mode=Timer.PERIODIC, callback=lambda t: push()) 22 | 23 | def main(): 24 | 25 | run_timer() 26 | 27 | if __name__ == '__main__': 28 | main() -------------------------------------------------------------------------------- /projects/examples/dragon_button_relay_push_only/pinButton.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | import relay 5 | 6 | 7 | class PinButton: 8 | ''' 9 | B 10 | ''' 11 | 12 | # init 13 | def __init__(self, pinNum, Pull, debug=False, relay_control=None): 14 | 15 | self._pin = Pin(pinNum, Pin.IN, Pull ) 16 | 17 | self.debug = debug 18 | self.status = 0 19 | 20 | self.value = None 21 | self._value = None 22 | 23 | 24 | self.relay = relay.RELAY(relay_control) 25 | 26 | self.button = None # Generator instance 27 | 28 | # self.button = self.makebutton() # Generator instance 29 | # 30 | # next(self.button) 31 | 32 | # for _ in range(128): 33 | # next(self.button) 34 | # time.sleep_ms(1) 35 | 36 | def makebutton(self): 37 | 38 | delays = -25 # mS delay 39 | 40 | while True: 41 | 42 | self._value = self._pin.value() 43 | t_start = time.ticks_ms() 44 | self.status = 1 45 | 46 | if self._value == 0: 47 | while time.ticks_diff(t_start, time.ticks_ms()) <= delays: 48 | self.status = 10 49 | yield None 50 | 51 | self.relay.set_state(1) 52 | self.value = self._value 53 | self.status = 11 54 | else: 55 | self.value = 1 56 | self.relay.set_state(0) 57 | self.status = 12 58 | 59 | 60 | yield None 61 | 62 | def start(self): 63 | 64 | self.button = self.makebutton() # Generator instance 65 | next(self.button) 66 | 67 | def stop(self): 68 | 69 | self.button = None # Generator instance 70 | 71 | 72 | 73 | 74 | @property 75 | def push(self): 76 | ''' 77 | T 78 | ''' 79 | try: 80 | next(self.button) 81 | except StopIteration: 82 | if self.debug: 83 | print("StopIteration") 84 | return -255 85 | 86 | value = self.value 87 | if self.status == 0: 88 | value = -1 89 | 90 | return value 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /projects/examples/dragon_button_relay_push_only/relay.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | B 7 | ''' 8 | 9 | # init 10 | def __init__(self, pin_num, d_value=0): 11 | self._relay = Pin(pin_num, Pin.OUT, d_value ) 12 | 13 | def set_state(self, reguest_value): 14 | self._relay.value(reguest_value) 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /projects/examples/dragon_button_relay_state_save/main.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Timer 3 | from machine import Pin 4 | import pinButton 5 | 6 | b2 = pinButton.PinButton(2, Pin.PULL_UP, debug=True, relay_control=12) 7 | b0 = pinButton.PinButton(0, Pin.PULL_UP, debug=True, relay_control=13) 8 | 9 | b0.start() 10 | b2.start() 11 | 12 | tim1 = Timer(-1) 13 | 14 | def push(): 15 | 16 | b0.push 17 | b2.push 18 | 19 | def run_timer(): 20 | 21 | tim1.init(period=500, mode=Timer.PERIODIC, callback=lambda t: push()) 22 | 23 | def main(): 24 | 25 | run_timer() 26 | 27 | if __name__ == '__main__': 28 | main() -------------------------------------------------------------------------------- /projects/examples/dragon_button_relay_state_save/pinButton.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | import relay 5 | 6 | 7 | class PinButton: 8 | ''' 9 | B 10 | ''' 11 | 12 | # init 13 | def __init__(self, pinNum, Pull, debug=False, relay_control=None): 14 | 15 | self._pin = Pin(pinNum, Pin.IN, Pull ) 16 | 17 | self.debug = debug 18 | self.status = 0 19 | 20 | self.value = None 21 | self._value = None 22 | 23 | self.relay = relay.RELAY(relay_control) 24 | self.button = None 25 | 26 | def makebutton(self): 27 | 28 | delays = -20 # mS delay 29 | 30 | while True: 31 | 32 | self._value = self._pin.value() 33 | t_start = time.ticks_ms() 34 | self.status = 1 35 | 36 | if self._value == 0: 37 | while time.ticks_diff(t_start, time.ticks_ms()) <= delays: 38 | self.status = 10 39 | yield None 40 | 41 | self.relay.save_state() 42 | self.value = self._value 43 | self.status = 1 44 | 45 | #self.relay.set_state(1) 46 | #self.value = self._value 47 | #self.status = 11 48 | # else: 49 | # self.value = 1 50 | # self.relay.set_state(0) 51 | # self.status = 12 52 | 53 | 54 | yield None 55 | 56 | def start(self): 57 | 58 | self.button = self.makebutton() # Generator instance 59 | next(self.button) 60 | 61 | def stop(self): 62 | 63 | self.button = None # Generator instance 64 | 65 | 66 | 67 | 68 | @property 69 | def push(self): 70 | ''' 71 | T 72 | ''' 73 | try: 74 | next(self.button) 75 | except StopIteration: 76 | if self.debug: 77 | print("StopIteration") 78 | return -255 79 | 80 | value = self.value 81 | if self.status == 0: 82 | value = -1 83 | 84 | return value 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /projects/examples/dragon_button_relay_state_save/relay.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | B 7 | ''' 8 | 9 | # init 10 | def __init__(self, pin_num, d_value=0): 11 | self._relay = Pin(pin_num, Pin.OUT, d_value ) 12 | 13 | def set_state(self, reguest_value): 14 | self._relay.value(reguest_value) 15 | 16 | 17 | def save_state(self): 18 | 19 | if self._relay.value() == 1: 20 | self._relay.value(0) 21 | else: 22 | self._relay.value(1) 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay/README.md: -------------------------------------------------------------------------------- 1 | #Test for Relay 2 | 3 | Home Assistant Config Example 4 | 5 | ``` yaml 6 | 7 | mqtt: 8 | broker: 192.168.2.153 9 | 10 | 11 | 12 | switch 1: 13 | - platform: mqtt 14 | name: "SW1" 15 | state_topic: "devices/esp8266_D_e302ee00/sw1/state" 16 | command_topic: "devices/esp8266_D_e302ee00/sw1/set" 17 | payload_on: "ON" 18 | payload_off: "OFF" 19 | optimistic: false 20 | qos: 0 21 | 22 | switch 11: 23 | - platform: mqtt 24 | name: "SW1 manual" 25 | state_topic: "devices/esp8266_D_e302ee00/sw1/state" 26 | command_topic: "devices/esp8266_D_e302ee00/sw1/set" 27 | payload_on: "ON" 28 | payload_off: "OFF" 29 | optimistic: true 30 | qos: 0 31 | retain: true 32 | 33 | switch 2: 34 | - platform: mqtt 35 | name: "SW2" 36 | state_topic: "devices/esp8266_D_e302ee00/sw2/state" 37 | command_topic: "devices/esp8266_D_e302ee00/sw2/set" 38 | payload_on: "ON" 39 | payload_off: "OFF" 40 | optimistic: false 41 | qos: 0 42 | 43 | switch 22: 44 | - platform: mqtt 45 | name: "SW2 manual" 46 | state_topic: "devices/esp8266_D_e302ee00/sw2/state" 47 | command_topic: "devices/esp8266_D_e302ee00/sw2/set" 48 | payload_on: "ON" 49 | payload_off: "OFF" 50 | optimistic: True 51 | qos: 0 52 | retain: True 53 | 54 | sensor 1: 55 | platform: mqtt 56 | name: "Temperature" 57 | state_topic: "devices/esp8266_D_e302ee00/18b20" 58 | qos: 0 59 | unit_of_measurement: "ºC" 60 | 61 | ``` -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay/button_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | 5 | class PinButton: 6 | ''' 7 | B 8 | ''' 9 | 10 | # init 11 | def __init__(self, pinNum, Pull, debug=False, relay_control=None, on_value=0): 12 | 13 | self._pin = Pin(pinNum, Pin.IN, Pull ) 14 | 15 | self.debug = debug 16 | self.status = 0 17 | 18 | self.value = "off" 19 | self._value = None 20 | 21 | self.relay = relay_control 22 | self.button = None 23 | 24 | self.on_value = on_value 25 | 26 | 27 | def makebutton(self): 28 | 29 | delays = -200 # mS delay 30 | 31 | while True: 32 | 33 | t_start = time.ticks_ms() 34 | self.status = 1 35 | 36 | if self._pin.value() == self.on_value: 37 | while time.ticks_diff(t_start, time.ticks_ms()) >= delays: 38 | 39 | if self.value == "off": 40 | if self.relay: 41 | self.relay.change_state() 42 | self.value = "on" 43 | self.status = 1 44 | 45 | self.status = 10 46 | yield None 47 | 48 | else: 49 | self.value = "off" 50 | 51 | 52 | yield True 53 | 54 | 55 | 56 | def start(self): 57 | 58 | self.button = self.makebutton() # Generator start 59 | next(self.button) 60 | 61 | def stop(self): 62 | 63 | self.button = None # Generator stop 64 | 65 | @property 66 | def push(self): 67 | ''' 68 | T 69 | ''' 70 | self.status = 0 71 | try: 72 | next(self.button) 73 | except StopIteration: 74 | if self.debug: 75 | print("StopIteration") 76 | return -255 77 | 78 | value = self.status 79 | 80 | return value 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay/relay_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | Relay Control with state 7 | ''' 8 | 9 | # init 10 | def __init__(self, name = None, pin_num = None, on_value=0,): 11 | self._relay = Pin(pin_num, Pin.OUT, on_value) 12 | self.on_value = on_value 13 | self.save_state = False 14 | self.state = self.get_state(on_value) 15 | self.cb = None 16 | self.name = name 17 | 18 | 19 | def set_state(self, reguest_value): 20 | self._relay.value(reguest_value) 21 | self.state = self.get_state() 22 | if self.cb: 23 | self.cb(self) 24 | 25 | def get_state(self, value = None): 26 | 27 | if not value: 28 | value = self._relay.value() 29 | 30 | if self.on_value == value: 31 | return "ON" 32 | else: 33 | return "OFF" 34 | 35 | def change_state(self): 36 | 37 | if self._relay.value() == 1: 38 | self._relay.value(0) 39 | else: 40 | self._relay.value(1) 41 | 42 | self.state = self.get_state() 43 | if self.cb: 44 | self.cb(self) 45 | 46 | 47 | def set_callback(self, f): 48 | self.cb = f 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay_18B20/README.md: -------------------------------------------------------------------------------- 1 | #Test for Relay 2 | 3 | Home Assistant Config Example 4 | 5 | ``` yaml 6 | 7 | mqtt: 8 | broker: 192.168.2.153 9 | 10 | 11 | 12 | switch 1: 13 | - platform: mqtt 14 | name: "SW1" 15 | state_topic: "devices/esp8266_D_e302ee00/sw1/state" 16 | command_topic: "devices/esp8266_D_e302ee00/sw1/set" 17 | payload_on: "ON" 18 | payload_off: "OFF" 19 | optimistic: false 20 | qos: 0 21 | 22 | switch 11: 23 | - platform: mqtt 24 | name: "SW1 manual" 25 | state_topic: "devices/esp8266_D_e302ee00/sw1/state" 26 | command_topic: "devices/esp8266_D_e302ee00/sw1/set" 27 | payload_on: "ON" 28 | payload_off: "OFF" 29 | optimistic: true 30 | qos: 0 31 | retain: true 32 | 33 | switch 2: 34 | - platform: mqtt 35 | name: "SW2" 36 | state_topic: "devices/esp8266_D_e302ee00/sw2/state" 37 | command_topic: "devices/esp8266_D_e302ee00/sw2/set" 38 | payload_on: "ON" 39 | payload_off: "OFF" 40 | optimistic: false 41 | qos: 0 42 | 43 | switch 22: 44 | - platform: mqtt 45 | name: "SW2 manual" 46 | state_topic: "devices/esp8266_D_e302ee00/sw2/state" 47 | command_topic: "devices/esp8266_D_e302ee00/sw2/set" 48 | payload_on: "ON" 49 | payload_off: "OFF" 50 | optimistic: True 51 | qos: 0 52 | retain: True 53 | 54 | sensor 1: 55 | platform: mqtt 56 | name: "Temperature" 57 | state_topic: "devices/esp8266_D_e302ee00/18b20" 58 | qos: 0 59 | unit_of_measurement: "ºC" 60 | 61 | ``` -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay_18B20/button_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | 5 | class PinButton: 6 | ''' 7 | B 8 | ''' 9 | 10 | # init 11 | def __init__(self, pinNum, Pull, debug=False, relay_control=None, on_value=0): 12 | 13 | self._pin = Pin(pinNum, Pin.IN, Pull ) 14 | 15 | self.debug = debug 16 | self.status = 0 17 | 18 | self.value = "off" 19 | self._value = None 20 | 21 | self.relay = relay_control 22 | self.button = None 23 | 24 | self.on_value = on_value 25 | 26 | 27 | def makebutton(self): 28 | 29 | delays = -200 # mS delay 30 | 31 | while True: 32 | 33 | t_start = time.ticks_ms() 34 | self.status = 1 35 | 36 | if self._pin.value() == self.on_value: 37 | while time.ticks_diff(t_start, time.ticks_ms()) >= delays: 38 | 39 | if self.value == "off": 40 | if self.relay: 41 | self.relay.change_state() 42 | self.value = "on" 43 | self.status = 1 44 | 45 | self.status = 10 46 | yield None 47 | 48 | else: 49 | self.value = "off" 50 | 51 | 52 | yield True 53 | 54 | 55 | 56 | def start(self): 57 | 58 | self.button = self.makebutton() # Generator start 59 | next(self.button) 60 | 61 | def stop(self): 62 | 63 | self.button = None # Generator stop 64 | 65 | @property 66 | def push(self): 67 | ''' 68 | T 69 | ''' 70 | self.status = 0 71 | try: 72 | next(self.button) 73 | except StopIteration: 74 | if self.debug: 75 | print("StopIteration") 76 | return -255 77 | 78 | value = self.status 79 | 80 | return value 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay_18B20/relay_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | Relay Control with state 7 | ''' 8 | 9 | # init 10 | def __init__(self, name = None, pin_num = None, on_value=0,): 11 | self._relay = Pin(pin_num, Pin.OUT, on_value) 12 | self.on_value = on_value 13 | self.save_state = False 14 | self.state = self.get_state(on_value) 15 | self.cb = None 16 | self.name = name 17 | 18 | 19 | def set_state(self, reguest_value): 20 | self._relay.value(reguest_value) 21 | self.state = self.get_state() 22 | if self.cb: 23 | self.cb(self) 24 | 25 | def get_state(self, value = None): 26 | 27 | if not value: 28 | value = self._relay.value() 29 | 30 | if self.on_value == value: 31 | return "ON" 32 | else: 33 | return "OFF" 34 | 35 | def change_state(self): 36 | 37 | if self._relay.value() == 1: 38 | self._relay.value(0) 39 | else: 40 | self._relay.value(1) 41 | 42 | self.state = self.get_state() 43 | if self.cb: 44 | self.cb(self) 45 | 46 | 47 | def set_callback(self, f): 48 | self.cb = f 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay_18B20_T_control_R1/README.md: -------------------------------------------------------------------------------- 1 | #Test for Relay 2 | 3 | Home Assistant Config Example 4 | 5 | ``` yaml 6 | 7 | mqtt: 8 | broker: 192.168.2.153 9 | 10 | 11 | 12 | switch 1: 13 | - platform: mqtt 14 | name: "SW1" 15 | state_topic: "devices/esp8266_D_e302ee00/sw1/state" 16 | command_topic: "devices/esp8266_D_e302ee00/sw1/set" 17 | payload_on: "ON" 18 | payload_off: "OFF" 19 | optimistic: false 20 | qos: 0 21 | 22 | switch 11: 23 | - platform: mqtt 24 | name: "SW1 manual" 25 | state_topic: "devices/esp8266_D_e302ee00/sw1/state" 26 | command_topic: "devices/esp8266_D_e302ee00/sw1/set" 27 | payload_on: "ON" 28 | payload_off: "OFF" 29 | optimistic: true 30 | qos: 0 31 | retain: true 32 | 33 | switch 2: 34 | - platform: mqtt 35 | name: "SW2" 36 | state_topic: "devices/esp8266_D_e302ee00/sw2/state" 37 | command_topic: "devices/esp8266_D_e302ee00/sw2/set" 38 | payload_on: "ON" 39 | payload_off: "OFF" 40 | optimistic: false 41 | qos: 0 42 | 43 | switch 22: 44 | - platform: mqtt 45 | name: "SW2 manual" 46 | state_topic: "devices/esp8266_D_e302ee00/sw2/state" 47 | command_topic: "devices/esp8266_D_e302ee00/sw2/set" 48 | payload_on: "ON" 49 | payload_off: "OFF" 50 | optimistic: True 51 | qos: 0 52 | retain: True 53 | 54 | sensor 1: 55 | platform: mqtt 56 | name: "Temperature" 57 | state_topic: "devices/esp8266_D_e302ee00/18b20" 58 | qos: 0 59 | unit_of_measurement: "ºC" 60 | 61 | 62 | input_select: 63 | r1_thermostat_mode: 64 | name: R1 Thermostat Mode 65 | options: 66 | - "AUTO" 67 | - "M_T" 68 | - "OFF" 69 | icon: mdi:target 70 | 71 | 72 | automation: 73 | - alias: Set R1 Thermostat Mode Selector 74 | trigger: 75 | platform: mqtt 76 | topic: "devices/esp8266_D_e302ee00/t_ctr_r1/mode/set" 77 | action: 78 | service: input_select.select_option 79 | data_template: 80 | entity_id: input_select.r1_thermostat_mode 81 | option: '{{ trigger.payload }}' 82 | 83 | - alias: Set Thermostat Mode 84 | trigger: 85 | platform: state 86 | entity_id: input_select.r1_thermostat_mode 87 | action: 88 | service: mqtt.publish 89 | data_template: 90 | topic: "devices/esp8266_D_e302ee00/t_ctr_r1/mode/set" 91 | retain: true 92 | payload: '{{ states.input_select.r1_thermostat_mode.state }}' 93 | ``` -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay_18B20_T_control_R1/button_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | 5 | class PinButton: 6 | ''' 7 | B 8 | ''' 9 | 10 | # init 11 | def __init__(self, pinNum, Pull, debug=False, relay_control=None, on_value=0): 12 | 13 | self._pin = Pin(pinNum, Pin.IN, Pull ) 14 | 15 | self.debug = debug 16 | self.status = 0 17 | 18 | self.value = "off" 19 | self._value = None 20 | 21 | self.relay = relay_control 22 | self.button = None 23 | 24 | self.on_value = on_value 25 | 26 | 27 | def makebutton(self): 28 | 29 | delays = -200 # mS delay 30 | 31 | while True: 32 | 33 | t_start = time.ticks_ms() 34 | self.status = 1 35 | 36 | if self._pin.value() == self.on_value: 37 | while time.ticks_diff(t_start, time.ticks_ms()) >= delays: 38 | 39 | if self.value == "off": 40 | if self.relay: 41 | self.relay.change_state() 42 | self.value = "on" 43 | self.status = 1 44 | 45 | self.status = 10 46 | yield None 47 | 48 | else: 49 | self.value = "off" 50 | 51 | 52 | yield True 53 | 54 | 55 | 56 | def start(self): 57 | 58 | self.button = self.makebutton() # Generator start 59 | next(self.button) 60 | 61 | def stop(self): 62 | 63 | self.button = None # Generator stop 64 | 65 | @property 66 | def push(self): 67 | ''' 68 | T 69 | ''' 70 | self.status = 0 71 | try: 72 | next(self.button) 73 | except StopIteration: 74 | if self.debug: 75 | print("StopIteration") 76 | return -255 77 | 78 | value = self.status 79 | 80 | return value 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay_18B20_T_control_R1/relay_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | Relay Control with state 7 | ''' 8 | 9 | # init 10 | def __init__(self, name = None, pin_num = None, on_value=0,): 11 | self._relay = Pin(pin_num, Pin.OUT, on_value) 12 | self.on_value = on_value 13 | self.save_state = False 14 | self.state = self.get_state(on_value) 15 | self.cb = None 16 | self.name = name 17 | 18 | 19 | def set_state(self, reguest_value): 20 | self._relay.value(reguest_value) 21 | self.state = self.get_state() 22 | if self.cb: 23 | self.cb(self) 24 | 25 | def get_state(self, value = None): 26 | 27 | if not value: 28 | value = self._relay.value() 29 | 30 | if self.on_value == value: 31 | return "ON" 32 | else: 33 | return "OFF" 34 | 35 | def change_state(self): 36 | 37 | if self._relay.value() == 1: 38 | self._relay.value(0) 39 | else: 40 | self._relay.value(1) 41 | 42 | self.state = self.get_state() 43 | if self.cb: 44 | self.cb(self) 45 | 46 | 47 | def set_callback(self, f): 48 | self.cb = f 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /projects/examples/mqtt_dragon_relay_DAK/README.md: -------------------------------------------------------------------------------- 1 | #Test for Relay 2 | import machine 3 | RELAYS = [machine.Pin(i, machine.Pin.OUT, value=0) for i in (12, 13)] 4 | 5 | RELAYS[0].value(1) #on 6 | RELAYS[1].value(1) #on 7 | 8 | RELAYS[0].value(0) #off 9 | RELAYS[1].value(0) #off 10 | 11 | 12 | import machine 13 | button2 = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP) 14 | button1 = machine.Pin(2, machine.Pin.IN, machine.Pin.PULL_UP) 15 | 16 | button1.value() 17 | 18 | 1 - no push 19 | 0 - push -------------------------------------------------------------------------------- /projects/examples/mqtt_relay_1990a/boot.py: -------------------------------------------------------------------------------- 1 | # This file is executed on every boot (including wake-boot from deepsleep) 2 | #import esp 3 | #esp.osdebug(None) 4 | #import uos, machine 5 | #uos.dupterm(machine.UART(0, 115200), 1) 6 | import gc 7 | #import webrepl 8 | #webrepl.start() 9 | gc.collect() 10 | -------------------------------------------------------------------------------- /projects/examples/mqtt_relay_1990a/button_control/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # ver 06.24.18 3 | # Copyright (c) 2018 Viktor Vorobjov 4 | # see: 5 | # examples\touch_switch_test 6 | # Holtek - Touch I/O Flash MCU BS83A02A-4/BS83A04A-3/BS83A04A-4 7 | 8 | # examples\button_switch_test 9 | # Mechanical Pin button 10 | # Touch pin button - TTP223 11 | # 12 | 13 | class ButtonControl: 14 | ''' 15 | Touch Button 16 | #BUTTON 17 | 18 | 19 | push_check by timer(esp8266) or thread(esp32/stm32) 20 | 21 | ''' 22 | 23 | # init 24 | def __init__(self, name=None, _pin=False, debug=False, on_value=1, off_value=0, 25 | state_on="ON", state_off="OFF"): 26 | 27 | self._switch = _pin 28 | self.name = name 29 | self.debug = debug 30 | self.status = 0 31 | 32 | self.button = None 33 | 34 | self.on_value = on_value 35 | self.off_value = off_value 36 | 37 | self.state_on = state_on 38 | self.state_off = state_off 39 | 40 | 41 | 42 | self._value = off_value 43 | 44 | self.cb = None 45 | 46 | self.change_state() 47 | 48 | 49 | 50 | def change_state(self): 51 | self._value = self._switch.value() 52 | 53 | if self._value == self.on_value: 54 | self.state = self.state_on 55 | elif self._value == self.off_value: 56 | self.state = self.state_off 57 | 58 | if self.cb: 59 | self.cb() 60 | 61 | self.status = 20 62 | 63 | 64 | 65 | def makebutton(self): 66 | while True: 67 | if self._switch.value() != self._value: 68 | self.change_state() 69 | self.status = 30 70 | 71 | yield True 72 | 73 | 74 | def start(self): 75 | self.button = self.makebutton() # Generator start 76 | next(self.button) 77 | 78 | if self.debug: 79 | print("Start Button") 80 | 81 | def stop(self): 82 | self.button = None # Generator stop 83 | 84 | @property 85 | def push_check(self): #Generator next 86 | ''' 87 | T 88 | ''' 89 | 90 | try: 91 | next(self.button) 92 | except StopIteration: 93 | if self.debug: 94 | print("Stop Iteration") 95 | return -255 96 | 97 | self.status = 10 98 | 99 | return self.status 100 | 101 | def set_callback(self, f): 102 | self.cb = f 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /projects/examples/mqtt_relay_1990a/relay_control.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | 5 | class RELAY: 6 | ''' 7 | Relay Control with state 8 | ''' 9 | 10 | # init 11 | def __init__(self, name = None, pin_num = None, on_value=0,): 12 | self._relay = Pin(pin_num, Pin.OUT, on_value) 13 | self.on_value = on_value 14 | self.save_state = False 15 | self.state = self.get_state(on_value) 16 | self.cb = None 17 | self.name = name 18 | 19 | 20 | def set_state(self, reguest_value): 21 | self._relay.value(reguest_value) 22 | self.state = self.get_state() 23 | if self.cb: 24 | self.cb(self) 25 | 26 | def get_state(self, value = None): 27 | 28 | if not value: 29 | value = self._relay.value() 30 | 31 | if self.on_value == value: 32 | return "ON" 33 | else: 34 | return "OFF" 35 | 36 | def change_state(self): 37 | 38 | if self._relay.value() == 1: 39 | self._relay.value(0) 40 | else: 41 | self._relay.value(1) 42 | self._relay.value(0) 43 | 44 | 45 | self.state = self.get_state() 46 | if self.cb: 47 | self.cb(self) 48 | 49 | 50 | def set_callback(self, f): 51 | self.cb = f 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/asyn.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/straga/micropython_project/9111398492f0cf511da8e6f83b34d8e4e4f90278/projects/examples/mqtt_si7021_class/asyn.mpy -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/basesensor.py: -------------------------------------------------------------------------------- 1 | from mqtt_helpers import make_publish 2 | 3 | 4 | class BaseSensor(): 5 | """Common functions for all sensors""" 6 | def action_on_change(self, source, value): 7 | if value and self.publish_state_to_mqtt: 8 | global MESSAGES 9 | if value[0]: 10 | MESSAGES[CONFIG['topic'] + "/Sensor01_TEMP"] = str(value[0]) 11 | if value[1]: 12 | MESSAGES[CONFIG['topic'] + "/Sensor01_HUM"] = str(value[1]) 13 | loop.create_task(make_publish(event)) 14 | 15 | def get_state(self): 16 | return self.measure() -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/boot.py: -------------------------------------------------------------------------------- 1 | # This file is executed on every boot (including wake-boot from deepsleep) 2 | import esp 3 | esp.osdebug(None) 4 | #import webrepl 5 | #webrepl.start() 6 | import time 7 | import network 8 | import gc 9 | 10 | gc.enable() 11 | 12 | print("will run main Runner in 3 sec") 13 | time.sleep(3) 14 | import metaclass -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/checkconnection.py: -------------------------------------------------------------------------------- 1 | import network 2 | import utime 3 | import gc 4 | import uasyncio as asyncio 5 | 6 | net_fail_count = 0 7 | net_succ_count = 0 8 | 9 | 10 | async def check_connection(event): 11 | global net_fail_count 12 | global net_succ_count 13 | while True: 14 | sta_if = network.WLAN(network.STA_IF) 15 | is_connected = sta_if.isconnected() 16 | if not is_connected: 17 | net_succ_count = 0 18 | net_fail_count += 1 19 | if net_fail_count >= 10: 20 | from machine import reset 21 | reset() 22 | else: 23 | event.set() 24 | net_succ_count += 1 25 | if net_succ_count >= 5: 26 | net_fail_count = 0 27 | if debug: 28 | print ("Time is:", utime.localtime()[4], ":", utime.localtime()[5], 29 | "WIFI is connected: ", event.is_set(), 30 | "Nr times failed: ", net_fail_count, net_succ_count, 31 | "Free memory: ", gc.mem_free()) 32 | await asyncio.sleep(10) 33 | -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/config.py: -------------------------------------------------------------------------------- 1 | def init_config(): 2 | try: 3 | f = open("/config.json", "r") 4 | return True 5 | f.close() 6 | except: 7 | return False 8 | 9 | 10 | def load_config(CONFIG): 11 | import ujson as json 12 | try: 13 | with open("/config.json") as f: 14 | config = json.loads(f.read()) 15 | except (OSError, ValueError): 16 | print("Couldn't load /config.json") 17 | else: 18 | CONFIG.update(config) 19 | print("Loaded config from /config.json") 20 | 21 | 22 | def save_config(CONFIG): 23 | import ujson as json 24 | try: 25 | with open("/config.json", "w") as f: 26 | f.write(json.dumps(CONFIG)) 27 | print("Saved config to /config.json") 28 | except OSError: 29 | print("Couldn't save /config.json") 30 | 31 | 32 | def save_default_config(): 33 | from machine import unique_id 34 | from os import uname 35 | import ubinascii 36 | mqtt_root_topic = "devices" 37 | board_uid = uname()[0] + "_" + ubinascii.hexlify(unique_id()).decode() 38 | CONFIG['client_id'] = board_uid 39 | CONFIG['topic'] = mqtt_root_topic + "/" + board_uid 40 | CONFIG['broker'] = '127.0.0.1' 41 | CONFIG['port'] = 1883 42 | CONFIG['debug'] = 'False' 43 | save_config(CONFIG) 44 | load_config(CONFIG) 45 | -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/metaclass.py: -------------------------------------------------------------------------------- 1 | from mqttse import MQTTClient 2 | import asyn 3 | import uasyncio as asyncio 4 | from config import * 5 | from checkconnection import check_connection 6 | from mqtt_helpers import * 7 | from basesensor import BaseSensor 8 | import builtins 9 | 10 | # Board specific modules 11 | from si7021sensor import SI7021sensor 12 | 13 | 14 | builtins.MESSAGES = {} 15 | builtins.debug = True 16 | builtins.CONFIG = {} 17 | builtins.loop = asyncio.get_event_loop() 18 | builtins.event = asyn.Event() 19 | list_of_instances = [] 20 | 21 | 22 | if init_config(): 23 | load_config(CONFIG) 24 | else: 25 | save_default_config() 26 | 27 | 28 | class Sensor01(BaseSensor, SI7021sensor): 29 | publish_state_to_mqtt = True 30 | 31 | def __init__(self): 32 | super(Sensor01, self).__init__() 33 | print('Sensor class 01') 34 | list_of_instances.append(self) 35 | 36 | 37 | i_Sensor = Sensor01() 38 | 39 | config_mqtt_client() 40 | check_mqtt(event) 41 | check_connection(event) 42 | 43 | 44 | async def check_hw_state(): 45 | while True: 46 | for instance in list_of_instances: 47 | instance.action_on_change("hw", instance.get_state()) 48 | await asyncio.sleep_ms(5000) 49 | 50 | 51 | 52 | 53 | loop.create_task(check_mqtt(event)) 54 | #loop.create_task(make_publish(event)) 55 | loop.create_task(wait_msg()) 56 | loop.create_task(check_hw_state()) 57 | loop.create_task(check_connection(event)) 58 | loop.run_forever() 59 | -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/mqtt_helpers.py: -------------------------------------------------------------------------------- 1 | from mqttse import MQTTClient 2 | import uasyncio as asyncio 3 | import utime 4 | 5 | def clear_messages(key): 6 | 7 | global MESSAGES 8 | MESSAGES[key] = None 9 | 10 | 11 | def sub_cb(topic, msg): 12 | global debug 13 | print("INF: In sub_cb", topic.decode(), msg.decode()) 14 | 15 | if debug: 16 | print(topic, msg) 17 | 18 | 19 | def config_mqtt_client(): 20 | global c_mqtt 21 | 22 | try: 23 | subscribe_topic = CONFIG['topic'] + '/#' 24 | c_mqtt = MQTTClient(CONFIG['client_id'], CONFIG['broker'], 25 | CONFIG['port'], timeout=1, 26 | sbt=subscribe_topic, debug=True) 27 | c_mqtt.set_callback(sub_cb) 28 | 29 | if debug: 30 | print("attempt connect to MQTT", str(c_mqtt.status)) 31 | except (OSError, ValueError): 32 | print("Couldn't connect to MQTT") 33 | 34 | 35 | def check_mqtt(event): 36 | global c_mqtt 37 | while True: 38 | if event.is_set(): 39 | if c_mqtt and c_mqtt.status == 0: 40 | print("Status_0: Mqtt connection status is: {} and event {}" 41 | .format(c_mqtt.status, event.is_set())) 42 | c_mqtt.communicate() 43 | if c_mqtt and c_mqtt.status == 1: 44 | global MESSAGES 45 | board_uptime = utime.localtime()[4], ":", utime.localtime()[5] 46 | MESSAGES[CONFIG['topic'] + '/ping'] = '1' 47 | MESSAGES[CONFIG['topic'] + '/uptime'] = board_uptime 48 | print("Status_1: Mqtt connection status is: {} and event {}" 49 | .format(c_mqtt.status, event.is_set())) 50 | await asyncio.sleep(15) 51 | 52 | 53 | async def make_publish(event): 54 | print("INF: Start Publish and Event is", event.is_set()) 55 | if event.is_set(): 56 | to_mqtt = MESSAGES 57 | for key, value in to_mqtt.items(): 58 | if value is not None: 59 | if c_mqtt and c_mqtt.status == 1: 60 | retain = False 61 | result = c_mqtt.publish( 62 | bytes(key, 'utf-8'), 63 | bytes(str(value), 'utf-8'), 64 | retain, 0) 65 | if result == 1: 66 | clear_messages(key) 67 | if debug: 68 | print("Result pub to MQTT", result) 69 | c_mqtt.wait_msg() 70 | await asyncio.sleep(0) 71 | 72 | 73 | async def wait_msg(): 74 | while True: 75 | if c_mqtt and c_mqtt.status == 1: 76 | c_mqtt.wait_msg() 77 | await asyncio.sleep_ms(500) 78 | 79 | 80 | async def subscribe(): 81 | while True: 82 | c_mqtt.communicate() 83 | subscribe_topic = CONFIG['topic'] + '/#' 84 | if c_mqtt and c_mqtt.status == 1: 85 | print("INF: inside wait_msg", CONFIG['topic']) 86 | c_mqtt.subscribe(subscribe_topic) 87 | await asyncio.sleep_ms(500) 88 | -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/mqttse/__init__.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/straga/micropython_project/9111398492f0cf511da8e6f83b34d8e4e4f90278/projects/examples/mqtt_si7021_class/mqttse/__init__.mpy -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/si7021.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/straga/micropython_project/9111398492f0cf511da8e6f83b34d8e4e4f90278/projects/examples/mqtt_si7021_class/si7021.mpy -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/si7021sensor.py: -------------------------------------------------------------------------------- 1 | class SI7021sensor(): 2 | __slots__ = 'publish_state_to_mqtt', 'sensor_type' 3 | sensor_type = "si7021" 4 | 5 | def __init__(self): 6 | import si7021 7 | from machine import I2C, Pin 8 | try: 9 | i2c = I2C(sda=Pin(5), scl=Pin(4)) 10 | self.sensor = si7021.SI7021(i2c) 11 | except: 12 | print("Debug: Unable to initialize sensor") 13 | 14 | def measure(self): 15 | try: 16 | if (self.sensor.temperature() and self.sensor.humidity()): 17 | temperature, humidity = ( 18 | self.sensor.temperature(), self.sensor.humidity()) 19 | return temperature, humidity 20 | except: 21 | print("Debug: Unable to read the data from sensor") 22 | -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/uasyncio/__init__.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/straga/micropython_project/9111398492f0cf511da8e6f83b34d8e4e4f90278/projects/examples/mqtt_si7021_class/uasyncio/__init__.mpy -------------------------------------------------------------------------------- /projects/examples/mqtt_si7021_class/uasyncio/core.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/straga/micropython_project/9111398492f0cf511da8e6f83b34d8e4e4f90278/projects/examples/mqtt_si7021_class/uasyncio/core.mpy -------------------------------------------------------------------------------- /projects/examples/mqtt_si_bmp/bmp180.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/straga/micropython_project/9111398492f0cf511da8e6f83b34d8e4e4f90278/projects/examples/mqtt_si_bmp/bmp180.mpy -------------------------------------------------------------------------------- /projects/examples/mqtt_si_bmp/si7021.mpy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/straga/micropython_project/9111398492f0cf511da8e6f83b34d8e4e4f90278/projects/examples/mqtt_si_bmp/si7021.mpy -------------------------------------------------------------------------------- /projects/examples/touch_switch_test/main.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Pin 3 | from relay_control import RELAY 4 | from button_control import TouchButton 5 | 6 | from machine import Timer 7 | 8 | #Timer 9 | tim5 = Timer(-1) 10 | 11 | 12 | #Wemos D1 mini 13 | #Led 14 | LED_2_pin = 2 15 | LED_2 = RELAY(name="Led2", pin_num=LED_2_pin, on_value=0, off_value=1, state_on=1, state_off=0, default=1) 16 | 17 | 18 | #BUTTON 19 | button_pin = 4 20 | 21 | b4 = TouchButton(name="Led2", pin_num=button_pin, pull=Pin.PULL_UP, debug=True, relay_control=LED_2, on_value=1 ) 22 | b4.start() 23 | 24 | 25 | #BUTTON CHECK 26 | def button_push_check(): 27 | b4.push_check 28 | 29 | 30 | 31 | 32 | def run_timer(): 33 | tim5.init(period=300, mode=Timer.PERIODIC, callback=lambda t: button_push_check()) 34 | 35 | def main(): 36 | run_timer() 37 | 38 | if __name__ == '__main__': 39 | main() -------------------------------------------------------------------------------- /projects/examples/touch_switch_test/relay_control/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | Relay Control with state 7 | ''' 8 | 9 | # init 10 | def __init__(self, name = None, pin_num = None, on_value=1, off_value=0, state_on="ON", state_off="OFF", default = 0): 11 | self._relay = Pin(pin_num, Pin.OUT) 12 | self.on_value = on_value 13 | self.off_value = off_value 14 | self.cb = None 15 | self.name = name 16 | self.state_on = state_on 17 | self.state_off = state_off 18 | self.set_state(default) 19 | self.state = self.get_state() 20 | 21 | def save_state(self): 22 | self.state = self.get_state() 23 | if self.cb: 24 | self.cb(self) 25 | 26 | def set_state(self, reguest_value): 27 | self._relay.value(reguest_value) 28 | self.save_state() 29 | 30 | def get_state(self): 31 | 32 | if self.on_value == self._relay.value(): 33 | return self.state_on 34 | else: 35 | return self.state_off 36 | 37 | def change_state(self): 38 | 39 | if self._relay.value() == 1: 40 | self._relay.value(0) 41 | else: 42 | self._relay.value(1) 43 | 44 | self.save_state() 45 | 46 | 47 | def set_callback(self, f): 48 | self.cb = f 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /projects/examples/touch_switch_test/touch_switch_control/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | 5 | class TouchButton: 6 | ''' 7 | B 8 | ''' 9 | 10 | # init 11 | def __init__(self, name=None, pin_num=False, pull=False, debug=False, relay_control=None, on_value=1, off_value=0, state_on="ON", state_off="OFF"): 12 | 13 | self._switch = Pin(pin_num, Pin.IN, pull) 14 | self.name = name 15 | self.debug = debug 16 | self.status = 0 17 | 18 | self.relay = relay_control 19 | self.button = None 20 | 21 | self.on_value = on_value 22 | self.off_value = off_value 23 | 24 | self.state_on = state_on 25 | self.state_off = state_off 26 | 27 | self.state = state_off 28 | 29 | self._value = off_value 30 | 31 | self.cb = None 32 | 33 | 34 | 35 | def change_state(self): 36 | 37 | self._value = self._switch.value() 38 | 39 | if self._value == self.on_value: 40 | self.state = self.state_on 41 | elif self._value == self.off_value: 42 | self.state = self.state_off 43 | 44 | if self.cb: 45 | self.cb(self) 46 | 47 | self.status = 20 48 | 49 | 50 | 51 | def makebutton(self): 52 | 53 | while True: 54 | 55 | if self._switch.value() != self._value: 56 | 57 | if self.relay: 58 | self.relay.change_state() 59 | 60 | self.change_state() 61 | 62 | self.status = 30 63 | 64 | yield True 65 | 66 | 67 | def start(self): 68 | 69 | self.button = self.makebutton() # Generator start 70 | next(self.button) 71 | 72 | def stop(self): 73 | 74 | self.button = None # Generator stop 75 | 76 | @property 77 | def push_check(self): 78 | ''' 79 | T 80 | ''' 81 | self.status = 10 82 | try: 83 | next(self.button) 84 | except StopIteration: 85 | if self.debug: 86 | print("StopIteration") 87 | return -255 88 | 89 | value = self.status 90 | 91 | return value 92 | 93 | def set_callback(self, f): 94 | self.cb = f 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /projects/modules_ext/FTP-Server/Readme.md: -------------------------------------------------------------------------------- 1 | source https://github.com/robert-hh/ESP8266-FTP-Server 2 | 3 | remove autostart ftpserver(). -------------------------------------------------------------------------------- /projects/modules_my/Button_control/button_control/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | 5 | class PinButton: 6 | ''' 7 | B 8 | ''' 9 | 10 | # init 11 | def __init__(self, pinNum, Pull, debug=False, relay_control=None, on_value=0): 12 | 13 | self._pin = Pin(pinNum, Pin.IN, Pull ) 14 | 15 | self.debug = debug 16 | self.status = 0 17 | 18 | self.value = "off" 19 | self._value = None 20 | 21 | self.relay = relay_control 22 | self.button = None 23 | 24 | self.on_value = on_value 25 | 26 | 27 | def makebutton(self): 28 | 29 | delays = -200 # mS delay 30 | 31 | while True: 32 | 33 | t_start = time.ticks_ms() 34 | self.status = 1 35 | 36 | if self._pin.value() == self.on_value: 37 | while time.ticks_diff(t_start, time.ticks_ms()) >= delays: 38 | 39 | if self.value == "off": 40 | if self.relay: 41 | self.relay.change_state() 42 | self.value = "on" 43 | self.status = 1 44 | 45 | self.status = 10 46 | yield None 47 | 48 | else: 49 | self.value = "off" 50 | 51 | 52 | yield True 53 | 54 | 55 | 56 | def start(self): 57 | 58 | self.button = self.makebutton() # Generator start 59 | next(self.button) 60 | 61 | def stop(self): 62 | 63 | self.button = None # Generator stop 64 | 65 | @property 66 | def push(self): 67 | ''' 68 | T 69 | ''' 70 | self.status = 0 71 | try: 72 | next(self.button) 73 | except StopIteration: 74 | if self.debug: 75 | print("StopIteration") 76 | return -255 77 | 78 | value = self.status 79 | 80 | return value 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /projects/modules_my/Button_control/touch_switch_control/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | import time 4 | 5 | class TouchButton: 6 | ''' 7 | B 8 | ''' 9 | 10 | # init 11 | def __init__(self, name=None, pin_num=False, pull=False, debug=False, relay_control=None, on_value=1, off_value=0, state_on="ON", state_off="OFF"): 12 | 13 | self._switch = Pin(pin_num, Pin.IN, pull) 14 | self.name = name 15 | self.debug = debug 16 | self.status = 0 17 | 18 | self.relay = relay_control 19 | self.button = None 20 | 21 | self.on_value = on_value 22 | self.off_value = off_value 23 | 24 | self.state_on = state_on 25 | self.state_off = state_off 26 | 27 | self.state = state_off 28 | 29 | self._value = off_value 30 | 31 | self.cb = None 32 | 33 | 34 | 35 | def change_state(self): 36 | 37 | self._value = self._switch.value() 38 | 39 | if self._value == self.on_value: 40 | self.state = self.state_on 41 | elif self._value == self.off_value: 42 | self.state = self.state_off 43 | 44 | if self.cb: 45 | self.cb(self) 46 | 47 | self.status = 20 48 | 49 | 50 | 51 | def makebutton(self): 52 | 53 | while True: 54 | 55 | if self._switch.value() != self._value: 56 | 57 | if self.relay: 58 | self.relay.change_state() 59 | 60 | self.change_state() 61 | 62 | self.status = 30 63 | 64 | yield True 65 | 66 | 67 | def start(self): 68 | 69 | self.button = self.makebutton() # Generator start 70 | next(self.button) 71 | 72 | def stop(self): 73 | 74 | self.button = None # Generator stop 75 | 76 | @property 77 | def push_check(self): 78 | ''' 79 | T 80 | ''' 81 | self.status = 10 82 | try: 83 | next(self.button) 84 | except StopIteration: 85 | if self.debug: 86 | print("StopIteration") 87 | return -255 88 | 89 | value = self.status 90 | 91 | return value 92 | 93 | def set_callback(self, f): 94 | self.cb = f 95 | 96 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /projects/modules_my/HttpSe/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "git.ignoreLimitWarning": true 3 | } -------------------------------------------------------------------------------- /projects/modules_my/HttpSe/demo/ESP8266/httpse/route_led.py: -------------------------------------------------------------------------------- 1 | 2 | class LedHandler: 3 | 4 | def __init__(self, debug=True, relay=None): 5 | self._debug = debug 6 | self._relay = relay 7 | self.route_handler = ("/led", "GET", self._handler) 8 | 9 | def _handler(self, res_path, query_params): 10 | response = {} 11 | 12 | # DEBUG curl -i 'http://192.168.10.112/led?set=&state=' 13 | if self._debug: 14 | print("_queryParams =", query_params) 15 | 16 | if 'set' in query_params: 17 | 18 | set = query_params["set"] 19 | if set == "1" or set == "0": 20 | set = int(query_params["set"]) 21 | self._relay.set_state(set) 22 | else: 23 | self._relay.change_state() 24 | 25 | if 'state' in query_params: 26 | response = {'state': self._relay.state} 27 | 28 | if self._debug: 29 | print("Response =", response) 30 | 31 | return response 32 | 33 | 34 | -------------------------------------------------------------------------------- /projects/modules_my/HttpSe/demo/ESP8266/httpse/route_system.py: -------------------------------------------------------------------------------- 1 | import gc 2 | 3 | class SystemHandler: 4 | 5 | def __init__(self, debug=True): 6 | self._debug = debug 7 | self.route_handler = ("/system", "GET" ,self._handler) 8 | 9 | 10 | def _handler(self, res_path, query_params): 11 | response = {} 12 | 13 | if self._debug: 14 | print("Debug") 15 | 16 | # curl -i 'http://192.168.10.111/system?memory=' 17 | if 'memory' in query_params: 18 | response['memory'] = { 19 | 'mem_alloc': gc.mem_alloc(), 20 | 'mem_free': gc.mem_free() 21 | } 22 | return response 23 | 24 | 25 | -------------------------------------------------------------------------------- /projects/modules_my/HttpSe/demo/ESP8266/httpse/runner.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | 4 | class ProcessRuner: 5 | 6 | def __init__(self, http_server=False ,timer_http=False, debug = True, run_period=100 ) : 7 | 8 | self._timer_http = timer_http 9 | self._debug = debug 10 | self._run_period = run_period 11 | self._http_server = http_server 12 | self._http_process = self._make_http_process() 13 | 14 | def _make_http_process(self): 15 | if self._debug: 16 | print("Make http process") 17 | while True: 18 | self._http_server.server_process() 19 | yield None 20 | 21 | def _run_http(self): 22 | try: 23 | next(self._http_process) 24 | except StopIteration: 25 | if self._debug: 26 | print("StopIteration") 27 | machine.reset() 28 | 29 | def run_timer(self): 30 | self._timer_http.init(period=self._run_period, mode=Timer.PERIODIC, callback=lambda t: self._run_http()) 31 | -------------------------------------------------------------------------------- /projects/modules_my/HttpSe/demo/ESP8266/main.py: -------------------------------------------------------------------------------- 1 | import machine 2 | from machine import Timer 3 | 4 | from httpse import SimpleHttp 5 | from httpse.runner import ProcessRuner 6 | from httpse.route_system import SystemHandler 7 | from httpse.route_led import LedHandler 8 | from relay_control import RELAY 9 | from mqttse import MQTTClient 10 | 11 | import ubinascii 12 | 13 | client_id = b"esp8266_" + ubinascii.hexlify(machine.unique_id()) 14 | 15 | CONFIG = { 16 | "broker": '192.168.2.153', 17 | "port" : 1883, 18 | "sensor_pin": 14, 19 | "delay_between_message" : -500, 20 | "client_id": client_id, 21 | "r1_mode": "OFF", 22 | "r1_tmax": 20.5, 23 | "r1_tmin": 18, 24 | "topic": b"devices/"+client_id+"/#", 25 | "ping" : b"devices/"+client_id+"/ping", 26 | "sw1_set" : b"devices/"+client_id+"/sw1/set", 27 | "sw1_state" : b"devices/"+client_id+"/sw1/state", 28 | "sw2_set": b"devices/" + client_id + "/sw2/set", 29 | "sw2_state": b"devices/" + client_id + "/sw2/state", 30 | "DS18B20": b"devices/" + client_id + "/18b20", 31 | "t_ctr_r1_mode_set": b"devices/" + client_id + "/t_ctr_r1/mode/set", 32 | "t_ctr_r1_mode_state": b"devices/" + client_id + "/t_ctr_r1/mode/state", 33 | "t_ctr_r1_max": b"devices/" + client_id + "/t_ctr_r1/max", 34 | "t_ctr_r1_min": b"devices/" + client_id + "/t_ctr_r1/min", 35 | "m_delay": b"devices/" + client_id + "/m_delay", 36 | 37 | } 38 | 39 | def load_config(): 40 | import ujson as json 41 | try: 42 | with open("/config.json") as f: 43 | config = json.loads(f.read()) 44 | except (OSError, ValueError): 45 | print("Couldn't load /config.json") 46 | save_config() 47 | else: 48 | CONFIG.update(config) 49 | print("Loaded config from /config.json") 50 | 51 | def save_config(): 52 | import ujson as json 53 | try: 54 | with open("/config.json", "w") as f: 55 | f.write(json.dumps(CONFIG)) 56 | except OSError: 57 | print("Couldn't save /config.json") 58 | 59 | 60 | try: 61 | c_mqtt = MQTTClient(CONFIG['client_id'], CONFIG['broker'], CONFIG['port'], timeout=1, sbt=CONFIG['topic'], 62 | debug=False) 63 | 64 | except (OSError, ValueError): 65 | print("Couldn't connect to MQTT") 66 | 67 | timer_http = Timer(-1) 68 | _debug = True 69 | _routeHandlers = [] 70 | 71 | #System 72 | _routeHandlers.append(SystemHandler(debug=_debug).route_handler) 73 | 74 | 75 | #Led 76 | LED_2_pin = 2 77 | LED_2 = RELAY(name="Led2", pin_num=LED_2_pin, on_value=0, off_value=1, state_on=1, state_off=0, default=1) 78 | _routeHandlers.append(LedHandler(debug=_debug, relay=LED_2).route_handler) 79 | 80 | 81 | def main(): 82 | if _debug: 83 | print("Routes = %s" % _routeHandlers) 84 | 85 | server_sehttp = SimpleHttp(port=80, web_path="/www", debug=_debug, route_handlers=_routeHandlers) 86 | server_sehttp.start() 87 | 88 | if server_sehttp.started: 89 | server_sehttp_runner = ProcessRuner(http_server=server_sehttp, timer_http=timer_http, debug=_debug,run_period=100) 90 | server_sehttp_runner.run_timer() 91 | 92 | 93 | 94 | def ftp(): 95 | import ftp 96 | ftp.ftpserver() 97 | 98 | if __name__ == '__main__': 99 | main() 100 | 101 | # _routeHandlers = [ 102 | # ( "/led", "GET", led_control ), 103 | # ( "/slider", "GET", slider_control ), 104 | # ( "/api", "GET", api_control ), 105 | # ( "/system", "GET", system_info ), 106 | # 107 | # ] -------------------------------------------------------------------------------- /projects/modules_my/HttpSe/demo/ESP8266/relay_control/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | Relay Control with state 7 | ''' 8 | 9 | # init 10 | def __init__(self, name = None, pin_num = None, on_value=1, off_value=0, state_on="ON", state_off="OFF", default = 0): 11 | self._relay = Pin(pin_num, Pin.OUT) 12 | self.on_value = on_value 13 | self.off_value = off_value 14 | self.cb = None 15 | self.name = name 16 | self.state_on = state_on 17 | self.state_off = state_off 18 | self.set_state(default) 19 | self.state = self.get_state() 20 | 21 | def save_state(self): 22 | self.state = self.get_state() 23 | if self.cb: 24 | self.cb(self) 25 | 26 | def set_state(self, reguest_value): 27 | self._relay.value(reguest_value) 28 | self.save_state() 29 | 30 | def get_state(self): 31 | 32 | if self.on_value == self._relay.value(): 33 | return self.state_on 34 | else: 35 | return self.state_off 36 | 37 | def change_state(self): 38 | 39 | if self._relay.value() == 1: 40 | self._relay.value(0) 41 | else: 42 | self._relay.value(1) 43 | 44 | self.save_state() 45 | 46 | 47 | def set_callback(self, f): 48 | self.cb = f 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /projects/modules_my/HttpSe/demo/ESP8266/www/css.min.js: -------------------------------------------------------------------------------- 1 | define(function(){if("undefined"==typeof window)return{load:function(a,b,c){c()}};var a=document.getElementsByTagName("head")[0],b=window.navigator.userAgent.match(/Trident\/([^ ;]*)|AppleWebKit\/([^ ;]*)|Opera\/([^ ;]*)|rv\:([^ ;]*)(.*?)Gecko\/([^ ;]*)|MSIE\s([^ ;]*)|AndroidWebKit\/([^ ;]*)/)||0,c=!1,d=!0;b[1]||b[7]?c=parseInt(b[1])<6||parseInt(b[7])<=9:b[2]||b[8]?d=!1:b[4]&&(c=parseInt(b[4])<18);var e={};e.pluginBuilder="./css-builder";var f,g,h,i=function(){f=document.createElement("style"),a.appendChild(f),g=f.styleSheet||f.sheet},j=0,k=[],l=function(a){g.addImport(a),f.onload=function(){m()},j++,31==j&&(i(),j=0)},m=function(){h();var a=k.shift();return a?(h=a[1],void l(a[0])):void(h=null)},n=function(a,b){if(g&&g.addImport||i(),g&&g.addImport)h?k.push([a,b]):(l(a),h=b);else{f.textContent='@import "'+a+'";';var c=setInterval(function(){try{f.sheet.cssRules,clearInterval(c),b()}catch(a){}},10)}},o=function(b,c){var e=document.createElement("link");if(e.type="text/css",e.rel="stylesheet",d)e.onload=function(){e.onload=function(){},setTimeout(c,7)};else var f=setInterval(function(){for(var a=0;a mqtt_relay -------------------------------------------------------------------------------- /projects/modules_my/MqttSe/metadata.txt: -------------------------------------------------------------------------------- 1 | srctype = micropython 2 | type = package 3 | version = 1.1 4 | author = https://github.com/straga 5 | desc = nonblocking Mqtt for ESP8266 and ESP32 make mpy file and use. 6 | long_desc = README.rst 7 | -------------------------------------------------------------------------------- /projects/modules_my/MqttSe/setup.py: -------------------------------------------------------------------------------- 1 | import sys 2 | # Remove current dir from sys.path, otherwise setuptools will peek up our 3 | # module instead of system's. 4 | sys.path.pop(0) 5 | from setuptools import setup 6 | sys.path.append("..") 7 | import sdist_upip 8 | 9 | setup(name='micropython-mqttse', 10 | version='1.1', 11 | description='Lightweight mqttse library for MicroPython, nonblocking Mqtt for ESP8266.', 12 | long_description=open('README.rst').read(), 13 | url='https://github.com/straga/micropython/tree/master/projects/modules_my/MqttSe', 14 | author='https://github.com/straga', 15 | author_email='vostraga@gmail.com', 16 | maintainer='micropython-lib Developers', 17 | maintainer_email='vostraga@gmail.com', 18 | license='MIT', 19 | cmdclass={'sdist': sdist_upip.sdist}, 20 | packages=['mqttse'], 21 | classifiers = [ 22 | 'Development Status :: 5 - Production/Stable', 23 | 'Programming Language :: Python :: Implementation :: MicroPython', 24 | ], 25 | ) 26 | -------------------------------------------------------------------------------- /projects/modules_my/Relay_Led_control/relay_control/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | from machine import Pin 3 | 4 | class RELAY: 5 | ''' 6 | Relay Control with state 7 | ''' 8 | 9 | # init 10 | def __init__(self, name = None, pin_num = None, on_value=1, off_value=0, state_on="ON", state_off="OFF", default = 0): 11 | self._relay = Pin(pin_num, Pin.OUT) 12 | self.on_value = on_value 13 | self.off_value = off_value 14 | self.cb = None 15 | self.name = name 16 | self.state_on = state_on 17 | self.state_off = state_off 18 | self.set_state(default) 19 | self.state = self.get_state() 20 | 21 | def save_state(self): 22 | self.state = self.get_state() 23 | if self.cb: 24 | self.cb(self) 25 | 26 | def set_state(self, reguest_value): 27 | self._relay.value(reguest_value) 28 | self.save_state() 29 | 30 | def get_state(self): 31 | 32 | if self.on_value == self._relay.value(): 33 | return self.state_on 34 | else: 35 | return self.state_off 36 | 37 | def change_state(self): 38 | 39 | if self._relay.value() == 1: 40 | self._relay.value(0) 41 | else: 42 | self._relay.value(1) 43 | 44 | self.save_state() 45 | 46 | 47 | def set_callback(self, f): 48 | self.cb = f 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | --------------------------------------------------------------------------------