changeset 726:b14020802f8a

espNode was not a service; move it to top dir Ignore-this: 3a46fb9f4d09a046dcc30ec838923d69
author drewp@bigasterisk.com
date Wed, 05 Feb 2020 16:43:46 -0800
parents 1ecceb2e92a3
children 00bfc1409088
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">&#x25ce;</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">&#x25ce;</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
-