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 eforce a atualização com um botão).
Quando dizes que te “queixaste” foi à Solzaima? Eles responderam?
NOVA VERSAO
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.
-
Instalar o custom component https://github.com/danieldotnl/ha-multiscrape/releases qualquer versão atual
-
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”
- Ainda no configuration.yaml acrescentar: para que o HA consiga aceder aos ficheiros criados:
homeassistant:
allowlist_external_dirs:
- /config
- 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
- Esta parte usa usa a integracão “file” que entretanto foi migrada para a interface gráfica. Adicionar uma nova integração
E criar os seguintes 2 sensores: Add Entry
file_path: /config/multiscrape/solzaima_ha_integration/page_response_headers.txt
value_template: ‘{{ (value.split("=")[2]).split(";")[0] }}’
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
- 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.
Parte 3: Sensores Home Assistant
Bom dia, existe algo do tipo para módulo Wi-Fi 4heat?