Integração de Recuperadores e Salamandras Solzaima Através da Cloud MyCeza

Este Topico vem no segimento deste Ligação Solzaima.

Olá João,
A integração que criaste continua a funcionar, tive apenas de atualizar o código das automações.
Mais uma vez, bem hajas e muito obrigado.

Se puderes partilhar as alterações que fizeste poderão ser úteis a alguém. Eu fiz bastantes ajustes desde aí nomeadamente porque causa da instabilidade do site deles e também introduzi algumas melhorias. Vou partilhar tudo em breve.

Na verdade, apenas atualizei o código em função das alterações de yaml introduzidas pelas atualizações do HA, mas aqui vai. Não vinha ao fórum há algum tempo e vi que o pessoal também está com dificuldades em atualizar os status do fogão, para isso fiz uma automação em Node Red para fazer o update a cada hora. O servidor da Solzaima de vez em quando entra em stress, em outubro tive de me queixar várias vezes pois nem conseguia fazer nada através do site.
Finalmente, julgo que seria mesmo bom se colocasses de novo o código todo, uma vez que parece que já fizeste algumas melhorias. És uma machine! Obrigado.

Automação:

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

- id: myceza_session_refresh
  alias: Myceza Session Refresh
  triggers:
    - trigger: 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
  actions:
    - action: rest_command.myceza_session_logout
      data: {}
    - action: multiscrape.trigger_solzaima_ha_integration
      data: {}
  mode: single
  
# Recuperador stove_mode_sel
- id: stove_load_myceza_settings
  alias: stove_load_myceza_settings
  triggers:
  - entity_id: input_boolean.stove_control_settings
    trigger: state
  conditions:
  actions:
  - data_template:
      entity_id: input_select.stove_fire_temperature_sel
      value: '{{ states.sensor.stove_fire_temperature.state }}'
    action: input_select.select_option
  - data_template:
      entity_id: input_select.stove_mode_sel
      option: '{{ states.sensor.stove_mode_desc.state }}'
    action: input_select.select_option
  - data_template:
      entity_id: input_select.stove_fan_speed_sel
      option: '{{ states.sensor.stove_fan_one_desc.state }}'
    action: input_select.select_option  

Ah ok. Ainda não escrevo yaml com a nova sintaxe mas um dia vai acontecer. Tenho quase 200 automações e enquanto funcionar deixa estar.
Verdade! Os servidores da Myceza não estão muito estaveis e até tiveram um erros na pagina Web que enviavam mal o payload que fazia com que algumas funções não funcionassem (quem descobriu foi o @Rafael_Silva e depois fizemos as adaptaçoes necessárias) mas entretanto já corrigiram. Outra coisa eles modificaram o tempo de polling com a base de dados pois só atualiza de 30 em 30 minutos mas se fores abrires a app então atualiza (estou a desenvolver algo para que o HA se comporte como a App :wink: eforce a atualização com um botão).
Quando dizes que te “queixaste” foi à Solzaima? Eles responderam?

:fire: :fire: :fire:NOVA VERSAO :fire: :fire: :fire:

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 qualquer versão atual

  2. No configuration. yaml inserir a seguinte configuração (Não há alterações da versão anterior)

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 a partir  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

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 que o HA consiga 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”

Sim, a Solzaima respondeu, ainda que demorasse e acabaram por resolver após muita insistência, fiquei sem acesso pelo HA durante 2/3 semanas.

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

  1. Esta parte usa usa a integracão “file” que entretanto foi migrada para a interface gráfica. Adicionar uma nova integração

image

E criar os seguintes 2 sensores: Add Entry

image

file_path: /config/multiscrape/solzaima_ha_integration/page_response_headers.txt
value_template: ‘{{ (value.split("=")[2]).split(";")[0] }}’

image

Depois de criar renomear o sensor para: mycezaxsrftoken

Criar o segundo sensor:

file_path: /config/multiscrape/solzaima_ha_integration/page_response_headers.txt
value_template: ‘{{ (value.split("=")[6]).split(";")[0] }}’

Depois de criar renomear o sensor para: mycezasession

  1. Criar um sensor template para garantir que não perdemos o “mycezadatatoken” extraído no Parte 1
    No ficheiro sensors.yaml (caso tenha os sensores separado) inserir:
- platform: template
  scan_interval: 30
  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' and datatoken_actual != 'unavailable') else states('sensor.mycezadatatoken_actual_ks') }}

Ainda no ficheiro sensors.yaml criar o sensor rest que vai descarregar o json completo do estado da salamandra.

- platform: rest
  name: mycezajson
  unique_id: mycezajson
  resource_template: >
       https://myceza.it/api/user/en
  json_attributes:
    - stoves
  value_template: '{{ value_json.stoves["XX:XX:XX.XX.XX:XX"].name}}' 
  scan_interval: 60
  timeout: 30
  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') }}

Nota:: Substituir XX:XX:XX:XX:XX:XX pelo Mac address do recuperador que aparece na app e/ou na url do myceza.it.
Os tempos de polling bem como os timeouts foram ajustados tendo em conta a resposta dos servidores do myceza.

A esta altura e depois de reiniciar HA já devem ver o estado do sensor.mycezajson. Ir a deveveloper Tools, Sates :

stoves:
  XX:XX:XX:XX:XX:XX:
    macaddress: XX:XX:XX:XX:XX:XX
    name: Recuperador Sala Wind
    lastSelected: true
    online: true
    localIP: 192.168.1.xxx
    statuses:
      status:
        code: D009
        value: "3"
        label: Stove on
        imageRelativePath: images/status/green.png
        min: ""
        max: ""
        security: "1000"
      model: INS 9
      fumes_temperature:
        code: D507
        value: "125"
        label: Fumes Temperature
        imageRelativePath: images/status/red.png
        min: ""
        max: ""
        security: "1000"
      room_temperature:
        code: D508
        value: "23.5"
        label: Room Temperature
        imageRelativePath: images/status/red.png
        min: ""
        max: ""
        security: "1000"
      water_temperature: null
      power:
        code: F000
        value: "1"
        label: "ON"
        imageRelativePath: images/status/red.png
        min: ""
        max: ""
        security: "1000"
      mode:
        code: F001
        value: "1"
        label: MODE
        imageRelativePath: images/status/red.png
        min: ""
        max: ""
        security: "1000"
      fire_temperature: null
      ambient_temperature:
        code: E001
        value: "23"
        label: TEMP
        imageRelativePath: images/status/red.png
        min: "5"
        max: "40"
        security: "1000"
      fan_one:
        code: E601
        value: "6"
        label: FAN1
        imageRelativePath: images/status/yellow.png
        min: "1"
        max: "6"
        security: "1000"
      fan_two: null
      heating_temperature: null
      builder: a99
    users:
      - username: emailderegistonomyceza@dominiodeemail.com
        isOwner: true
friendly_name: mycezajson

Notas sobre esta parte.
O recuperador gasta cerca de 9W quando desligado e isso no meu caso são 8 meses por ano. Coloquei uma Shelly Plug (16A) na alimentação que desligo em Março e volto a ligar en Novembro. E para não estar a ir buscar os estado à cloud pois daria que o equipamento está desconectado fiz esta alteração no sensor.mycezajson

  resource_template: >
     {% if is_state('switch.shelly_recuperador_calor','off') %}
       http://192.168.1.xxx:8123/local/mycezastoveoff.html
     {% else %}
       https://myceza.it/api/user/en
     {% endif %}  

e na pasta /config/www criei o ficheiro mycezastoveoff.html com o seguinte:

{
    "user": {
        "username": "",
        "firstName": "",
        "lastName": "",
        "security": 0,
        "token": "",
        "id": "",
        "validUntil": "",
        "passwordMd5": ""
    },
    "stoves": {
        "XX:XX:XX:XX:XX:XX": {
            "macaddress": "XX:XX:XX:XX:XX:XX",
            "name": "Recuperador Sala Wind",
            "lastSelected": true,
            "online": true,
            "localIP": "192.168.1.xxx",
            "statuses": {
                "status": {
                    "code": "D009",
                    "value": "10",
                    "label": "Stove Disconnected",
                    "imageRelativePath": "images\/status\/red.png",
                    "min": "",
                    "max": "",
                    "security": "1000"
                },
                "model": "INS 9",
                "fumes_temperature": {
                    "code": "D507",
                    "value": "20",
                    "label": "Fumes Temperature",
                    "imageRelativePath": "images\/status\/red.png",
                    "min": "",
                    "max": "",
                    "security": "1000"
                },
                "room_temperature": {
                    "code": "D508",
                    "value": "20.0",
                    "label": "Room Temperature",
                    "imageRelativePath": "images\/status\/red.png",
                    "min": "",
                    "max": "",
                    "security": "1000"
                },
                "water_temperature": null,
                "power": {
                    "code": "F000",
                    "value": "0",
                    "label": "ON",
                    "imageRelativePath": "images\/status\/red.png",
                    "min": "",
                    "max": "",
                    "security": "1000"
                },
                "mode": {
                    "code": "F001",
                    "value": "1",
                    "label": "MODE",
                    "imageRelativePath": "images\/status\/red.png",
                    "min": "",
                    "max": "",
                    "security": "1000"
                },
                "fire_temperature": null,
                "ambient_temperature": {
                    "code": "E001",
                    "value": "20",
                    "label": "TEMP",
                    "imageRelativePath": "images\/status\/red.png",
                    "min": "5",
                    "max": "40",
                    "security": "1000"
                },
                "fan_one": {
                    "code": "E601",
                    "value": "6",
                    "label": "FAN1",
                    "imageRelativePath": "images\/status\/yellow.png",
                    "min": "1",
                    "max": "6",
                    "security": "1000"
                },
                "fan_two": null,
                "heating_temperature": null,
                "builder": "a99"
            },
            "users": [
                {
                    "username": "",
                    "isOwner": true
                }
            ]
        }
    }
}

Que faz com a integração tenha sempre valores validos retirados localmente.

Última nota desta parte: Por vezes, e dependendo da configuração do HA, bem como o que no arranque do HA fica disponível primeiro e até a resposta dos servidores da Myceza, os sensores “file” quando tentam extrair os tokens da integração Multiscrape ainda não está disponivel o ficheiro “page_response_headers.txt”. Eu resolvi isto usando o ultimo ficheiro que foi criado, isto é não extraio da pasta config/multiscrape/solzaima_ha_integration mas sim de uma outra pasta que garante existe o ultimo ficheiro e é substituido quando um novo é gerado. Para quem quiser poderei partilhar estas alteraçao que necessita de um script python para fazer esta gestão de ficheiros.

1 Curtiu

Parte 3: Sensores Home Assistant

1 Curtiu

Bom dia, existe algo do tipo para módulo Wi-Fi 4heat?


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


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