diff --git a/arbeitszimmer_oben_ble_tracker.yaml b/arbeitszimmer_oben_ble_tracker.yaml new file mode 100644 index 0000000..5b4cba8 --- /dev/null +++ b/arbeitszimmer_oben_ble_tracker.yaml @@ -0,0 +1,41 @@ + + +esphome: + name: arbeitszimmer-oben-ble-tracker + +esp32: + board: m5stack-atom + framework: + type: arduino + +logger: + +ota: + password: !secret ota_password + +wifi: + ssid: WLAN + password: !secret wifi_password + +mqtt: + broker: homeassistant.fritz.box + username: !secret mqtt_ble_username + password: !secret mqtt_ble_password + discovery: false + +esp32_ble_tracker: + scan_parameters: + interval: 1.2s + window: 500ms + active: false + on_ble_advertise: + - then: + - lambda: |- + auto build_json = [&](JsonObject obj) { + obj["rssi"] = x.get_rssi(); + obj["address"] = x.address_str(); + obj["address_uint64"] = x.address_uint64(); + if(x.get_tx_powers().size() > 0) + obj["tx_power"] = x.get_tx_powers()[0]; + }; + global_mqtt_client->publish_json("my_btmonitor/raw_measurements/az_oben", build_json); diff --git a/garten_bus_controller.yaml b/garten_bus_controller.yaml index 1625f33..b9459f6 100644 --- a/garten_bus_controller.yaml +++ b/garten_bus_controller.yaml @@ -111,13 +111,13 @@ packages: name: "ventil-sprinkler-westen" dev_addr: 0x1 register_addr: 0x03 - #relay04: !include - # file: "modbus_relay.yaml" - # vars: - # cid: relayboard32 - # name: "ventil-gartenhaus-kein-rohr-angeschlossen" - # dev_addr: 0x1 - # register_addr: 0x04 + relay04: !include + file: "modbus_relay.yaml" + vars: + cid: relayboard32 + name: "ventil-giessanlage-vorne" + dev_addr: 0x1 + register_addr: 0x04 relay05: !include file: "modbus_relay.yaml" vars: @@ -125,13 +125,13 @@ packages: name: "ventil-sprinkler-sud" dev_addr: 0x1 register_addr: 0x05 - #relay06: !include - # file: "modbus_relay.yaml" - # vars: - # cid: relayboard32 - # name: "ventil-gartenhaus-kein-ventil-angeschlossen" - # dev_addr: 0x1 - # register_addr: 0x06 + relay06: !include + file: "modbus_relay.yaml" + vars: + cid: relayboard32 + name: "ventil-beet-sued" + dev_addr: 0x1 + register_addr: 0x06 relay07: !include file: "modbus_relay.yaml" vars: diff --git a/gartenhaus_taster_input.yaml b/gartenhaus_taster_input.yaml index 75a7e26..e77b8e0 100644 --- a/gartenhaus_taster_input.yaml +++ b/gartenhaus_taster_input.yaml @@ -1,10 +1,6 @@ esphome: name: gartenhaus-taster-input - includes: - - my_btmonitor.h - libraries: - - mbedtls esp32: board: esp32-poe @@ -22,7 +18,6 @@ api: ota: password: !secret ota_password - ethernet: type: LAN8720 mdc_pin: GPIO23 @@ -158,8 +153,6 @@ binary_sensor: device_class: LIGHT - - mqtt: broker: homeassistant.fritz.box username: !secret mqtt_ble_username @@ -175,17 +168,18 @@ esp32_ble_tracker: on_ble_advertise: - then: - lambda: |- - const char * detected_device_name = ble_device_name(x.address()); - if(detected_device_name != nullptr) { - auto build_json = [&](JsonObject obj) { - obj["id"] = detected_device_name; - obj["rssi"] = x.get_rssi(); - if(x.get_tx_powers().size() > 0) - obj["tx_power"] = x.get_tx_powers()[0]; - }; - global_mqtt_client->publish_json(std::string("my_btmonitor/devices/") + detected_device_name + "/garten", - build_json); - } + auto build_json = [&](JsonObject obj) { + obj["rssi"] = x.get_rssi(); + obj["address"] = x.address_str(); + obj["address_uint64"] = x.address_uint64(); + if(x.get_tx_powers().size() > 0) + obj["tx_power"] = x.get_tx_powers()[0]; + }; + global_mqtt_client->publish_json("my_btmonitor/raw_measurements/garten", build_json); + + + + #on_multi_click: diff --git a/led_controller_gartenhaus.yaml b/led_controller_gartenhaus.yaml index 2a44bb6..2dc3bd6 100644 --- a/led_controller_gartenhaus.yaml +++ b/led_controller_gartenhaus.yaml @@ -91,7 +91,7 @@ light: id: gartenhaus_wandlicht name: Gartenhaus Wandlicht pin: 3 - num_leds: 305 + num_leds: 306 is_rgbw: true rmt_channel: 0 effects: diff --git a/m5stackfire.yaml b/m5stackfire.yaml index 2341357..75fa84a 100644 --- a/m5stackfire.yaml +++ b/m5stackfire.yaml @@ -1,17 +1,24 @@ esphome: name: m5stackfire - includes: - - my_btmonitor.h - libraries: - - mbedtls - platformio_options: - board_upload.flash_size: 16MB - board_build.partitions: "../../../m5stackfire_partition.csv" + +external_components: + - source: + type: git + url: https://github.com/ssieb/custom_components + components: [ip5306] + - source: + type: local + path: ./my_components esp32: board: m5stack-fire + flash_size: 16MB + #framework: + # type: arduino framework: - type: arduino + type: esp-idf + +psram: substitutions: friendly_name: "M5StackFire" @@ -23,6 +30,7 @@ api: - service: mhz19_calibrate_zero then: - mhz19.calibrate_zero: my_mhz19 + wifi: ssid: WLAN password: !secret wifi_password @@ -33,11 +41,6 @@ ota: logger: # Power Management -external_components: - - source: - type: git - url: https://github.com/ssieb/custom_components - components: [ip5306] ip5306: battery_level: @@ -64,7 +67,7 @@ binary_sensor: inverted: true on_click: then: - - switch.toggle: backlight + - switch.toggle: backlight - platform: gpio id: m5stackfire_button_right pin: @@ -80,7 +83,7 @@ switch: pin: 32 name: "Backlight" id: backlight - restore_mode: ALWAYS_ON + restore_mode: ALWAYS_OFF light: #- platform: monochromatic # backlight @@ -111,42 +114,44 @@ light: from: 5 to: 9 - i2c: sda: 21 scl: 22 scan: True # Display -#spi: -# clk_pin: 18 -# mosi_pin: 23 -# miso_pin: 19 -# -#font: -# - file: "gfonts://Roboto" -# id: roboto -# size: 18 -# -#image: -# - file: m5stack_display.png -# id: img_background -# type: RGB24 -# -# -#display: -# - platform: ili9xxx -# model: M5STACK -# cs_pin: 14 -# dc_pin: 27 -# reset_pin: 33 -# id: my_display -# lambda: |- -# it.image(0, 0, id(img_background)); -# it.printf(240, 67, id(roboto), Color(255, 255, 255), TextAlign::TOP_CENTER, "%.0f ppm", id(co2value).state ); -# it.printf(240, 125, id(roboto), Color(255, 255, 255), TextAlign::TOP_CENTER, "%.1f °C", id(co2temp).state ); -# it.printf(240, 184, id(roboto), Color(255, 255, 255), TextAlign::TOP_CENTER, "%.1f %%", id(m5stackfire_dht22_humidity).state ); -# +spi: + clk_pin: 18 + mosi_pin: 23 + miso_pin: 19 + +font: + - file: "gfonts://Roboto" + id: roboto + size: 18 + +image: + - file: m5stack_display.png + id: img_background + type: RGB24 + + +display: + - platform: ili9xxx + model: M5STACK + spi_mode: MODE3 + data_rate: 20MHz + cs_pin: 14 + dc_pin: 27 + reset_pin: 33 + update_interval: 20s + id: my_display + lambda: |- + it.image(0, 0, id(img_background)); + it.printf(240, 67, id(roboto), Color(255, 255, 255), TextAlign::TOP_CENTER, "%.0f ppm", id(co2value).state ); + it.printf(240, 125, id(roboto), Color(255, 255, 255), TextAlign::TOP_CENTER, "%.1f °C", id(co2temp).state ); + it.printf(240, 184, id(roboto), Color(255, 255, 255), TextAlign::TOP_CENTER, "%.1f %%", id(m5stackfire_dht22_humidity).state ); + uart: id: uart_co2 @@ -175,30 +180,32 @@ sensor: id: m5stackfire_dht22_humidity name: "DHT22 humidity" -mqtt: - broker: homeassistant.fritz.box - username: !secret mqtt_ble_username - password: !secret mqtt_ble_password - discovery: false - -esp32_ble_tracker: - scan_parameters: - interval: 1.2s - window: 500ms - active: false - on_ble_advertise: - - then: - - lambda: |- - const char * detected_device_name = ble_device_name(x.address()); - if(detected_device_name != nullptr) { - auto build_json = [&](JsonObject obj) { - obj["id"] = detected_device_name; - obj["rssi"] = x.get_rssi(); - if(x.get_tx_powers().size() > 0) - obj["tx_power"] = x.get_tx_powers()[0]; - }; - global_mqtt_client->publish_json(std::string("my_btmonitor/devices/") + detected_device_name + "/az_oben", - build_json); - } +# BTLE doesn't work - not enough RAM +# PSRAM isn't usable because chip is wired to same pins as UART PORT-C :( +# +#mqtt: +# broker: homeassistant.fritz.box +# username: !secret mqtt_ble_username +# password: !secret mqtt_ble_password +# discovery: false +# +#nimble_tracker: +#esp32_ble_tracker: +# scan_parameters: +# interval: 1.2s +# window: 500ms +# active: false +# on_ble_advertise: +# - then: +# - lambda: |- +# auto build_json = [&](JsonObject obj) { +# obj["rssi"] = x.get_rssi(); +# obj["address"] = x.address_str(); +# obj["address_uint64"] = x.address_uint64(); +# if(x.get_tx_powers().size() > 0) +# obj["tx_power"] = x.get_tx_powers()[0]; +# }; +# global_mqtt_client->publish_json("my_btmonitor/raw_measurements/az_oben", build_json); +# \ No newline at end of file diff --git a/my_btmonitor.h b/my_btmonitor.h deleted file mode 100644 index f35ad46..0000000 --- a/my_btmonitor.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include "mbedtls/aes.h" - -int bt_encrypt_be(const uint8_t *key, const uint8_t *plaintext, uint8_t *enc_data) { - mbedtls_aes_context ctx; - mbedtls_aes_init(&ctx); - - if (mbedtls_aes_setkey_enc(&ctx, key, 128) != 0) { - mbedtls_aes_free(&ctx); - return -1; - } - - if (mbedtls_aes_crypt_ecb(&ctx, MBEDTLS_AES_ENCRYPT, plaintext, enc_data) != 0) { - mbedtls_aes_free(&ctx); - return -1; - } - - mbedtls_aes_free(&ctx); - return 0; -} - -struct encryption_block { - uint8_t key[16]; - uint8_t plain_text[16]; - uint8_t cipher_text[16]; -}; - -inline bool ble_ll_resolv_rpa(const uint8_t *rpa, const uint8_t *irk) { - struct encryption_block ecb; - - auto irk32 = (const uint32_t *)irk; - auto key32 = (uint32_t *)&ecb.key[0]; - auto pt32 = (uint32_t *)&ecb.plain_text[0]; - - key32[0] = irk32[0]; - key32[1] = irk32[1]; - key32[2] = irk32[2]; - key32[3] = irk32[3]; - - pt32[0] = 0; - pt32[1] = 0; - pt32[2] = 0; - pt32[3] = 0; - - ecb.plain_text[15] = rpa[5 - 3]; - ecb.plain_text[14] = rpa[5 - 4]; - ecb.plain_text[13] = rpa[5 - 5]; - - bt_encrypt_be(ecb.key, ecb.plain_text, ecb.cipher_text); - - if (ecb.cipher_text[15] != rpa[5 - 0] || ecb.cipher_text[14] != rpa[5 - 1] || ecb.cipher_text[13] != rpa[5 - 2]) return false; - - return true; -} - -static const char * ble_device_name(const uint8_t * rpa) { - static constexpr uint8_t irk_martins_apple_watch[] = {0xaa, 0x67, 0x54, 0x2b, 0x82, 0xc0, 0xe0, 0x5d, 0x65, 0xc2, 0x7f, 0xb7, 0xe3, 0x13, 0xab, 0xa5}; - static constexpr uint8_t irk_martins_iphone[] = {0x84, 0x0e, 0x38, 0x92, 0x64, 0x4c, 0x1e, 0xbd, 0x15, 0x94, 0xa9, 0x06, 0x9c, 0x14, 0xce, 0x0d}; - if(ble_ll_resolv_rpa(rpa, irk_martins_apple_watch)) { - return "martins_apple_watch"; - } - else if(ble_ll_resolv_rpa(rpa, irk_martins_iphone)) { - return "martins_iphone"; - } - else { - return nullptr; - } -} \ No newline at end of file