Ligação Solzaima

Sim precisas de criar um ficheiro vazio “ inputdatetime.yaml ”na pasta /config que vai ser usado para o card que gere o consumo de pallets.

Sim faz automático mas por alguma razão não está a encontrar o rest_command myceza_session_logout.
Verifica por favor esta parte:


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}}

O sensor stove_fire_temperature realmente não coloquei, mas de resto pelo que vi assim muito por alto parece estar tudo bem, mas logo quando chegar a casa vou dar uma vista de olhos a sério.

Não te esqueças de mim João. :frowning:
Tenho usado o interruptor para ligar/desligar, 5 estrelas. Contudo, para controlar a velocidade da ventoinha e o modo do recuperador, não funciona. No entanto se for aos Services e escrever “rest_command.myceza_stove_set_fan_speed” com o valor, funciona de imediato. Consegues me dizer alguma coisa?
Obrigado

Esta pergunta era para o Fernando…. :grinning:
No entanto ainda bem que colocaste. Se puderes partilhar o “sensor.mycezajson” através das developer tools podemos ver quais os sensores que estão disponíveis para o teu tipo de salamandra e adaptar. O meu é um recuperador modelo Wind mas sem dúvida que cada modelo irá ter os seus específicos sensores.

Fernando, a razão por que falha penso que é porque o teu aparelho não tem o “ambient_temperature”!
Basta comentares as seguintes 4 linhas no automations.yaml


# Recuperador stove_mode_sel
- id: stove_load_myceza_settings
  alias: stove_load_myceza_settings
  trigger:
  - entity_id: input_boolean.stove_control_settings
    platform: state
  condition:
  action:
#  - data_template:
#      entity_id: input_number.stove_temp_sel
#      value: '{{ states.sensor.stove_ambient_temperature.state }}'
#    service: input_number.set_value
  - data_template:
      entity_id: input_select.stove_mode_sel
      option: '{{ states.sensor.stove_mode_desc.state }}'
    service: input_select.select_option
  - data_template:
      entity_id: input_select.stove_fan_speed_sel
      option: '{{ states.sensor.stove_fan_one_desc.state }}'
    service: input_select.select_option

E volto a referir que no teu caso é preciso criar o sensor “fire_temperature” que já tinha colocado o código acima!
Depois é preciso criar um comando rest, e também um input number de 1 a 6 (vou tentar fazer isto logo) e modificar a automação que que está neste post para que aplique a “fire temperature”, “stove_mode” and “fan speed”. Achas que se percebe?

Obrigado por me aturar João.
Ok, então eu já tinha tentando acrescentar o “fire temperature” e o que fiz foi o seguinte:

1 – Tinhas (sensors.yaml):

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 %}

1 – Substitui por (sensors.yaml):

        stove_fire_temperature:
          unique_id: 'stove_fire_temperature'
          icon_template: mdi:fire
          friendly_name: "Recuperador Calor Chama"
          value_template: >
            {% if is_state('sensor.mycezajson', XXXXX) %}
              {{ (state_attr('sensor.mycezajson','stoves'))[XXXXXXXXXXXXXX']['statuses']['fire_temperature'].value }}
            {% else %}
              {{'None'}}
            {% endif %}

2 – Tinhas (configuration.yaml):

myceza_stove_set_temperature:
    url: https://myceza.it/api/stove/command/en/XX:XX:XX:XX:XX:XX
    method: POST
    headers:
      Host: myceza.it
      Connection: keep-alive
      X-XSRF-TOKEN: >
        {{ states('sensor.mycezaxsrftoken') | replace("%3D","=") }}
      Authorization: >
        Bearer {{ states('sensor.mycezadatatoken_actual_ks') }}
      Content-Type: application/json;charset=UTF-8
      Accept: application/json, */*
      Origin: https://myceza.it
      Sec-Fetch-Site: same-origin
      Sec-Fetch-Mode: cors
      Sec-Fetch-Dest: empty
      Referer: https://myceza.it/en/stove/XX:XX:XX:XX:XX:XX
      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: >
      {"value":"{{states.input_number.stove_temp_sel.state | int}}","code":"E001"}

2 – Substitui por (configuration.yaml) e aqui inventei porque não sei bem qual é o payload:

  myceza_stove_set_fire_temperature:
    url: https://myceza.it/api/stove/command/en/xxxxxxxxxxxxxxx
    method: POST
    headers:
      Host: myceza.it
      Connection: keep-alive
      X-XSRF-TOKEN: >
        {{ states('sensor.mycezaxsrftoken') | replace("%3D","=") }}
      Authorization: >
        Bearer {{ states('sensor.mycezadatatoken_actual_ks') }}
      Content-Type: application/json;charset=UTF-8
      Accept: application/json, */*
      Origin: https://myceza.it
      Sec-Fetch-Site: same-origin
      Sec-Fetch-Mode: cors
      Sec-Fetch-Dest: empty
      Referer: https://myceza.it/en/stove/xxxxxxxxxxxxxxx
      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: >
      {"value":"{{states.input_number.stove_fire_temp_sel.state | replace ("Auto",6)}},"code":"E600"}

3 – Tinhas (inputselect.yaml):

# Recuperador de calor
stove_mode_sel:
  name: Recuperador Modo
  options:
    - Manual
    - Auto
  initial: Auto  
  icon: mdi:autorenew
stove_fan_speed_sel:
  name: Recuperador Velocidade Ventoinha
  options:
    - 1
    - 2
    - 3
    - 4
    - 5
    - Auto
  initial: Auto  
  icon: mdi:fan-plus

3 – Substitui por (inputselect.yaml) também inventei:

# Recuperador de calor
stove_mode_sel:
  name: Recuperador Modo
  options:
    - Manual
    - Auto
  initial: Manual  
  icon: mdi:autorenew
  
stove_fan_speed_sel:
  name: Recuperador Velocidade Ventoinha
  options:
    - 1
    - 2
    - 3
    - 4
    - 5
    - 6
    - Auto
  initial: 1  
  icon: mdi:fan-plus
  
stove_fire_temperature_sel:
  name: Recuperador Velocidade Chama
  options:
    - 1
    - 2
    - 3
    - 4
    - 5
    - Auto
  initial: 1  
  icon: mdi:fire

4 – Tinhas (inputnumber.yaml):

# Stove Temperature Selection
stove_temp_sel:
  name: Temperatura Selecionada
  icon: mdi:home-thermometer-outline
  min: 5
  max: 40
  step: 1
  initial: 22
  mode: box
  unit_of_measurement: graus

4 – Substitui por (inputnumber.yaml) também inventei:

# Stove Temperature Selection
stove_temp_sel:
  name: Temperatura Selecionada
  icon: mdi:home-thermometer-outline
  min: 5
  max: 40
  step: 1
  initial: 22
  mode: box
  unit_of_measurement: graus

5 – Tinhas (scripts.yaml):

myceza_set_stove_definitions:
 alias: myceza_set_stove_definitions
 sequence:
 - service: rest_command.myceza_stove_set_temperature
   data: {}
 - service: rest_command.myceza_stove_set_mode
   data: {}
 - service: rest_command.myceza_stove_set_fan_speed
   data: {}
 - delay:
     seconds: 10
 - service: homeassistant.update_entity
   entity_id: sensor.mycezajson  
 mode: single

5 – Substitui por (scripts.yaml) também inventei:

#Recuperador Sala
myceza_set_stove_definitions:
 alias: myceza_set_stove_definitions
 sequence:
 - service: rest_command.myceza_stove_set_fire_temp
   data: {}
 - service: rest_command.myceza_stove_set_mode
   data: {}
 - service: rest_command.myceza_stove_set_fan_speed
   data: {}
 - delay:
     seconds: 10
 - service: homeassistant.update_entity
   entity_id: sensor.mycezajson  
 mode: single

6 – Tinhas (automations.yaml):


- id: stove_load_myceza_settings
  alias: stove_load_myceza_settings
  trigger:
  - entity_id: input_boolean.stove_control_settings
    platform: state
  condition:
  action:
  - data_template:
      entity_id: input_number.stove_temp_sel
      value: '{{ states.sensor.stove_ambient_temperature.state }}'
    service: input_number.set_value
  - data_template:
      entity_id: input_select.stove_mode_sel
      option: '{{ states.sensor.stove_mode_desc.state }}'
    service: input_select.select_option
  - data_template:
      entity_id: input_select.stove_fan_speed_sel
      option: '{{ states.sensor.stove_fan_one_desc.state }}'
    service: input_select.select_option

6 – Substitui por (automations.yaml) também inventei:

# Recuperador stove_mode_sel
- id: stove_load_myceza_settings
  alias: stove_load_myceza_settings
  trigger:
  - entity_id: input_boolean.stove_control_settings
    platform: state
  condition:
  action:
  - data_template:
      entity_id: input_select.stove_fire_temp_sel
      value: '{{ states.sensor.stove_fire_temperature.state }}'
    service: input_select.select_option
  - data_template:
      entity_id: input_select.stove_mode_sel
      option: '{{ states.sensor.stove_mode_desc.state }}'
    service: input_select.select_option
  - data_template:
      entity_id: input_select.stove_fan_speed_sel
      option: '{{ states.sensor.stove_fan_one_desc.state }}'
    service: input_select.select_option  

Não tinha reparado que era para o Fernando
:rofl:

A minha é uma caldeira de aquecimento central, mas a base deve ser igual para quase todas.
Penso que é isto que queres


Não estás muito longe! Tens umas invenções que estão bem e outras nem por isso! Podes por um print screen com as opções que te aparecem no myceza.it para o fire_temperature? Coloco aqui o exemplo da velocidade da ventoinha para que seja mais fácil perceber o que é preciso:

E com isso acho que consigo adivinhar o payload. Caso contrário explico o que é preciso pois é necessário usar as ferramentas de inspeção do chrome (ou do Firefox).

Pois é que são todas diferentes! Exemplo, a tua tem a opção de selecionar o heating_temperature (que vai de 60 a 80) e que me parece que esteja relacionado com a temperatura da água pois também tem o water_temperature e será necessário criar um sensor para este último, e também um “input” para o anterior que depois necessitará de um rest command para que possas controlar isto também como fazes na app. Podes por favor por um print screen semelhante ao que coloquei do myceza.it com as opções possíveis do heating_temperature? Acho que as restantes são semelhantes.

Os valores são metidos à mão

O que tenho é isto:

Não sei bem onde procurar…

No sensor.mycezajson, relativamente ao FIRE tenho:
fire_temperature:
code: E600
value: ‘1’
label: FIRE
imageRelativePath: images/status/red.png
min: ‘1’
max: ‘5’
security: ‘1000’

João mas olha que para mim penso que não seja necessário acrescentar mais nada, a caldeira tem um termostato exterior que está logado ao termosifao e é isso que faz ligar e desligar a caldeira.
Eu nunca mexi no valor da água nem dá temperatura.
Eu agora já consigo ligar e desligar com o valor da água do termosifao, que era o que pretendia.
Mais uma vez o parabéns pelo post e ainda bem que alguém conseguiu dar a volta ao site.:grin::open_hands:

Ainda tenho que ver porque é que não funciona o refresh automático. Neste momento e ponto crítico.

E depois precisava de mais uma coisa de ti, era o consumo das pellets :grin::grin::grin:

Rafael, para o refresh, fiz um flow em Node Red, não sei se usas (recomendo) e funciona bem.

Sim uso e neste momento estou a fazer umas configurações para a caldeira :smiley:
se poderes partilhar…

Acho que ja temos o que é preciso! sobre o que já fizeste eis o que acho que deve ser alterado e não tenho maneira testar mas deve estar miuto perto:

1 - sensors.yaml - Acho que está bem e podes acrescentar este sensor ao Lovelace Card em vez do ambient_temperature

stove_fire_temperature:
          unique_id: 'stove_fire_temperature'
          icon_template: mdi:fire
          friendly_name: "Recuperador Calor Chama"
          value_template: >
            {% if is_state('sensor.mycezajson', XXXXX) %}
              {{ (state_attr('sensor.mycezajson','stoves'))[XXXXXXXXXXXXXX']['statuses']['fire_temperature'].value }}
            {% else %}
              {{'None'}}
            {% endif %}

2 – configuration.yaml - Aqui o payload não está certo… substituiste bem o “code” para bater certo com o recebido do endpoint json. Mas que de acordo com o snaphot que partilhaste aparentemente não tens a opção “Auto” para o fire_temperature (eu não queria ver as opções da ventoinha pois essas ja sei :grinning:). Experimenta o seguinte:

myceza_stove_set_fire_temperature:
    url: https://myceza.it/api/stove/command/en/xxxxxxxxxxxxxxx
    method: POST
    headers:
      Host: myceza.it
      Connection: keep-alive
      X-XSRF-TOKEN: >
        {{ states('sensor.mycezaxsrftoken') | replace("%3D","=") }}
      Authorization: >
        Bearer {{ states('sensor.mycezadatatoken_actual_ks') }}
      Content-Type: application/json;charset=UTF-8
      Accept: application/json, */*
      Origin: https://myceza.it
      Sec-Fetch-Site: same-origin
      Sec-Fetch-Mode: cors
      Sec-Fetch-Dest: empty
      Referer: https://myceza.it/en/stove/xxxxxxxxxxxxxxx
      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: >
            {"value":"{{states.input_select.stove_fire_temperature_sel.state }}","code":"E600"}

3 – inputselect.yaml - Aqui acrescentas apenas o seguinte (Nota: tambem dá para fazer com um input number pois as opções de 1 a 5 são todas numericas) mas assim fica fixe:

stove_fire_temperature_sel:
  name: Recuperador Velocidade Chama
  options:
    - 1
    - 2
    - 3
    - 4
    - 5
  initial: 1  
  icon: mdi:fire

4 – inputnumber.yaml - Aqui apagas esta parte pois não precisas

# Stove Temperature Selection
stove_temp_sel:
  name: Temperatura Selecionada
  icon: mdi:home-thermometer-outline
  min: 5
  max: 40
  step: 1
  initial: 22
  mode: box
  unit_of_measurement: graus

5 – scripts.yaml - Aqui só te enganaste no serviço a chamar que tinhas defenido no configuration.yaml acima que é myceza_stove_set_fire_temperature e não myceza_stove_set_fire_temp. Basta alterar assim:

#Recuperador Sala
myceza_set_stove_definitions:
 alias: myceza_set_stove_definitions
 sequence:
 - service: rest_command.myceza_stove_set_fire_temperature
   data: {}
 - service: rest_command.myceza_stove_set_mode
   data: {}
 - service: rest_command.myceza_stove_set_fan_speed
   data: {}
 - delay:
     seconds: 10
 - service: homeassistant.update_entity
   entity_id: sensor.mycezajson  
 mode: single

6 – automations.yaml - Aqui tinha mais um pequeno erro o teu input selct novo é stove_fire_temperature_sel e não stove_fire_temp_sel

# Recuperador stove_mode_sel
- id: stove_load_myceza_settings
  alias: stove_load_myceza_settings
  trigger:
  - entity_id: input_boolean.stove_control_settings
    platform: state
  condition:
  action:
  - data_template:
      entity_id: input_select.stove_fire_temperature_sel
      value: '{{ states.sensor.stove_fire_temperature.state }}'
    service: input_select.select_option
  - data_template:
      entity_id: input_select.stove_mode_sel
      option: '{{ states.sensor.stove_mode_desc.state }}'
    service: input_select.select_option
  - data_template:
      entity_id: input_select.stove_fan_speed_sel
      option: '{{ states.sensor.stove_fan_one_desc.state }}'
    service: input_select.select_option  

7 - Finalmente no lovelace card alteras para:

type: custom:stack-in-card
mode: vertical
cards:
  - type: entities
    entities:
      - entity: switch.stove_power
      - entity: sensor.stove_status_desc
        secondary_info: last-changed
      - entity: sensor.stove_room_temperature
      - entity: sensor.stove_fumes_temperature
      - entity: sensor.stove_fire_temperature
      - entity: sensor.recuperador_calor_on_time
      - entity: sensor.stove_fan_one_desc
      - entity: sensor.stove_mode_desc
  - type: entities
    entities:
      - entity: input_boolean.stove_control_settings
  - type: conditional
    conditions:
      - entity: input_boolean.stove_control_settings
        state: 'on'
    card:
      type: vertical-stack
      cards:
        - type: entities
          entities:
            - entity: input_select.stove_fire_temperature_sel
            - entity: input_select.stove_mode_sel
            - entity: input_select.stove_fan_speed_sel
            - type: custom:button-card
              layout: icon_name
              name: Programar Recuperador de Calor
              show_name: true
              icon: mdi:backup-restore
              label: Programar Recuperador de Calor
              show_label: false
              show_state: false
              styles:
                card:
                  - border-radius: 10px
                  - height: 60px
                  - background-color: '#268bd2'
                name:
                  - color: white
                  - font-weight: bold
                icon:
                  - color: white
              tap_action:
                action: call-service
                service: script.myceza_set_stove_definitions
                service_data: {}
                target: {}

E está tudo!

Criei um input bolean para executar manualmente e um event para quando o HA inicia:

[{"id":"f2d0e2714221f288","type":"api-call-service","z":"ec736664.32741","name":"Trigger Solzaima","server":"9d094a0b.dff7f8","version":5,"debugenabled":false,"domain":"multiscrape","service":"trigger_solzaima_ha_integration","areaId":[],"deviceId":[],"entityId":[],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":610,"y":200,"wires":[["86f54df8811c5a1f"]]},{"id":"e7e06dcb5239fad9","type":"server-state-changed","z":"ec736664.32741","name":"","server":"9d094a0b.dff7f8","version":4,"exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"entityidfilter":"input_boolean.refresh_solzaima_integration","entityidfiltertype":"exact","outputinitially":false,"state_type":"str","haltifstate":"on","halt_if_type":"str","halt_if_compare":"is","outputs":2,"output_only_on_state_change":true,"for":"0","forType":"num","forUnits":"minutes","ignorePrevStateNull":false,"ignorePrevStateUnknown":false,"ignorePrevStateUnavailable":false,"ignoreCurrentStateUnknown":false,"ignoreCurrentStateUnavailable":false,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"entityState"},{"property":"data","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"","valueType":"triggerId"}],"x":240,"y":220,"wires":[["f2d0e2714221f288"],[]]},{"id":"86f54df8811c5a1f","type":"api-call-service","z":"ec736664.32741","name":"","server":"9d094a0b.dff7f8","version":5,"debugenabled":false,"domain":"input_boolean","service":"turn_off","areaId":[],"deviceId":[],"entityId":["input_boolean.refresh_solzaima_integration"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":900,"y":260,"wires":[[]]},{"id":"b66320a5.f8586","type":"server-events","z":"ec736664.32741","name":"","server":"9d094a0b.dff7f8","version":1,"event_type":"home_assistant_client","exposeToHomeAssistant":false,"haConfig":[{"property":"name","value":""},{"property":"icon","value":""}],"waitForRunning":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"},{"property":"event_type","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"}],"x":140,"y":320,"wires":[["b46e7e0a.fef1f"]]},{"id":"b46e7e0a.fef1f","type":"switch","z":"ec736664.32741","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"running","vt":"str"}],"checkall":"true","repair":false,"outputs":1,"x":370,"y":320,"wires":[["f2d0e2714221f288"]]},{"id":"9d094a0b.dff7f8","type":"server","name":"Home Assistant","version":1,"addon":true,"rejectUnauthorizedCerts":true,"ha_boolean":"y|yes|true|on|home|open","connectionDelay":true,"cacheJson":true}]

Rafael, É como quiseres, se pretenderes ter esses comandos especialmente o da temperatura no HA a aproximação é a mesma. O sensor mycezajson já traz tudo e podes ter apenas para visualização sem criar os inputs e os rest commands caso não pretendas o control.
O que referes do refresh é quando inicias o HA. A solução do Fernando em node-red é uma boa alternativa embora eu nunca tenha usado. Em breve vou fazer uma automação para verficar o estado depois do arranque do HA e forçar o refresh caso não tenha funcionado.

Sobre o consumo de pellets tenho que abrir um topico novo pois senão vai ficar aqui uma confusão ainda maior.
Farei isso para a semana depois da pascoa.

Muito Obrigado Fernando
:ok_hand: :clap:

Fernando, tinha um erro no ponto 2 pois faltavam umas aspas no payload mas já corriji. Eu presumo que seja assim mas caso não funcione eu digo-te como fazes o recording no chrome para captarmos o payload.


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


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