# HG changeset patch
# User drewp@bigasterisk.com
# Date 1580949826 28800
# Node ID b14020802f8a856e349c19a5e6bdc49cf2dbebe9
# Parent 1ecceb2e92a3d39148e96229fc7f11824969ba3d
espNode was not a service; move it to top dir
Ignore-this: 3a46fb9f4d09a046dcc30ec838923d69
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/cabin.yaml
--- /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");
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/display1.yaml
--- /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
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/esp8266_nightlight.yaml
--- /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:
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/frontwindow.yaml
--- /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;'
+
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/garage_hall_cam.yaml
--- /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
+
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/nightlight_ari.yaml
--- /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"
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/readcam.py
--- /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"""
+
+
+
+
+ Response from server:
+
+
![]()
+
◎
+
+
+
+ """
+ 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)
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/tasks.py
--- /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
diff -r 1ecceb2e92a3 -r b14020802f8a espNode/theater_blaster.yaml
--- /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
+
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/cabin.yaml
--- 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");
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/display1.yaml
--- 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
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/esp8266_nightlight.yaml
--- 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:
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/frontwindow.yaml
--- 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;'
-
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/garage_hall_cam.yaml
--- 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
-
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/nightlight_ari.yaml
--- 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"
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/readcam.py
--- 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"""
-
-
-
-
- Response from server:
-
-
![]()
-
◎
-
-
-
- """
- 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)
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/tasks.py
--- 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
diff -r 1ecceb2e92a3 -r b14020802f8a service/espNode/theater_blaster.yaml
--- 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
-