Ligação Solzaima

Pessoal, tenho um recuperador da marca Solzaima com Wi-Fi e app própria, alguém sabe se é possível integrar no HA?

Isso aparece na lista oficial de integrações do HA ou existe custom component?

Eu já andei a ver e não encontrei nada, como tal resolvi não comprar o módulo WiFi.
Apliquei uma placa que fiz (esp8266) com dois reles para controlar o ligar e a potência ( alterna entre max e min) não é o ideal mas foi o mais econômico!
Ainda andei a ver se conseguia saber qual é o protocolo de comunicação da ficha db9, mas sem sucesso sem os equipamentos necessários!

Não existe nada, que eu saiba. Sendo wi-fi, há alguma hipótese de fazer alguma coisa?

Se é wifi poderá haver uma API mas nada garante que seja uma API aberta.

No meu caso vou instalar um recuperador de pelets da ecoforrst que já tem wi-fi e controlo remoto por APP. A minha dei é fazer man in the middle para conseguir ver os pedidos a serem feitos e criar um componente. Alternativamente estes aparelhos sem wi-fi teem controll remoto tbm o que permite usar um beamer pra activar e desactivar que já é QQ coisa

No manual do sistema wi-fi eles referem que é comunicação serie. Talvez dê para obter os dados…

Olá. Também estou a pensar integrar no HA mas no estou a usar uma caldeira. Alguém já conseguiu?
Obrigado

Ainda não vi nada, é pena…

Alguém sabe qual é o protocolo de comunicação deles?
Na caldeira tem uma ficha DB9 e uma RJ45.

Pelas fichas provavelmente RS232, RS235 ou RS485. Aliás, dizes até numa publicação anterior que o manual refere comunicação série.

Boas, também ando atrás disto. Anexo o manual do adaptador wi-fi usado nos recuperadores da Solzaima. Alem da aplicação My Stove Remote existe também um site que permite visualizar a temperatura, o modo e pouco mais pois é bastante limitado… (caso contrário com o Curl fazia-se aqui qq coisa). Sendo assim, e sem uma integração ainda disponível tenho 2 ideias:

  1. usar o BroadLink RM e enviar os comandos via IR e depois verificar o estado através do site https://myceza.it/en/login - Não é perfeita mas
  2. A segunda opção é a sugerida pelo @pjanuario e verificar os pedidos para depois adaptar um componente embora vá dar muito mais trabalho.

Estes são os manuais que existem:

Ainda não tenho o recuperador e deve chegar no início de Dezembros.

Este é o outro manual
https://www.ceza.it/it/index.php?controller=attachment&id_attachment=7

Boas. Para quem estiver interessado terminei a integração do recuperador da Solzaima com o Home Assistant


Ficou assim assim com todos os comandos:

Visto que são precisas muitas configurações colocarei se solicitado por algum membro.
Em versão resumida é necessário:

  • o módulo Wi-Fi
  • Fazer a configuração via App e criar um utilizador
    A partir daí o Recuperador fica acessível via browser em www.myceza.it
  • efetuar a autenticação no site: eu utilizei um custom component chamado multiscrape mas dá igualmente para fazer por CURL
  • extrair o data-token, XSFR TOKEN, My Session Token e CSFR token
  • criar um sensor dict rest api (formato JSON)
  • criar os vários sensores template a partir do anterior
  • criar os inputs para defenir temperatura, velocidade da ventoinha e modo
  • Criar os comandos REST para mudar os parâmetros e ligar e desligar
  • Criar um switch
  • Criar uma automação para efetuar e logout e novo login caso perca o acesso ao endpoint json
2 Curtiram

Ui!!!
Já estou à espera disto aos anos. Não tinha conhecimento técnico suficiente para esta proeza. Gostaria de mais pormenores para implementar isso, há partes do teu resumo que não entendo mesmo.
Muito obrigado pelo excelente trabalho!

Nos próximos dias vou então postar a solução completa. É necessário este custom component:

E este é opcional apenas para o Lovelace.

Presumo que já tenhas o acesso a myceza.it e tenhas algo semelhante a isto depois do login:

Obrigado por responder
Já tenho isso tudo, estou mortinho por configurar o resto…

João, quando puderes diz alguma coisa.
Obrigado

Ora aqui vai! tenho andado extremamente ocupado nos fins de semana e por isso a demora na resposta. Vou colocando em varios posts e de forma modular para fique mais compreensivel.

Parte 1: Login e extração de tokens através do scrape html (feito com um custom component mas tambem é possivel fazer com CURL). O componente nativo de scrape do HA não é adequado pois ha necessidade de submeter um form.

  1. Instalar o custom component https://github.com/danieldotnl/ha-multiscrape/releases versão 6.0.0 ou superior pois não funciona com a 5.7.0

  2. No configuration. yaml inserir a seguinte configuração:

multiscrape:
  - name: solzaima ha integration  
    resource: 'https://myceza.it/en'
    scan_interval: 86400 # isto sao 24h embora este token expira as 12h e uma automacao faz o reload
    log_response: True # apenas na Release 6
    form_submit:
      submit_once: False
      resubmit_on_error: True
      resource: 'https://myceza.it/en/login'
      select: '#main > div > div.panel-body > form'
      input:
        username: emailderegistonomyceza@dominiodeemail.com
        password: 'passworddoregisto '
    sensor:
      - unique_id: mycezadatatoken
        select: 'div#app-meta'
        name: Myceza Data Token
        attribute: 'data-token'
        value_template: '{{ value }}'
        on_error:
          log: error
      - unique_id: mycezacsrftoken
        select: 'head > meta:nth-child(3)'
        name: Myceza CSRF Token
        attribute: 'content'
        value_template: '{{ value }}'        
        on_error:
          log: error

rest_command:
  myceza_session_logout:
    url: https://myceza.it/en/logout
    method: POST
    headers:
      Host: myceza.it
      Connection: keep-alive
      Cache-Control: max-age=0
      Content-Length: 47
      Upgrade-Insecure-Requests: 1
      Content-Type: application/x-www-form-urlencoded
      Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
      Origin: https://myceza.it
      Sec-Fetch-Site: same-origin
      Sec-Fetch-Mode: navigate
      Sec-Fetch-User: ?1
      Sec-Fetch-Dest: document
      Referer: https://myceza.it/en/logout
      Accept-Encoding: gzip, deflate, br
      Accept-Language: en-US,en;q=0.9
      Cookie: >
        XSRF-TOKEN={{ states('sensor.mycezaxsrftoken')}}; myceza_session={{ states('sensor.mycezasession') }}
    payload: >    
      _token={{states.sensor.mycezacsrftoken.state}}


Notas: Substituir o username e password e atenção ao nome “solzaima ha integration” pois este componente vai criar dentro da pasta “config” uma pasta chamada multiscrape que terá uma subpasta com o nome dado acima. No meu caso com tenho espaços a pasta ficou “solzaima_ha_integration”

  1. Ainda no configuration.yaml acrescentar: para ser possivel aceder aos ficheiros criados:
homeassistant:
    allowlist_external_dirs:
      - /config
  1. Quando reiniciar o HA deverá aparecer algo como isto dentro da pasta “/config/multiscrape/solzaima_ha_integration”

Voltaremos mais tarde ao configuration.yaml para os comandos rest de controle do recuperador ou salamandra.

Parte 2: Criar sensores com os restantes tokens necessarios para a rest api

no ficheiro sensors.yaml (caso tenha os sensores separado) inserir:

- platform: file
  scan_interval: 30
  name: mycezaxsrftoken
  file_path: /config/multiscrape/solzaima_ha_integration/page_response_headers.txt
  value_template: '{{ (value.split("=")[2]).split(";")[0] }}'

- platform: file
  scan_interval: 30
  name: mycezasession
  file_path: /config/multiscrape/solzaima_ha_integration/page_response_headers.txt
  value_template: '{{ (value.split("=")[6]).split(";")[0] }}' 

- platform: template
  scan_interval: 5
  sensors:
# Recuperador Keep last Valid Token
      mycezadatatoken_actual_ks:
        unique_id: 'mycezadatatoken_actual_ks'
        value_template: >-
          {% set datatoken_actual = states('sensor.mycezadatatoken') %}
          {{ datatoken_actual if datatoken_actual != 'unknown' else states('sensor.mycezadatatoken_actual_ks') }}     
# Recuperador de Calor sensors based on JSON Dict
      stove_status:
        value_template: >       
          {% if is_state('sensor.mycezajson', 'Recuperador Sala') %}
            {{ (state_attr('sensor.mycezajson','stoves'))['XX:XX:XX:XX:XX:XX']['statuses']['status'].label }}
          {% else %}
            {{'None'}} 
          {% endif %}   
        unique_id: 'stove_status'
      stove_active: # 1 = Off , 3=On , 2= Starting, 4 = Shutdown
        unique_id: stove_ative
        value_template: >
          {% if is_state('sensor.mycezajson', 'Recuperador Sala') %}
            {{ (state_attr('sensor.mycezajson','stoves'))['XX:XX:XX:XX:XX:XX']['statuses']['status'].value }}
          {% else %}
            {{'None'}}
          {% endif %}        
      stove_fumes_temperature:
        unique_id: 'stove_fumes_temperature'
        icon_template: mdi:thermometer-alert
        friendly_name: "Recuperador Calor Temperatura Fumos"
        unit_of_measurement: "°C"
        value_template: >
          {% if is_state('sensor.mycezajson', 'Recuperador Sala') %}
            {{ (state_attr('sensor.mycezajson','stoves'))['XX:XX:XX:XX:XX:XX']['statuses']['fumes_temperature'].value }}
          {% else %}
            {{'None'}}
          {% endif %}
      stove_room_temperature:
        unique_id: 'stove_room_temperature'
        icon_template: mdi:home-thermometer-outline
        friendly_name: "Recuperador Calor Temperatura Sala"
        unit_of_measurement: "°C"
        value_template: >
          {% if is_state('sensor.mycezajson', 'Recuperador Sala') %}
            {{ (state_attr('sensor.mycezajson','stoves'))['XX:XX:XX:XX:XX:XX']['statuses']['room_temperature'].value }}
          {% else %}
            {{'None'}}
          {% endif %}
      stove_ambient_temperature:
        unique_id: 'stove_ambient_temperature'
        icon_template: mdi:home-thermometer-outline
        friendly_name: "Recuperador Calor Temperatura Selecionada"
        unit_of_measurement: "°C"
        value_template: >
          {% if is_state('sensor.mycezajson', 'Recuperador Sala') %}
            {{ (state_attr('sensor.mycezajson','stoves'))['XX:XX:XX:XX:XX:XX']['statuses']['ambient_temperature'].value }}
          {% else %}
            {{'None'}}
          {% endif %}
      stove_mode: # 1 = Auto
        unique_id: 'stove_mode'
        icon_template: mdi:autorenew
        value_template: >
          {% if is_state('sensor.mycezajson', 'Recuperador Sala') %}
            {{ (state_attr('sensor.mycezajson','stoves'))['XX:XX:XX:XX:XX:XX']['statuses']['mode'].value }}
          {% else %}
            {{'None'}}
          {% endif %}        
      stove_fan_one: # 1 to 5 and 6 = Auto
        unique_id: 'stove_fan_one'
        icon_template: mdi:fan
        value_template: >
          {% if is_state('sensor.mycezajson', 'Recuperador Sala') %}
            {{ (state_attr('sensor.mycezajson','stoves'))['XX:XX:XX:XX:XX:XX']['statuses']['fan_one'].value }}
          {% else %}
            {{'None'}}
          {% endif %}    
      # Sensors to use in Front-end control
      stove_status_desc:
        unique_id: 'stove_status_desc'
        icon_template: mdi:fireplace
        friendly_name: Recuperador Calor Estado
        value_template: >-
          {{ states('sensor.stove_status') | replace('Stove on', 'Ligado') | replace('Stove off', 'Desligado') | replace('In startup', 'Ativacao') | replace('In shutdown', 'Desativacao')}}      
      stove_mode_desc:
        unique_id: 'stove_mode_desc'
        icon_template: mdi:autorenew
        friendly_name: "Recuperador Calor Modo"
        value_template: >-
          {{ states('sensor.stove_mode') | replace('1', 'Auto') | replace('0', 'Manual')}}
      stove_fan_one_desc:
        unique_id: 'stove_fan_one_desc'
        icon_template: mdi:fan
        friendly_name: "Recuperador Calor Ventoinha"
        value_template: >-
          {{ states('sensor.stove_fan_one') | replace('6', 'Auto') }}
      # Sensors to keep last state    
      stove_active_ks:
        unique_id: 'stove_active_ks'
        value_template: >-
          {% set stative = states('sensor.stove_active') %}
          {{ stative if stative != 'unknown' else states('sensor.stove_active_ks') }}
      stove_active_all_on_states:
        unique_id: 'stove_active_all_on_states'
        value_template: |
          {% if states('sensor.stove_active_ks') == '2' or states('sensor.stove_active_ks') == '3' %}1{% else %}0{% endif %}

- platform: rest
  name: mycezajson
  json_attributes:
    - stoves
  value_template: '{{ value_json.stoves["XX:XX:XX:XX:XX:XX"].name}}' 
  resource: https://myceza.it/api/user/en
  scan_interval: 30 # este tempo pode ser ajustado para ter updates mais ou menos frequentes
  headers:
    Host: myceza.it
    Connection: keep-alive
    Authorization: >
      Bearer {{ states('sensor.mycezadatatoken_actual_ks') }}
    Accept: application/json, */*  
    X-XSRF-TOKEN: >
      {{ states('sensor.mycezaxsrftoken') | replace("%3D","=") }}
    Referer: https://myceza.it/en
    Accept-Encoding: gzip, deflate, br
    Accept-Language: en-US,en;q=0.9
    Cookie: >
      XSRF-TOKEN={{ states('sensor.mycezaxsrftoken')}}; myceza_session={{ states('sensor.mycezasession') }}	
   

Notas: Substituir XX:XX:XX:XX:XX:XX pelo Mac address do recuperador que aparece na app e/ou na url do myceza.it. Substituir “Recuperador Sala” pelo nome dado na APP myceza
Os sensores stove_active… nao são obrigatorios pois tem o objectivo de registar o tempo de utilização que uso para a gestão de utilização e consumo de Pellets e que mais tarde posso partilhar noutro topico. Fica aqui o lovelace card:

Terminada esta parte ja deverá ser possivel ver os seguintes sensores:

E para que o sistema renove os tokens de forma automatica ou em caso de erro no ficheiro automations.yaml inserir:

- id: myceza_session_reconnect
  alias: Myceza Session Reconnect
  trigger:
    platform: state
    entity_id: sensor.mycezajson
    from: 'Recuperador Sala'
    to: 'unknown'
  action:
    - service: rest_command.myceza_session_logout
      data: {}
    - service: multiscrape.trigger_solzaima_ha_integration
      data: {}
  mode: single

- id: myceza_session_refresh
  alias: Myceza Session Refresh
  trigger:
    - platform: time_pattern
      # Isto faz com que o multiscrape renove os tokens a cada 11 horas pois expiram a cada 12
      hours: '/11'
      minutes: 0
      seconds: 0
  action:
    - service: rest_command.myceza_session_logout
      data: {}
    - service: multiscrape.trigger_solzaima_ha_integration
      data: {}
  mode: single

Notas: não esquecer de substituir o “Recuperador Sala” pelo nome dado ao recuperador ou salamandra.

Na parte 3 que vou tentar postar amanhã veremos os inputs necessarios, scripts e comandos rest para ligar desligar e controlar a temperatura modo e velocidade da ventoina.


Copyright © 2017-2021. Todos os direitos reservados
CPHA.pt - info@cpha.pt


FAQ | Termos de Serviço/Regras | Política de Privacidade