Smarthome

ESPHome okosítás – Aroma Diffuser v1.1

Néhány változtatást eszközöltem a már ismerős Aroma Diffuser projekten.

Korábban, mikor először nyúltam ehhez a drágához, már említettem, hogy egyébként tele van LED-ekkel, világít a felső, átlátszó része. Ezt is szerettem volna bekötni ESPHome-mal.

Silvercrets Aroma Diffuser világítással
Valahogy így világít, igen.

Hardveres módosítás

Bekötöttem még egy optocsatolót, amivel a világítást állító gombot tudom nyomkodni.

Ezt a gombot nyomogatva ciklikusan változnak a fények. Ezek sorban:

  1. RGB, lassú áttűnés a színek között
  2. különböző színek, amit most fel nem sorolok…

Hosszan megnyomva kikapcsolja a fényt.

Szegénykében láthatóan vibrálnak amúgy a LED-ek. Vagy nagyon ergya benne a PWM vagy egyszerűen nem stabil forrásból kapnak áramot. Ezen nem fogok javítani, ez ilyen volt mindig is.

A fényekkel a cél leginkább az, hogy be tudjam kapcsolni magával a párásító részével együtt, így láthatom, hogy kapcsol ki és be. Na, meg miért hagynám ki, ha van benne ilyen feature eleve?

Tervezgetés

Kicsit alakítottam a kódon a fényen kívül is.

Kellett egy kis gondolkodás. Mivel egy gombot nyomkodva lehet minden állapotot elérni, ezért két opcióból választhattam ennek kezelésére:

  • kivezethetem a Home Assistantban mint egy gomb, aztán ott mindig nyomkodom/meghívom annyiszor, ahányszor kell a kért színhez (ergya megoldás, de működik),
  • felvehetek egy selectet, amiből kiválaszthatom melyik módot akarom (fasza megoldás).

Utóbbit választottam.

  • El kell tárolni egy változóban, hogy, hányszor lett a gomb megnyomva.
  • Kell egy selectet csinálni, ami tartalmazza az összes állapotot, megnevezéssel. Minden állapothoz hozzárendelni a gombnyomások számát.
  • Váltáskor az eddig megnyomott sorszámok és az új állapot sorszámát egymásból kivonva megkapjuk, hányszor kell megnyomni a gombot. Ezen egy ciklussal végig kell pörögni, annyiszor meg kell nyomjuk a gombot. Ha át kell fordítani (későbbi állapotból korábbiba, akkor még van egy csavar benne).

Ez így leírva már nem is tűnik annyira vészesnek.

Előtte persze még egyszer szét kellett szedjem, mert valahogy félrekötöttem az optocsatolót…

Szoftveres módosítások

Néhány dolgon időközben már módosítottam eleve:

  • Az ESP01-S boardon sajnos csak csupa strapping pin van, nálam pl. ez azt okozza, hogy mivel HIGH-ra teszi a GPIO-t, amire a bekapcsológomb van kötve, ha bedugtam a konnektorba a cuccot, azonnal bekapcsolt. Emiatt kellett egy kis hack, lásd lent.
  • Felvettem egy új szenzort, ami jelzi, ha kiürült a tartály.
  • Lerövidíthettem a pulse counter frissítését 1 másodpercről 300 ms-re. Így sokkal hamarabb van infónk arról, hogy ténylegesen be vagy ki van kapcsolva a gép.

Az első megoldása annyira nem volt vészes: bootoláskor késleltetve „megnyomom” a bekapcsológombot, ezzel ki fog kapcsolni.

esphome:
  name: aroma-diffuser
  friendly_name: Aroma Diffuser
  # Indításkor az ESP01S magától HIGH-ra teszi a pineket, úgyhogy emiatt azonnal bekapcsol a kütyü
  # Ha feléledt az ESPHome, ezért ki kell kapcsolni a diffusert.
  on_boot:
    priority: -100
    then:
      - switch.turn_off: aroma_diffuser_power

A második egy fokkal nehezebb volt. Felvettem egy változót, amiben azt tárolom mindig, hogy manuális beavatkozás miatt történt-e a ki-/bekapcsolás. Ezt a Home Assistantba kivezetett kapcsolónál mindig „true”-ra állítom.

A bekapcsolt állapotot visszajelző binary sensornál felvettem az érték változásakor lefutó eseményhez, hogy ellenőrizze, hogy

  • kikapcsolt az eszköz
  • ez nem manuális kapcsolóállítgatás miatt történt
  • már „bootolt” az eszköz, azaz nem az indításkori kikapcsolás miatt történt

Ilyenkor egy új, az üres tartályt jelző szenzort bekapcsolt állapotúra állítom. Ha legközelebb hozzányúlunk a kapcsolóhoz, akkor visszaáll ez a szenzor kikapcsolt állapotúra, hogy ne ragadjon be, mindig üres tartály jelzéssel.

…és akkor térjünk rá a fényekre. Került ugye egy optocsatoló a gombra. Első megnyomással bekapcsoljuk a fényeket, RGB módban, ilyenkor váltakoznak a színek maguktól. Következő gombnyomással már állítgatjuk, hogy milyen fix színt szeretnénk. Az utolsó szín után körbefordul, újra az RGB móddal indul (ami ilyenkor amúgy valamiért már nem váltogatja a színeket, csak ha előtte kikapcsolom a fényeket. Fura.)

Ehhez kellett két változó:

globals:
  # ...

  # Ez a változó tartalmazza az aktuálisan beállított LED világítás módjának sorszámát
   - id: v_led_mode
     type: int
     restore_value: no
     initial_value: '0'

  # Ez a változó fogja majd tartalmazni, hogy a LED mód váltáskor hányszor kell megnyomni a gombot
   - id: v_led_mode_iterations
     type: int
     restore_value: no
     initial_value: '0'

Azt hiszem a kommentek egyértelműek.

Emellé felvettem két scriptet, ami kicsit hasonlít a bekapcsológombhoz, jelet ad egy GPIO-n, aztán kis idő múlva nem, hogy gombnyomást szimuláljon. Egyik a bekapcsoláshoz és módváltáshoz, másik egy hosszú gombnyomás a kikapcsoláshoz.

# GPIO2 lett panelen lévő nyomógomb érintkezőire kötve
output:
  - platform: gpio
    pin: GPIO2
    id: btn_light

script:
  # A fizikai, ledeket kapcsoló gombot nyomkodja röviden: bekapcsolás, színváltás.
  - id: press_light_btn
    then:
      - output.turn_on: btn_light
      - delay: 120ms
      - output.turn_off: btn_light

  # A fizikai, ledeket kapcsoló gombot nyomkodja hosszan: kikapcsolás.
  - id: long_press_light_btn
    then:
      - output.turn_on: btn_light
      - delay: 3000ms
      - output.turn_off: btn_light

Jöjjön a lényeg. Csináltam egy selectet, ahol kiválasztható az összes mód. Váltáskor némi számolgatással megállapítom, hányszor kell megnyomni a gombot. Végül gy ciklus annyiszor fogja megnyomni a gombot, ahányszor kell.

select:
  - platform: template
    name: Light
    id: light_mode
    options:
     - "Off"
     - "RGB mode"
     - "Red"
     - "Dim Red"
     - "Yellow"
     - "Dim Yellow"
     - "Green"
     - "Dim Green"
     - "Cyan"
     - "Dim Cyan"
     - "Blue"
     - "Dim Blue"
     - "Pink"
     - "Dim Pink"
     - "White"
     - "Dim White"
    initial_option: "Off"
    optimistic: true
    on_value:
      # Kiírja a logba mire váltottunk
      - logger.log:
          format: "Light mode select new option: %d"
          args: ["i"]
      - lambda: |-
          int pmax = 0;
          int currentMode = id(v_led_mode);

          if (i >= currentMode) {
            # Ha a választott mód indexe nagyobb, mint a mostani, akkor egyszerűen kivonjuk egymásból.
            pmax = i - currentMode;
          } else {
            # Ha kissebb, akkor az összes elérhető módból ki kell vonni a most beállítottat és hozzáadunk egyet, hogy a kikapcsolt állapotot kihagyjuk. Ezzel visszaérünk a lista tetejére, szóval utána még hozzáadjuk azt, amekkora a kívánt érték indexe.
            pmax = 14 - currentMode + 1 + i;
          }

          # Eltesszük egy változóba, mennyiszer kell végül a gombot megnyomni.
          id(v_led_mode_iterations) = pmax;

          # Ha a 0., azaz a kikapcsolás opciót választjuk, akkor egyszerűen meghívjuk a kikapcsolás gombot és nullázzuk az értékeket.
          if (i == 0) {
            pmax = 0;
            id(v_led_mode_iterations) = 0;
            id(long_press_light_btn).execute();
          }
      # Megnyomjuk annyiszor a gombot, ahányszor a fenti alapján meg kell
      - repeat:
          count: !lambda 'return id(v_led_mode_iterations);'
          then:
            - script.execute: press_light_btn
            - delay: 150ms
      # Beállítja a mentett sorszámot a most kiválasztottra
      - lambda: |-
          id(v_led_mode) = i;

Smart Aroma Diffuser, hello

Home Assistantban ez lett belőle:

Aroma Diffuser Home Assistantban

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük