Ligação Solzaima

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.

malta eu sou um lammer nisto, mas pretendia integrar no HA o meu recuperador de calor da marca l´artistico, que tenho acesso pelo app e pela pagina da https://cloudwinet.it/.
ao entrar na pagina, e apos fazer o login aparece isto:


E depois de clicar na mao verde isto:

Sei a api key e ha este manual que dá para ver o status atraves de links com a api key.


Com esta info que aparece ai consigo meter isso no HA?

João, muito obrigado pela ajuda mas infelizmente ainda não funciona, não consigo controlar nem a chama nem a ventoinha. Podes me ensinar como fazer o recording no chrome para captar o payload por favor?

Olha que eu tinha um erro no presumivel payload pois faltava umas aspas e agora descobri outro…
por favor modifica para isto,

{"value":"{{states.input_number.stove_fire_temperature_sel.state | int }}","code":"E600"}

e experimenta os serviços individualmente.
(entretanto já modifiquei o post anterior):

Ola Tiago. Não parece nada dificil.
Tu dizes que sabes qual a api key logo a primeira coisa que tens de testar é o que está no ponto 3)

Para começares abres o chrome e na barra de endereços escreves a URL que está no manual juntando a tua api key e confirma que obtens uma resposta em formato json semelhante ao que está aqui:

image

Se sim então isso é um GET htpp que é facil de implementar usando os conectores nativos do HA. Para depois criares os comandos vais precisar de fazer uns POST com a mesma logica.

Sim, recebo a informação certa do estado do recuperador.

E como faço isso que dizes no HA?
Há algum tutorial?

Tiago, é hora da leitura: Para teres os sensores, como por exemplo o que acabaste de testar (ou então o da temperatura descrito no ponto 9) vais precisar varios rest sensors em função da URL a utilizar:

O rest full sensor vai retornar extamente o que ves no chrome e prescisaras de um sensor template para extrair o estado (nesta caso será “0” ou"1" caso uses “Status” ou “On” e “Off” caso uses o “StatusDescription”

Para os comandos usas o rest_command descrito aqui:

A logica é a mesma so que no URL alem da api key precisas de passar o parametro. Exemplo no ponto 8) onde será na URL …/a_tua_api_key:23 se quiseres 23 graus.

os rest commands ficam como um serviço que podes invocar diretamente num card ou então num script.

1 Curtiu

Como não tenho node red como o @Fernmac partilho aqui a automação que após o restart do HA verifica passado 60 segundos se os tokens foram extraidos e senão vai insistir de 15 em 15 segundos até conseguir:

- id: myceza_session_ha_restart_delay
  alias: Myceza Session HA Restart Delay
  initial_state: true
  trigger:
    - platform: homeassistant
      event: start
  action:
    - delay:
        seconds: 60
    - repeat:
        while:
          - condition: template
            value_template: >
              {{ states.sensor.mycezajson.state != 'Recuperador Sala' }}
        sequence:      
          - service: rest_command.myceza_session_logout
            data: {}
          - service: multiscrape.trigger_solzaima_ha_integration
            data: {}
          - delay:
              seconds: 15
  mode: single

Caso queiram usar só tem que alterar o nome ‘Recuperador Sala’ para o nome do vosso aparelho que definiram na myceza app e eventualmente adaptarem os delays conforme pretendido.


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


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