Mercurial > code > home > repos > homeauto
changeset 1527:ed3d29eb989a
espNode was not a service; move it to top dir
Ignore-this: 3a46fb9f4d09a046dcc30ec838923d69
darcs-hash:711b2e30f5117dbacde98394bfd32791c953a3c7
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Wed, 05 Feb 2020 16:43:46 -0800 |
parents | c476543e761e |
children | 44aae4efedf6 |
files | espNode/cabin.yaml espNode/display1.yaml espNode/esp8266_nightlight.yaml espNode/frontwindow.yaml espNode/garage_hall_cam.yaml espNode/nightlight_ari.yaml espNode/readcam.py espNode/tasks.py espNode/theater_blaster.yaml service/espNode/cabin.yaml service/espNode/display1.yaml service/espNode/esp8266_nightlight.yaml service/espNode/frontwindow.yaml service/espNode/garage_hall_cam.yaml service/espNode/nightlight_ari.yaml service/espNode/readcam.py service/espNode/tasks.py service/espNode/theater_blaster.yaml |
diffstat | 18 files changed, 510 insertions(+), 510 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/cabin.yaml Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,58 @@ +# https://cdn.hackaday.io/files/269911154782944/Heltec_WIFI-LoRa-32_DiagramPinout.jpg + +esphome: + name: cabin + platform: ESP32 + board: lolin32 + build_path: build + esphome_core_version: latest + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + domain: '' + +mqtt: + broker: '10.2.0.1' + port: 1883 + username: '' + password: '' + +logger: + baud_rate: 115200 + level: DEBUG + +ota: + + +#dallas: +# - pin: GPIO16 +#sensor: +# - platform: dallas +# index: 0 +# name: temperature + +light: + - platform: fastled_clockless + chipset: WS2812B + pin: GPIO21 + num_leds: 16 + rgb_order: GRB + name: "rgb" + +i2c: + sda: 4 + scl: 15 + +font: + - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" + id: font_vera + size: 14 + +display: + - platform: ssd1306_i2c + model: "SSD1306 128x64" + reset_pin: 16 + address: 0x3C + lambda: |- + it.print(0, 0, id(font_vera), "cabin 1.0: running");
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/display1.yaml Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,43 @@ +substitutions: + location: display1 + board: d1_mini + +<<: !include esp8266_nightlight.yaml + +i2c: + sda: D6 + scl: D5 + +font: + - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" + id: font_big + size: 24 + - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" + id: font_small + size: 12 + +text_sensor: + - platform: mqtt_subscribe + name: "Data from topic" + id: mysensor + topic: display1/text + +display: + - platform: ssd1306_i2c + model: "SSD1306 128x64" + address: 0x3c + lambda: |- + it.rectangle(0, 0, 127, 63); + it.printf(64, 5, id(font_big), TextAlign::TOP_CENTER, id(mysensor).state.c_str()); + it.printf(64, 63-5, id(font_small), TextAlign::BOTTOM_CENTER, "left today"); + + +spi: + clk_pin: D0 + miso_pin: D1 + mosi_ + pin: D2 + +pn532: + cs_pin: D3 + update_interval: 1s
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/esp8266_nightlight.yaml Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,23 @@ +esphome: + name: nightlight_${location} + platform: esp8266 + board: ${board} + # or esp12e + build_path: build + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + domain: '' + +mqtt: + broker: '10.2.0.1' + port: 1883 + username: '' + password: '' + +logger: + baud_rate: 115200 + level: DEBUG + +ota:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/frontwindow.yaml Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,52 @@ +substitutions: + location: display1 + board: d1_mini + +<<: !include esp8266_nightlight.yaml + +i2c: + sda: D6 + scl: D5 + +font: + - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" + id: font_big + size: 24 + - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" + id: font_small + size: 12 + +text_sensor: + - platform: mqtt_subscribe + name: "Data from topic" + id: bigtext + topic: frontwindow/bigtext + - platform: mqtt_subscribe + name: "Data from topic" + id: smalltext + topic: frontwindow/smalltext + +display: + - platform: ssd1306_i2c + model: "SSD1306 128x64" + address: 0x3c + lambda: |- + it.rectangle(0, 0, 127, 63); + it.printf(64, 5, id(font_big), TextAlign::TOP_CENTER, id(bigtext).state.c_str()); + it.printf(64, 63-5, id(font_small), TextAlign::BOTTOM_CENTER, id(smalltext).state.c_str()); + + +spi: + clk_pin: D4 + miso_pin: D1 + mosi_pin: D2 + +pn532: + cs_pin: D3 + update_interval: 1s + on_tag: + then: + - mqtt.publish: + topic: frontwindow/tag + payload: !lambda 'return x;' +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/garage_hall_cam.yaml Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,59 @@ +# jump IO0 to GND on the board for programming + +esphome: + name: garage_hall_cam + platform: ESP32 + board: nodemcu-32s + build_path: build + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + domain: '' + use_address: 10.2.0.21 + +#mqtt: +# broker: '10.2.0.1' +# port: 1883 +# username: '' +# password: '' + +logger: + baud_rate: 115200 + level: DEBUG + +ota: + +api: + port: 6053 + password: 'MyPassword' + +esp32_camera: + external_clock: + pin: GPIO0 + frequency: 20MHz + i2c_pins: + sda: GPIO26 + scl: GPIO27 + data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35] + vsync_pin: GPIO25 + href_pin: GPIO23 + pixel_clock_pin: GPIO22 + power_down_pin: GPIO32 + + name: camera + # setting to 5 causes 'Setup Failed: ERROR' + max_framerate: 1 fps + # https://github.com/raphaelbs/esp32-cam-ai-thinker#capabilities says camera + # is likely ov2640 with these native resolutions: + # uxga=1600x1200 svga=800x600 cif=400x296 + # My camera has 'Setup Failed: ERROR' if this is not 640x480. Not sure why. + resolution: 640x480 + + # 10 to 63. default=10. higher is + # worse. https://github.com/esphome/esphome/blob/6682c43dfaeb1c006943ae546145e5f22262cadb/esphome/components/esp32_camera/__init__.py#L84 + # sets the lower limit to 10, but + # https://github.com/raphaelbs/esp32-cam-ai-thinker/blob/master/components/ov2640/sensors/ov2640.c#L345 + # suggests that it might be 0 (for an ov2640, anyway). + jpeg_quality: 20 +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/nightlight_ari.yaml Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,19 @@ +substitutions: + location: ari + +<<: !include esp8266_nightlight.yaml + +dallas: + - pin: GPIO5 +sensor: + - platform: dallas + index: 0 + name: temperature + +light: + - platform: fastled_clockless + chipset: WS2812B + pin: GPIO4 + num_leds: 16 + rgb_order: GRB + name: "rgb16"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/readcam.py Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,135 @@ +#!camtest/bin/python3 +import binascii +import logging +import time +import io +import os +import json +logging.basicConfig(level=logging.INFO) +from aiohttp import web +from aiohttp.web import Response +from aiohttp_sse import sse_response + +import asyncio + +from aioesphomeapi import APIClient +from aioesphomeapi.model import CameraState +import apriltag +import cv2 +import numpy + +class CameraReceiver: + def __init__(self, loop): + self.lastFrameTime = None + self.loop = loop + self.lastFrame = b"", '' + self.recent = [] + + async def start(self): + self.c = c = APIClient(self.loop, '10.2.0.21', 6053, 'MyPassword') + await c.connect(login=True) + await c.subscribe_states(on_state=self.on_state) + await c.request_image_stream() + + def on_state(self, s): + if isinstance(s, CameraState): + jpg = s.image + if len(self.recent) > 10: + self.recent = self.recent[-10:] + + self.recent.append(jpg) + print('recent lens: %s' % (','.join(str(len(x)) + for x in self.recent))) + else: + print('other on_state', s) + + def analyze(self, jpg): + img = cv2.imdecode(numpy.asarray(bytearray(jpg)), + cv2.IMREAD_GRAYSCALE) + result = detector.detect(img) + msg = {} + if result: + center = result[0].center + msg['center'] = [round(center[0], 2), round(center[1], 2)] + return msg + + async def frames(self): + while True: + if self.recent: + if self.lastFrameTime and time.time() - self.lastFrameTime > 15: + print('no recent frames') + os.abort() + + jpg = self.recent.pop(0) + msg = self.analyze(jpg) + yield jpg, msg + self.lastFrame = jpg, msg + self.lastFrameTime = time.time() + else: + await asyncio.sleep(.5) + +loop = asyncio.get_event_loop() + +recv = CameraReceiver(loop) +detector = apriltag.Detector() + +loop.create_task(recv.start()) + +def imageUri(jpg): + return 'data:image/jpeg;base64,' + binascii.b2a_base64(jpg).decode('ascii') + +async def stream(request): + async with sse_response(request) as resp: + await resp.send(imageUri(recv.lastFrame[0])) + await resp.send(json.dumps(recv.lastFrame[1])) + async for frame, msg in recv.frames(): + await resp.send(json.dumps(msg)) + await resp.send(imageUri(frame)) + return resp + +async def index(request): + d = r""" + <html> + <body> + <style> + #center { + position: absolute; + font-size: 35px; + color: orange; + text-shadow: black 0 1px 1px; + margin-left: -14px; + margin-top: -23px; + } + </style> + <script> + var evtSource = new EventSource("/stream"); + evtSource.onmessage = function(e) { + if (e.data[0] == '{') { + const msg = JSON.parse(e.data); + const st = document.querySelector('#center').style; + if (msg.center) { + st.left = msg.center[0]; + st.top = msg.center[1]; + } else { + st.left = -999; + } + } else { + document.getElementById('response').src = e.data; + } + } + </script> + <h1>Response from server:</h1> + <div style="position: relative"> + <img id="response"></img> + <span id="center" style="position: absolute">◎</span> + </div> + </body> + </html> + """ + return Response(text=d, content_type='text/html') + + +app = web.Application() +app.router.add_route('GET', '/stream', stream) +app.router.add_route('GET', '/', index) +web.run_app(app, host='0.0.0.0', port=10020)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/tasks.py Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,22 @@ +from invoke import task + +tag = 'esphome/esphome:dev' + +@task +def pull_esphome(ctx): + ctx.run(f"docker pull {tag}") + +@task +def program_board_over_usb(ctx, board): + ctx.run(f"docker run --rm -v `pwd`:/config -v /usr/share/fonts:/usr/share/fonts --device=/dev/ttyUSB0 -it {tag} {board}.yaml run", pty=True) + +@task +def program_board_over_wifi(ctx, board): + ctx.run(f"docker run --rm -v `pwd`:/config -v /usr/share/fonts:/usr/share/fonts -it --net=host {tag} {board}.yaml run", pty=True) + +@task +def monitor_usb(ctx, board): + ctx.run(f"docker run --rm -v `pwd`:/config --device=/dev/ttyUSB0 -it {tag} {board}.yaml logs", pty=True) + +# device up? +# nmap -Pn -p 3232,6053 10.2.0.21
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/espNode/theater_blaster.yaml Wed Feb 05 16:43:46 2020 -0800 @@ -0,0 +1,99 @@ +esphome: + name: theater_blaster + platform: esp32 + board: lolin32 + build_path: build + +# MAC: 3c:71:bf:ab:6e:94 + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + use_address: 10.2.0.38 + +mqtt: + broker: '10.2.0.1' + port: 1883 + username: '' + password: '' + on_message: + - topic: theater_blaster/ir_out + payload: "volume_up" + then: + - remote_transmitter.transmit_nec: + address: 0x4BB6 + command: 0x40BF + repeat: + times: 3 + - topic: theater_blaster/ir_out + payload: "volume_down" + then: + - remote_transmitter.transmit_nec: + address: 0x4BB6 + command: 0xC03F + repeat: + times: 3 + - topic: theater_blaster/ir_out + payload: "input_bd" + then: + - remote_transmitter.transmit_nec: + address: 0x4B36 + command: 0x31CE + - topic: theater_blaster/ir_out + payload: "input_cbl" + then: + - remote_transmitter.transmit_nec: + address: 0x4BB6 + command: 0x708F + - topic: theater_blaster/ir_out + payload: "input_game" + then: + - remote_transmitter.transmit_nec: + address: 0x4BB6 + command: 0xB04F + - topic: theater_blaster/ir_out + payload: "input_pc" + then: + - remote_transmitter.transmit_nec: + address: 0x4BB6 + command: 0x39C6 + +logger: + baud_rate: 115200 + level: DEBUG + +ota: + + +remote_receiver: + - id: ir_in + pin: + number: GPIO27 + mode: INPUT + inverted: True + dump: nec + - id: rf_in + pin: GPIO13 + dump: all + # Settings to optimize recognition of RF devices + tolerance: 50% + filter: 250us + idle: 4ms + buffer_size: 2kb + +remote_transmitter: + id: ir_out + pin: GPIO14 + carrier_duty_percent: 50% + + +#13 rf recv +#12 rf send +#https://www.passion-radio.com/img/cms/wifi-kit-32-pinout.png + + +#on_...: +# - remote_transmitter.transmit_nec: +# address: 0x1234 +# command: 0x78AB +
--- a/service/espNode/cabin.yaml Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,58 +0,0 @@ -# https://cdn.hackaday.io/files/269911154782944/Heltec_WIFI-LoRa-32_DiagramPinout.jpg - -esphome: - name: cabin - platform: ESP32 - board: lolin32 - build_path: build - esphome_core_version: latest - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password - domain: '' - -mqtt: - broker: '10.2.0.1' - port: 1883 - username: '' - password: '' - -logger: - baud_rate: 115200 - level: DEBUG - -ota: - - -#dallas: -# - pin: GPIO16 -#sensor: -# - platform: dallas -# index: 0 -# name: temperature - -light: - - platform: fastled_clockless - chipset: WS2812B - pin: GPIO21 - num_leds: 16 - rgb_order: GRB - name: "rgb" - -i2c: - sda: 4 - scl: 15 - -font: - - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" - id: font_vera - size: 14 - -display: - - platform: ssd1306_i2c - model: "SSD1306 128x64" - reset_pin: 16 - address: 0x3C - lambda: |- - it.print(0, 0, id(font_vera), "cabin 1.0: running");
--- a/service/espNode/display1.yaml Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -substitutions: - location: display1 - board: d1_mini - -<<: !include esp8266_nightlight.yaml - -i2c: - sda: D6 - scl: D5 - -font: - - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" - id: font_big - size: 24 - - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" - id: font_small - size: 12 - -text_sensor: - - platform: mqtt_subscribe - name: "Data from topic" - id: mysensor - topic: display1/text - -display: - - platform: ssd1306_i2c - model: "SSD1306 128x64" - address: 0x3c - lambda: |- - it.rectangle(0, 0, 127, 63); - it.printf(64, 5, id(font_big), TextAlign::TOP_CENTER, id(mysensor).state.c_str()); - it.printf(64, 63-5, id(font_small), TextAlign::BOTTOM_CENTER, "left today"); - - -spi: - clk_pin: D0 - miso_pin: D1 - mosi_ - pin: D2 - -pn532: - cs_pin: D3 - update_interval: 1s
--- a/service/espNode/esp8266_nightlight.yaml Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -esphome: - name: nightlight_${location} - platform: esp8266 - board: ${board} - # or esp12e - build_path: build - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password - domain: '' - -mqtt: - broker: '10.2.0.1' - port: 1883 - username: '' - password: '' - -logger: - baud_rate: 115200 - level: DEBUG - -ota:
--- a/service/espNode/frontwindow.yaml Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -substitutions: - location: display1 - board: d1_mini - -<<: !include esp8266_nightlight.yaml - -i2c: - sda: D6 - scl: D5 - -font: - - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" - id: font_big - size: 24 - - file: "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" - id: font_small - size: 12 - -text_sensor: - - platform: mqtt_subscribe - name: "Data from topic" - id: bigtext - topic: frontwindow/bigtext - - platform: mqtt_subscribe - name: "Data from topic" - id: smalltext - topic: frontwindow/smalltext - -display: - - platform: ssd1306_i2c - model: "SSD1306 128x64" - address: 0x3c - lambda: |- - it.rectangle(0, 0, 127, 63); - it.printf(64, 5, id(font_big), TextAlign::TOP_CENTER, id(bigtext).state.c_str()); - it.printf(64, 63-5, id(font_small), TextAlign::BOTTOM_CENTER, id(smalltext).state.c_str()); - - -spi: - clk_pin: D4 - miso_pin: D1 - mosi_pin: D2 - -pn532: - cs_pin: D3 - update_interval: 1s - on_tag: - then: - - mqtt.publish: - topic: frontwindow/tag - payload: !lambda 'return x;' -
--- a/service/espNode/garage_hall_cam.yaml Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -# jump IO0 to GND on the board for programming - -esphome: - name: garage_hall_cam - platform: ESP32 - board: nodemcu-32s - build_path: build - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password - domain: '' - use_address: 10.2.0.21 - -#mqtt: -# broker: '10.2.0.1' -# port: 1883 -# username: '' -# password: '' - -logger: - baud_rate: 115200 - level: DEBUG - -ota: - -api: - port: 6053 - password: 'MyPassword' - -esp32_camera: - external_clock: - pin: GPIO0 - frequency: 20MHz - i2c_pins: - sda: GPIO26 - scl: GPIO27 - data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35] - vsync_pin: GPIO25 - href_pin: GPIO23 - pixel_clock_pin: GPIO22 - power_down_pin: GPIO32 - - name: camera - # setting to 5 causes 'Setup Failed: ERROR' - max_framerate: 1 fps - # https://github.com/raphaelbs/esp32-cam-ai-thinker#capabilities says camera - # is likely ov2640 with these native resolutions: - # uxga=1600x1200 svga=800x600 cif=400x296 - # My camera has 'Setup Failed: ERROR' if this is not 640x480. Not sure why. - resolution: 640x480 - - # 10 to 63. default=10. higher is - # worse. https://github.com/esphome/esphome/blob/6682c43dfaeb1c006943ae546145e5f22262cadb/esphome/components/esp32_camera/__init__.py#L84 - # sets the lower limit to 10, but - # https://github.com/raphaelbs/esp32-cam-ai-thinker/blob/master/components/ov2640/sensors/ov2640.c#L345 - # suggests that it might be 0 (for an ov2640, anyway). - jpeg_quality: 20 -
--- a/service/espNode/nightlight_ari.yaml Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -substitutions: - location: ari - -<<: !include esp8266_nightlight.yaml - -dallas: - - pin: GPIO5 -sensor: - - platform: dallas - index: 0 - name: temperature - -light: - - platform: fastled_clockless - chipset: WS2812B - pin: GPIO4 - num_leds: 16 - rgb_order: GRB - name: "rgb16"
--- a/service/espNode/readcam.py Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,135 +0,0 @@ -#!camtest/bin/python3 -import binascii -import logging -import time -import io -import os -import json -logging.basicConfig(level=logging.INFO) -from aiohttp import web -from aiohttp.web import Response -from aiohttp_sse import sse_response - -import asyncio - -from aioesphomeapi import APIClient -from aioesphomeapi.model import CameraState -import apriltag -import cv2 -import numpy - -class CameraReceiver: - def __init__(self, loop): - self.lastFrameTime = None - self.loop = loop - self.lastFrame = b"", '' - self.recent = [] - - async def start(self): - self.c = c = APIClient(self.loop, '10.2.0.21', 6053, 'MyPassword') - await c.connect(login=True) - await c.subscribe_states(on_state=self.on_state) - await c.request_image_stream() - - def on_state(self, s): - if isinstance(s, CameraState): - jpg = s.image - if len(self.recent) > 10: - self.recent = self.recent[-10:] - - self.recent.append(jpg) - print('recent lens: %s' % (','.join(str(len(x)) - for x in self.recent))) - else: - print('other on_state', s) - - def analyze(self, jpg): - img = cv2.imdecode(numpy.asarray(bytearray(jpg)), - cv2.IMREAD_GRAYSCALE) - result = detector.detect(img) - msg = {} - if result: - center = result[0].center - msg['center'] = [round(center[0], 2), round(center[1], 2)] - return msg - - async def frames(self): - while True: - if self.recent: - if self.lastFrameTime and time.time() - self.lastFrameTime > 15: - print('no recent frames') - os.abort() - - jpg = self.recent.pop(0) - msg = self.analyze(jpg) - yield jpg, msg - self.lastFrame = jpg, msg - self.lastFrameTime = time.time() - else: - await asyncio.sleep(.5) - -loop = asyncio.get_event_loop() - -recv = CameraReceiver(loop) -detector = apriltag.Detector() - -loop.create_task(recv.start()) - -def imageUri(jpg): - return 'data:image/jpeg;base64,' + binascii.b2a_base64(jpg).decode('ascii') - -async def stream(request): - async with sse_response(request) as resp: - await resp.send(imageUri(recv.lastFrame[0])) - await resp.send(json.dumps(recv.lastFrame[1])) - async for frame, msg in recv.frames(): - await resp.send(json.dumps(msg)) - await resp.send(imageUri(frame)) - return resp - -async def index(request): - d = r""" - <html> - <body> - <style> - #center { - position: absolute; - font-size: 35px; - color: orange; - text-shadow: black 0 1px 1px; - margin-left: -14px; - margin-top: -23px; - } - </style> - <script> - var evtSource = new EventSource("/stream"); - evtSource.onmessage = function(e) { - if (e.data[0] == '{') { - const msg = JSON.parse(e.data); - const st = document.querySelector('#center').style; - if (msg.center) { - st.left = msg.center[0]; - st.top = msg.center[1]; - } else { - st.left = -999; - } - } else { - document.getElementById('response').src = e.data; - } - } - </script> - <h1>Response from server:</h1> - <div style="position: relative"> - <img id="response"></img> - <span id="center" style="position: absolute">◎</span> - </div> - </body> - </html> - """ - return Response(text=d, content_type='text/html') - - -app = web.Application() -app.router.add_route('GET', '/stream', stream) -app.router.add_route('GET', '/', index) -web.run_app(app, host='0.0.0.0', port=10020)
--- a/service/espNode/tasks.py Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -from invoke import task - -tag = 'esphome/esphome:dev' - -@task -def pull_esphome(ctx): - ctx.run(f"docker pull {tag}") - -@task -def program_board_over_usb(ctx, board): - ctx.run(f"docker run --rm -v `pwd`:/config -v /usr/share/fonts:/usr/share/fonts --device=/dev/ttyUSB0 -it {tag} {board}.yaml run", pty=True) - -@task -def program_board_over_wifi(ctx, board): - ctx.run(f"docker run --rm -v `pwd`:/config -v /usr/share/fonts:/usr/share/fonts -it --net=host {tag} {board}.yaml run", pty=True) - -@task -def monitor_usb(ctx, board): - ctx.run(f"docker run --rm -v `pwd`:/config --device=/dev/ttyUSB0 -it {tag} {board}.yaml logs", pty=True) - -# device up? -# nmap -Pn -p 3232,6053 10.2.0.21
--- a/service/espNode/theater_blaster.yaml Wed Feb 05 16:40:46 2020 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ -esphome: - name: theater_blaster - platform: esp32 - board: lolin32 - build_path: build - -# MAC: 3c:71:bf:ab:6e:94 - -wifi: - ssid: !secret wifi_ssid - password: !secret wifi_password - use_address: 10.2.0.38 - -mqtt: - broker: '10.2.0.1' - port: 1883 - username: '' - password: '' - on_message: - - topic: theater_blaster/ir_out - payload: "volume_up" - then: - - remote_transmitter.transmit_nec: - address: 0x4BB6 - command: 0x40BF - repeat: - times: 3 - - topic: theater_blaster/ir_out - payload: "volume_down" - then: - - remote_transmitter.transmit_nec: - address: 0x4BB6 - command: 0xC03F - repeat: - times: 3 - - topic: theater_blaster/ir_out - payload: "input_bd" - then: - - remote_transmitter.transmit_nec: - address: 0x4B36 - command: 0x31CE - - topic: theater_blaster/ir_out - payload: "input_cbl" - then: - - remote_transmitter.transmit_nec: - address: 0x4BB6 - command: 0x708F - - topic: theater_blaster/ir_out - payload: "input_game" - then: - - remote_transmitter.transmit_nec: - address: 0x4BB6 - command: 0xB04F - - topic: theater_blaster/ir_out - payload: "input_pc" - then: - - remote_transmitter.transmit_nec: - address: 0x4BB6 - command: 0x39C6 - -logger: - baud_rate: 115200 - level: DEBUG - -ota: - - -remote_receiver: - - id: ir_in - pin: - number: GPIO27 - mode: INPUT - inverted: True - dump: nec - - id: rf_in - pin: GPIO13 - dump: all - # Settings to optimize recognition of RF devices - tolerance: 50% - filter: 250us - idle: 4ms - buffer_size: 2kb - -remote_transmitter: - id: ir_out - pin: GPIO14 - carrier_duty_percent: 50% - - -#13 rf recv -#12 rf send -#https://www.passion-radio.com/img/cms/wifi-kit-32-pinout.png - - -#on_...: -# - remote_transmitter.transmit_nec: -# address: 0x1234 -# command: 0x78AB -