commit 37cafe50dcaf1040502bd6fe091b087cd07d1949 Author: Jonathan Christison Date: Sat Feb 15 19:45:25 2025 +0000 Initial Commit ESPHome config for understaris toilet thermostat diff --git a/gf_toilet.yaml b/gf_toilet.yaml new file mode 100644 index 0000000..52d9daa --- /dev/null +++ b/gf_toilet.yaml @@ -0,0 +1,139 @@ +esphome: + name: gf-toilet-thermostat + +bk72xx: + board: generic-bk7231t-qfn32-tuya + +uart: + rx_pin: RX1 + tx_pin: TX1 + baud_rate: 9600 + + +# Enable logging +logger: + +# Enable Home Assistant API +api: + password: "" + +mqtt: + broker: mqtt.blu3cat + username: openhab + password: Hl3Yr6cT2mgSp1eW + +ota: + - platform: esphome + password: "" + +wifi: + ssid: "blu3cat-legacy" + password: "tubbychristison" + + # Enable fallback hotspot (captive portal) in case wifi connection fails + ap: + ssid: "Gf Toilet Thermostat" + password: "yOfdzvIhC1Qd" + +captive_portal: + +time: + - platform: sntp + id: sntp_time + timezone: Europe/London + servers: + - blu3cat.blu3cat + - 192.168.3.1 + +tuya: + # The MCU uses this for displaying the time in the display as well as for + # scheduled programmes one may have configured in their thermostat. + time_id: sntp_time + + # (Optional) + # Schedules are not modeled in neither ESPHome nor Home Assistant. + # + # This parses the data point and emitting it as a string in the logs, and + # serves as an example for users desiring more advanced configurations. + on_datapoint_update: + - sensor_datapoint: 101 + datapoint_type: raw + then: + - lambda: |- + // Apparently these vary per model; these are valid for the BHT-002 + const int POS_HOUR = 1; + const int POS_MINUTE = 0; + const float TEMPERATURE_MULTIPLIER = 0.5f; + const std::map DAY_OFFSET = { + {0, "days 1-5"}, + {6, "day 6"}, + {12, "day 7"}, + }; + + for (auto& day : DAY_OFFSET) { + for (int period = 0; period < 6; period++) { + int offset = (day.first + period) * 3; + int hour = x[offset + POS_HOUR]; + int minute = x[offset + POS_MINUTE]; + float temp = x[offset + 2] * TEMPERATURE_MULTIPLIER; + ESP_LOGD("custom", "Scheduled program for %s %02d:%02d set at %.1f C", day.second.c_str(), hour, minute, temp); + } + } + +climate: + - platform: tuya + name: "Thermostat" + switch_datapoint: 1 + target_temperature_datapoint: 2 + current_temperature_datapoint: 3 + preset: + eco: + datapoint: 5 + temperature: 18 °C + temperature_multiplier: 0.5 + visual: + min_temperature: 15 °C + max_temperature: 30 °C + temperature_step: 0.1 °C + +sensor: + - platform: "tuya" + name: "Temperature" + sensor_datapoint: 3 + unit_of_measurement: "°C" + device_class: "temperature" + accuracy_decimals: 1 + filters: + - multiply: 0.5 + # The climate component already includes temperature, but having the + # temperature as a separate sensor can be useful + disabled_by_default: false + + # The external temperature sensor, if wired + - platform: "tuya" + name: "Temperature (external)" + sensor_datapoint: 102 + unit_of_measurement: "°C" + device_class: "temperature" + accuracy_decimals: 1 + filters: + - multiply: 0.5 + disabled_by_default: false + +switch: + - platform: "tuya" + name: "Lock" + icon: "mdi:lock" + switch_datapoint: 6 + - platform: "tuya" + name: "Device Power" + switch_datapoint: 1 + +select: + - platform: "tuya" + name: "Scheduled programming" + icon: "mdi:calendar" + enum_datapoint: 4 + options: + 0: Use scheduled programs + 1: Manual control \ No newline at end of file diff --git a/notes.md b/notes.md new file mode 100644 index 0000000..ece099f --- /dev/null +++ b/notes.md @@ -0,0 +1,17 @@ +Make: MOES +Model: WHT-NV-GB-WH-MS (box) +Model: BHT-002-GBLWW +Wifi Chipset: WB3S +Family: BK7231T + +Useful Links: +https://devices.esphome.io/devices/Beca-Thermostat +https://github.com/tuya-cloudcutter/tuya-cloudcutter/blob/main/INSTRUCTIONS.md +https://www.elektroda.com/rtvforum/topic4003974-60.html + + +Steps: +* Cloud cutter - Done +* Flash OpenBeken - Done +* Find sensible config - + diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..baffc96 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,82 @@ +aioesphomeapi==24.6.2 +aiohappyeyeballs==2.4.6 +ajsonrpc==1.2.0 +anyio==4.8.0 +appdirs==1.4.4 +argcomplete==3.5.3 +async_interrupt==1.2.1 +attrs==25.1.0 +bitarray==3.0.0 +bitstring==4.3.0 +bitstruct==8.19.0 +bk7231tools==2.1.0 +bottle==0.13.2 +certifi==2025.1.31 +cffi==1.17.1 +chacha20poly1305-reuseable==0.13.2 +charset-normalizer==3.4.1 +click==8.1.7 +colorama==0.4.6 +cryptography==43.0.0 +defcon==0.10.3 +ecdsa==0.19.0 +esphome==2024.12.4 +esphome-dashboard==20241217.1 +esptool==4.7.0 +fonttools==4.56.0 +freetype-py==2.5.1 +fs==2.4.16 +gflanguages==0.7.3 +glyphsets==1.0.0 +glyphsLib==6.10.1 +h11==0.14.0 +hexdump==3.3 +icmplib==3.0.4 +idna==3.10 +ifaddr==0.2.0 +importlib_metadata==8.6.1 +intelhex==2.3.0 +kconfiglib==13.7.1 +ltchiptool==4.11.6 +marshmallow==3.26.1 +noiseprotocol==0.3.1 +openstep_plist==0.5.0 +packaging==24.2 +paho-mqtt==1.6.1 +pillow==10.4.0 +platformio==6.1.16 +prettytable==3.14.0 +protobuf==3.20.3 +puremagic==1.27 +py-datastruct==1.1.0 +pycparser==2.22 +pycryptodome==3.21.0 +pyelftools==0.31 +pyparsing==3.2.1 +pyserial==3.5 +PyYAML==6.0.2 +reedsolo==1.7.0 +requests==2.32.3 +ruamel.yaml==0.18.6 +ruamel.yaml.clib==0.2.12 +semantic-version==2.10.0 +setuptools==75.8.0 +six==1.17.0 +sniffio==1.3.1 +starlette==0.39.2 +tabulate==0.9.0 +tornado==6.4 +typing_extensions==4.12.2 +tzdata==2025.1 +tzlocal==5.2 +ufoLib2==0.17.1 +unicodedata2==16.0.0 +urllib3==2.3.0 +uvicorn==0.30.6 +voluptuous==0.14.2 +wcwidth==0.2.13 +wsproto==1.2.0 +wxPython==4.2.2 +xmodem==0.4.7 +zeroconf==0.132.2 +zipp==3.21.0