Shutter Card - konfiguracja MQTT

Witam mam problem z konfiguracją MQTT pod elektryczne rolety. Dodałem kartę Shutter Card a w niej następujący kod:

type: custom:shutter-card
title: Roleta sypialnia
entities:
  - entity: cover.SypialniaRoletaLewaMQTT
    name: Lewa
    buttons_position: left
    title_position: bottom

w pliku configuration.yaml dodaję:

cover:
  - platform: mqtt
    name: "SypialniaRoletaLewaMQTT"
    state_topic: "/raw/esp8266roletapl/2695724/out"
    command_topic: "/raw/esp8266roletapl/2695724/in"
    position_topic: "/raw/esp8266roletapl/2695724/out"
    set_position_topic: "/raw/esp8266roletapl/2695724/in"
    set_position_template: '{ "set": {{ 100-set }} }'
    retain: true
    position_open: 0
    position_closed: 100
    payload_open: '{ "set": 0 }'
    payload_close: '{ "set": 100}'
    state_open: '{ "position": 0 }'
    state_closed: '{ "position": 100 }'
    value_template: "{{ value_json.position }}"
    device_class: shutter

Nie dam rady sterować roletą, położenie nie jest aktualizowane. Dodam że serwer MQTT działa poprawnie w nasłuchu brokera po uruchomieniu rolety otrzymuję:

Wiadomość 3 otrzymana w /raw/esp8266roletapl/2695724/out o godzinie 19:58:

{
    "set": 7,
    "position": 7
}

QoS: 0 - Retain: false 

Tak wygląda mój kod

 cover:
  - platform: mqtt
    name: "Zaluzje balkon"
    availability_topic: "tele/zaluzja_prawa/LWT"
    state_topic: "stat/zaluzja_prawa/RESULT"
    command_topic: "cmnd/zaluzja_prawa/Backlog"
    value_template: '{{ value | int }}'
    qos: 1
    retain: false
    payload_open: "ShutterOpen1"
    payload_close: "ShutterClose1"
    payload_stop: "ShutterStop1"
    state_open: "ON"
    state_closed: "OFF"
    payload_available: "Online"
    payload_not_available: "Offline"
    optimistic: false
    tilt_command_topic: 'cmnd/zaluzja_prawa/ShutterPosition1'
    tilt_status_topic: 'cmnd/zaluzja_prawa/ShutterPosition1'
    set_position_topic: 'cmnd/zaluzja_prawa/ShutterPosition1'
    position_topic: "stat/zaluzja_prawa/SHUTTER1"
    tilt_min: 0
    tilt_max: 100
    tilt_closed_value: 0
    tilt_opened_value: 100

Jeżeli nie pokazuje pozycji to masz cos źle wpisane.
Ściągnij sobie program http://mqtt-explorer.com podłącza do swojego MQTT będziesz miał rozeznanie co do ustawienia topic

Sterowanie góra / dół / zatrzymaj działa lecz dalej nie mam pokazanego stanu położenia rolety

cover:
  - platform: mqtt
    name: "PracowniaSypialniaLewaMQTT"
    state_topic: "/raw/esp8266roletapl/2695724/out"
    command_topic: "/raw/esp8266roletapl/2695724/in"
    position_topic: "/raw/esp8266roletapl/2695724/out"
    set_position_topic: "/raw/esp8266roletapl/2695724/in"
    set_position_template: '{ "position": {{ 100-position }} }'
    retain: true
    position_open: 0
    position_closed: 100
    payload_open: "0"
    payload_close: "100"
    payload_stop: "(0)"
    state_open: '{ "position": 0 }'
    state_closed: '{ "position": 100 }'
    value_template: "{{ value_json.int }}"
    qos: 1
    tilt_min: 0
    tilt_max: 100
    tilt_closed_value: 100
    tilt_opened_value: 0

Pod kartą w interfejsie widnieje unknown%

To znaczy ze msz zły position_topic:

Mam go jako "/raw/esp8266roletapl/2695724/out" i po wysłaniu wiadomości zwraca do brokera position i set

{
  "set": 100,
  "position": 100
}

Ściągnij sobie ten program https://mqttx.app
Podłącz do swojego mqtt HA

Jak połączysz z mqtt HA to kliknij w New Subscription i dodaj swój temat odpowiedzialny za pozycje żaluzji, wysteruj swoja żaluzje i zobacz czy zmienia się wartość pozycji, jeżeli tu będzie Ok to znaczy ze masz jakiś błąd w template cover

Tutaj wszystko działa, utworzyłem z ciekawości sensor w configuration.yaml

# MQTT Rolety odczyt położenia
- platform: mqtt
  name: "RoletaSypialniaMQTTPPozycja"
  state_topic: "/raw/esp8266roletapl/2695724/out"
  unit_of_measurement: "%"
  value_template: "{{ value_json.position }}"

w głównym oknie interfejsu HA dodałem wskaźnik i stan rolety jest poprawnie pokazywany gdy ją uruchomię. (po lewej stronie)

Wydaje mi się że gdzieś jest błąd w tej konfiguracji, próbuję na rożne sposoby i dalej nie pokazuje stanu. Sterowanie przyciskami działa, nawet kursorem jak przeciągnę roletę to też jest sterowana. Do pełni szczęści brakuje jednak żeby pokazywało ten stan automatycznie :confused:

cover:
  - platform: mqtt
    name: "SypialniaRoletaLewaMQTT"
    command_topic: "/raw/esp8266roletapl/2695724/in"
    position_topic: "/raw/esp8266roletapl/2695724/out"
    set_position_topic: "/raw/esp8266roletapl/2695724/in"
    state_topic: "/raw/esp8266roletapl/2695724/out"
    value_template: "{{ value_json.position }}"
    qos: 0
    retain: true
    payload_open: "0"
    payload_close: "100"
    payload_stop: "(0)"
    position_open: 0
    position_closed: 100
    payload_available: "online"
    payload_not_available: "offline"
    optimistic: false

Wejdź do Narzędzia deweloperskie → filtr encji i wpisz cover. zobacz czy nie masz jeszcze czegoś innego pod ta nazwą

To jest działający conf. dla mojej żaluzji

cover:
  - platform: mqtt
    name: "Zaluzje balkon"
    availability_topic: "tele/zaluzja_prawa/LWT"
    state_topic: "stat/zaluzja_prawa/RESULT"
    command_topic: "cmnd/zaluzja_prawa/Backlog"
    value_template: '{{ value | int }}'
    qos: 1
    retain: false
    payload_open: "ShutterOpen1"
    payload_close: "ShutterClose1"
    payload_stop: "ShutterStop1"
    state_open: "ON"
    state_closed: "OFF"
    payload_available: "Online"
    payload_not_available: "Offline"
    optimistic: false
    set_position_topic: 'cmnd/zaluzja_prawa/ShutterPosition1'
    position_topic: "stat/zaluzja_prawa/SHUTTER1"

Te pierwsze ukośniki powinien być ?

position_topic: "/raw/esp8266roletapl/2695724/out"
set_position_topic: "/raw/esp8266roletapl/2695724/in"

"cmnd/zaluzja_prawa/Backlog"

Usuń pierwsze ukośniki
Przeładuje MQTT

i sprawdź

W kodzie konfiguracji karty miałem błąd:

type: custom:shutter-card
title: Roleta sypialnia
entities:
  - entity: cover.SypialniaRoletaLewaMQTT
    name: Lewa
    buttons_position: left
    title_position: bottom

trzeba było zamienić na entity: cover.sypialniaroletalewamqtt

Teraz wyświetla już wartość procentową rolety ale nie zmienia się i wynosi 0%

roleta1

roleta2

Po części udało mi się rozwiązać problem lecz nie do końca. Status rolety jest pokazywany gdy wcisnę przycisk góra / dół na obrazku roleta jest zamknięta całkowicie lub otwarta. Sterowanie poprzez przesunięcie rolety również jest pokazywane i fizycznie otwiera / zamyka się do zadanej pozycji.

Lecz gdy wcisnę przycisk “Zatrzymaj” status nie jest odświeżony i zostaje na etapie 0% lub 100% w zależności kliknięcia przycisku góra dół lub gdy ręcznie ustawię pozycję rolety np. na 40% otwarcia roleta uruchamia się do zadanej pozycji lecz gdy wcisnę “Zatrzymaj” pozostaje na karcie na 40% mimo tego że fizycznie zatrzymało się na np. 30%

- platform: mqtt
  name: "sypialniaroletalewamqtt"
  command_topic: "/raw/esp8266roletapl/2695724/in"
  position_topic: "/raw/esp8266roletapl/2695724/in"
  set_position_topic: "/raw/esp8266roletapl/2695724/in"
  state_topic: "/raw/esp8266roletapl/2695724/out"
  value_template: "{{ value_json.position }}"
  qos: 0
  retain: true
  payload_open: "0"
  payload_close: "100"
  payload_stop: "(0)"
  position_open: 0
  position_closed: 100
  payload_available: "online"
  payload_not_available: "offline"

Jak odświeżyć status po ręcznym zatrzymaniu rolety ? Czy też tak masz ?

Położenie mam wyświetlane normalnie i odświeżane jest na bieżąco stop/start nie zawiesza % pokazywanego położenia. U mnie 100% to jest otwarcie a 0% jest zamknięcie.
Jaki masz w ogóle sterownik?

Projekt oparty jest na module ESP8266 Nodemcu a sketch wgrany z tej strony :

https://www.studiopieters.nl/homebridge-mqtt-blinds/

Wydaje mi się że coś mam namieszane w tej części kodu:

  command_topic: "/raw/esp8266roletapl/2695724/in"
  position_topic: "/raw/esp8266roletapl/2695724/in"
  set_position_topic: "/raw/esp8266roletapl/2695724/in"
  state_topic: "/raw/esp8266roletapl/2695724/out"
  value_template: "{{ value_json.position }}"

Zamieszczam screena z MQTT Explorera (IN wartość którą wysyłam w celu ustawienia pozycji rolety, OUT pierwsza wartość set - zadana pozycja natomiast position - zmienia się na wartość ustawioną w SET dopiero gdy roleta osiągnie zadane położenie

mqtt

Już mi się pomysły kończą :confused:

Ten parametr w kodzie masz na true
boolean saveItNow = false; //If true will store positions to SPIFFS

int path = 0;                       //Direction of blind (1 = down, 0 = stop, -1 = up)
int setPos = 0;                     //The set position 0-100% by the client
long currentPosition = 0;           //Current position of the blind
long maxPosition = 2000000;         //Max position of the blind. Initial value
boolean loadDataSuccess = false;
boolean saveItNow = false;          //If true will store positions to SPIFFS
bool shouldSaveConfig = false;      //Used for WIFI Manager callback to save parameters
boolean initLoop = true;            //To enable actions first time the loop is run```

Kodu ze sketchu raczej bym nie brał pod uwagę.

Zobacz zdjęcie. Roleta była całkowicie opuszczona do dołu. Wcisnąłem przycisk otwierania rolety (strzałkę do góry). Wartość w shutter-card wskoczyła od razu na 100%. Po około 3 sekundach wcisnąłem STOP.
Wskaźnik po lewej stronie (sensor) wskazał prawidłowe położenie rolety natomiast w shutter-card rolety się nie zaktualizował i pokazuje zadane położenie rolety a nie wziął pod uwagę że nacisnąłem STOP w trakcie otwierania.

Configuration.yaml sensora do odczytu MQTT:

- platform: mqtt
  name: "RoletaSypialniaLewaPozycja"
  state_topic: "/raw/esp8266roletapl/2695724/out"
  unit_of_measurement: "%"
  value_template: "{{ value_json.position }}"

100 % to u ciebie jest otwarta czy zamknięta?

Inna dodatek do obsługi rolet https://github.com/tungmeister/hass-blind-card

  - platform: mqtt
    name: "DIY Roller Shade"
    command_topic: "/raw/esp8266/[chipid]/in"
    set_position_topic: "/raw/esp8266/[chipid]/in"
    position_topic: "/raw/esp8266/[chipid]/out"
    value_template: "{{ value_json.position }}"
    json_attributes_topic: "/raw/esp8266/[chipid]/out"
    json_attributes_template: "{{ value_json.position | tojson }}"
    retain: false
    payload_open: "100"
    payload_close: "0"
    position_open: 100
    position_closed: 0

https://github.com/thehookup/motor-on-roller-blind-ws

Powyższy przykład nie bardzo działa w tej formie. Na razie odpuszczę sobie dalsze próby. Na chwilę obecną zablokowałem przycisk stop. Można sterować przyciskami góra/dół lub ręcznie klikając na pozycję rolety.
Dzięki bardzo za pomoc, wirtualne zimne duże piwko dla Ciebie Artur !

PS. Jak masz zrobione odświeżanie MQTT po restarcie centralki - tak żeby pobrało statusy MQTT i zaktualizowało stany na HA czy to przycisków czy opisanej wyżej rolety ?

Po restarcie HA to automatyzacja MQTT
cos jak

update_cover:
  alias: aktualizacja pozycji zaluzji
  sequence:
  - service: mqtt.publish
    data:
      topic: cmnd/xxxx/POWER
      payload: ""
  - service: mqtt.publish
    data:
      topic: cmnd/xxxx/ShutterPosition
      payload: ""

Normalnie tasmota co zdefiniowany czas sama wysyła pozycje .

Dla osób które by chciały wykonać taki projekt dodam żeby zamiast biblioteki Stepper_28BYJ_48.h zastosowały Stepper.h. Na tej pierwszej silnik nie dał rady podnosić / opuszczać większej rolety. Dodatkowo zmodyfikować trzeba:

Stepper_28BYJ_48 small_stepper(14, 0, 4, 5);

na:

const int stepsPerRevolution = 32;
Stepper small_stepper(stepsPerRevolution, 14, 0, 4, 5);

a w sekcji void(setup) dodać:

small_stepper.setSpeed(900);

i wszędzie w kodzie zmienić Stepper_28BYJ_48 na Stepper