OpenHASP - utiliser un esp avec écran tactile pour contrôler Home assistant

Bonjour a tous,

Je vous présente le Projet OpenHASP qui permet d’utiliser des ESP avec écran tactile et controler Home Assistant par MQTT.

Pourquoi je vous parle de OpenHASP, alors qu’il existe ESPHome ?
Pour la simple raison qu’il existe des écrans tactile 5 et 7 pouces, mais qui ne sont pas pris en charge par ESPHome. Il manque les pilotes des écrans RGB de c’est taille.

J’ai acheter un ESP avec écran tactile de 7 pouces et me suis retrouver a pas pouvoir m’en servir appart utiliser arduino ou plateformIO ( qui on le pilote pour l’écran) . Mais coder en t’en que débutant a été très dur. Et a force de chercher sur google, j’ai trouver un post sur mon modèle d’esp avec écran et le fameux OpenHASP.
Il y fallu que je compile un firmware pour fonctionner avec mon modèle car pas pris en charge encore dans OpenHASP. Je vous mets un lien d’un tuto que j’ai fais sur le forum Anglais 5inch display ILI6122 & ILI5960 need help to add it to ESPHome - #11 by WarC0zes - ESPHome - Home Assistant Community

Requis:
un ESP et un écran tactile.
vous trouverez la liste de compatibilité ici

Installation:
Vous pouvez flasher l’esp directement d’une page web et connecter au PC.
Pour les derniers appareils pris en charge utiliser la version nightly https://nightly.openhasp.com/
Pour la version normal ( moins d’appareils pris en charge) c’est ce site https://install.openhasp.com/

Faut sélectionner son modèle et faire install. ( suivant les ESP, faudra le passer en mode download ).

Configuration:
Quand le flash est fini, débrancher l’sub de l’esp et rebrancher le.
OpenHASP démarre et vous deveza configurer le WiFi.
renseignez SSiD et mot de passe de votre box.
Ca va ce connecter au WiFi.

Ensuite, il faut installer l’intégration OpenHASH par HACS. Choisir la version 0.7.2 pour OpenHASH v0.7.0 ou la version 0.6.6 si vous avez installer le firmware 0.6.3.


Redémarrez Home Assistant.

Maintenant, on va configurer la partie MQTT. Ce connecter par votre navigateur au plate ( nom donnée par OpenHASP pour un esp, plateau en français :rofl: ) par l’adresse ip.
Regarder sur votre box pour savoir l’ip atribué a votre plate. ( t’en cas être dans votre box, fixer l’ip avec le bail dhcp de votre plate ).
Vous arrivez sur le menu d’openHASP.

aller dans configuration et MQTT

Dans Hostname choisir le nom de son plate , exemple Plate01.
Dans Broker mettre l’ip de son broker ( ip de HA si vous utiliser l’addon mosquitto broker)
Mettre son user et mot de passe ( vous pouvez créer un utilisateur plate01 dans Home assistant )
Pour les Topics laisser telle quelle.
Sauvegarder le setting.

Redémarrer votre plate par le menu principal.
Le composant découvrira automatiquement votre plate et vous les verrez apparaître dans Configuration > Appareils et services > openHASP .

Lorsque Home Assistant détectera votre plate, vous devrez lui donner un nom.
Des options vous seront présentées pour définir le niveau de luminosité du rétroéclairage lorsque votre plate est inactive et, en option, vous pouvez définir un chemin vers un pages.jsonl fichier central contenant la conception de cette plate.

vous recevrez un avertissement indiquant que vous devez ajouter une configuration manuelle pour les objets de votre configuration.yaml. L’ignorer et continuer la configuration.

Créer un dossier openhasp dans /config/ et créer un fichier pages.jsonl dedans.

Dans votre configuration.yaml ajouter ces lignes:

homeassistant:
  allowlist_external_dirs:
  - /config

openhasp: !include openhasp.yaml

openhasp config

Créer un fichier openhasp.yaml dans /config/.
C’est pratiquement fini, il vous reste a faire un menu.

un exemple de menu:
image

code a mettre dans le pages.jsonl:

{"page":0,"id":4,"obj":"label","x":175,"y":5,"h":30,"w":45,"text":"00.0","align":2,"bg_color":"#2C3E50"}
{"page":0,"id":5,"obj":"label","x":220,"y":5,"h":30,"w":45,"text":"°C","align":0,"bg_color":"#2C3E50"}
{"page":0,"id":6,"obj":"label","x":3,"y":5,"h":30,"w":62,"text":"00:00","align":0,"bg_color":"#2C3E50"}

page correspond au numéro de la page.
id correspond au nuémro d’un objet.
objet correspond au type utiliser.

code a mettre dans openhasp.yaml ( adapter les entités ) :

plate01:
  objects:
    - obj: "p0b4"
      properties:
        "text": "{{ states('sensor.my_room_temperature') }}"
    - obj: "p0b6"
      properties:
        "text": "{{ states('sensor.time') }}"

obj: "p0b4" correspond a la page 0 et objet id 4.

Vous avez plus cas recharger l’intégration OpenHASP, pour voir les changements.

Vous avez plein d’exemple dans la doc Example Configurations - openHASP
Pour tous ce qui est design regarder la doc File Editor - openHASP
Vous avez un site en ligne pour créer des pages facilement: https://haspdesigner.qrisonline.nl/

Voila le rendu final de mes appareils.

Sur le bar avec un socle de WiiU :rofl:

les trois pages que j’ai faite:
image
image
image

Ajout d’un timer pour le chauffage, avec le temps restant avant l’arrêt et ajout du pourcentage d’allumage du chauffage. ( j’utilise le thermostat de @Jean-Marc_Collin GitHub - jmcollin78/versatile_thermostat: A full featured Thermostat for Home Assistant: presets, window, motion, presence and overpowering management)

Code du pages.jsonl
{"comment":" ----------- Page 0 - Navigation Buttons ------------"}
{"page":0,"id":2,"obj":"label","x":683,"y":1,"h":30,"w":100,"text":"00.0°C","text_font":26,"align":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":0,"id":1,"obj":"label","x":3,"y":1,"h":30,"w":214,"text":"00:00","text_font":26,"align":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":0,"id":3,"obj":"btn","x":763,"y":0,"w":30,"h":30,"text":"\uE5A9","text_font":"2","bg_opa":0,"border_width":0}
{"page":0,"id":4,"obj":"btn","action":{"down": "page prev"},"x":0,"y":447,"w":266,"h":32,"bg_color":"#2C3E50","text":"\uE141","text_color":"#FFFFFF","radius":0,"border_side":0,"text_font":28}
{"page":0,"id":5,"obj":"btn","action":{"down": "page back"},"x":267,"y":447,"w":266,"h":32,"bg_color":"#2C3E50","text":"\uE2DC","text_color":"#FFFFFF","radius":0,"border_side":0,"text_font":28}
{"page":0,"id":6,"obj":"btn","action":{"down": "page next"},"x":534,"y":447,"w":266,"h":32,"bg_color":"#2C3E50","text":"\uE142","text_color":"#FFFFFF","radius":0,"border_side":0,"text_font":28}
{"page":0,"id":7,"obj":"label","x":650,"y":0,"w":30,"h":40,"text":"\uE2DC","text_font":28,"bg_opa":0,"border_width":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":0,"id":8,"obj":"label","x":541,"y":0,"w":30,"h":40,"text":"\uE6A1","text_font":28,"bg_opa":0,"border_width":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":0,"id":9,"obj":"label","x":574,"y":1,"h":30,"w":100,"text":"00.0°C","text_font":26,"align":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}

{"comment":"---------- Limit page prev/next between 1 and 3 ----------"}
{"page":1,"id":0,"prev":3}
{"page":3,"id":0,"next":1}

{"page":1,"comment":" ---- Home ----"}
{"page":1,"id":1,"obj":"btn","x":0,"y":0,"w":800,"h":32,"text":"Maison","text_font":28,"bg_color":"#2C3E50","text_color":"#FFFFFF","radius":0,"border_side":0}
{"page":1,"id":3,"obj":"btn","x":585,"y":35,"w":2,"h":407,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":1,"id":4,"obj":"btn","x":10,"y":50,"w":105,"h":90,"toggle":true,"text":"\uE335","text_font":32,"mode":"break","align":1,"radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":5,"obj":"label","x":30,"y":143,"h":40,"w":120,"text":"Entrée","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":6,"obj":"btn","x":125,"y":50,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":7,"obj":"label","x":140,"y":143,"h":40,"w":120,"text":"Cuisine","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":8,"obj":"btn","x":240,"y":50,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":9,"obj":"label","x":249,"y":143,"h":40,"w":120,"text":"Spot Cui","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":10,"obj":"btn","x":355,"y":50,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":11,"obj":"label","x":356,"y":143,"h":40,"w":120,"text":"Hotte Asp","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":12,"obj":"btn","x":470,"y":50,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":13,"obj":"label","x":476,"y":143,"h":40,"w":120,"text":"Salle à M","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":14,"obj":"switch","x":705,"y":93,"w":60,"h":30,"radius":15,"bg_color1":"#2C3E50"}
{"page":1,"id":15,"obj":"label","x":647,"y":93,"h":40,"w":60,"text":"Chat","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":16,"obj":"switch","x":705,"y":138,"w":60,"h":30,"radius":15,"bg_color1":"#2C3E50"}
{"page":1,"id":17,"obj":"label","x":630,"y":138,"h":40,"w":70,"text":"Matrix","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":20,"obj":"btn","x":10,"y":185,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":21,"obj":"label","x":21,"y":278,"h":40,"w":120,"text":"Spot Séj","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":22,"obj":"btn","x":125,"y":185,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":23,"obj":"label","x":144,"y":278,"h":40,"w":120,"text":"Séjour","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":18,"obj":"btn","x":240,"y":185,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":19,"obj":"label","x":263,"y":278,"h":40,"w":120,"text":"Salon","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":24,"obj":"btn","x":355,"y":185,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":25,"obj":"label","x":357,"y":278,"h":40,"w":120,"text":"Led Salon","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":26,"obj":"btn","x":470,"y":185,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":27,"obj":"label","x":473,"y":278,"h":40,"w":120,"text":"Led Table","text_font":26,"text_color":"#2C3E50"}
{"page":1,"id":28,"obj":"label","x":675,"y":403,"w":30,"h":30,"text":"\uF40B","text_font":28,"bg_opa":0,"border_width":0,"text_color":"#2C3E50"}
{"page":1,"id":29,"obj":"label","x":705,"y":407,"w":75,"h":22,"text":"00.0€","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":1,"id":30,"obj":"label","x":675,"y":371,"w":30,"h":30,"text":"\uF40B","text_font":28,"bg_opa":0,"border_width":0,"text_color":"#2C3E50"}
{"page":1,"id":31,"obj":"label","x":705,"y":375,"w":90,"h":22,"text":"00.00kWh","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":1,"id":32,"obj":"label","x":675,"y":339,"w":30,"h":30,"text":"\uF40B","text_font":28,"bg_opa":0,"border_width":0,"text_color":"#2C3E50"}
{"page":1,"id":33,"obj":"label","x":705,"y":343,"w":75,"h":22,"text":"0000W","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":1,"id":34,"obj":"btn","x":598,"y":353,"w":75,"h":75,"text":"00","text_font":34,"mode":"break","align":1,"radius":15,"text_color":"#000000","border_color":"#2C3E50"}
{"page":1,"id":35,"obj":"btn","x":591,"y":330,"w":200,"h":2,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":1,"id":36,"obj":"btn","x":10,"y":320,"w":105,"h":90,"toggle":true,"text":"\uE335","align":1,"text_font":32,"mode":"break","radius":15,"bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":1,"id":37,"obj":"label","x":12,"y":413,"h":40,"w":120,"text":"Lampe PC","text_font":26,"text_color":"#2C3E50"}

{"page":2,"comment":" ---- Thermostat ----"}
{"page":2,"id":1,"obj":"btn","x":0,"y":0,"w":800,"h":32,"text":"Thermostat","text_font":28,"bg_color":"#2C3E50","text_color":"#FFFFFF","radius":0,"border_side":0}
{"page":2,"id":2,"obj":"btn","x":7,"y":159,"w":190,"h":2,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":2,"id":3,"obj":"btn","x":212.5,"y":159,"w":265,"h":2,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":2,"id":4,"obj":"btn","x":7,"y":279,"w":190,"h":2,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":2,"id":5,"obj":"btn","x":212.5,"y":279,"w":265,"h":2,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":2,"id":6,"obj":"btn","x":480,"y":35,"w":2,"h":405,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":2,"id":8,"obj":"btn","x":486,"y":248,"w":305,"h":2,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":2,"id":9,"obj":"btn","x":7,"y":399,"w":190,"h":2,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":2,"id":10,"obj":"btn","x":212.5,"y":399,"w":265,"h":2,"text":"","value_font":22,"text_color":"#000000","radius":0,"border_side":15,"border_color":"#2C3E50"}
{"page":2,"id":101,"obj":"label","x":223.5,"y":45,"w":70,"h":25,"text":"Séjour","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":102,"obj":"label","x":575,"y":45,"w":140,"h":25,"text":"Aujourd'hui","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":103,"obj":"label","x":695,"y":45,"w":100,"h":25,"text":"Demain","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":104,"obj":"label","x":223.5,"y":165,"w":70,"h":25,"text":"Salon","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":105,"obj":"label","x":520,"y":250,"w":50,"h":25,"text":"heure","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":106,"obj":"label","x":620,"y":250,"w":50,"h":25,"text":"heure","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":122,"obj":"label","x":720,"y":250,"w":50,"h":25,"text":"heure","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":107,"obj":"label","x":12,"y":45,"w":180,"h":25,"text":"Termostat Séjour","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":108,"obj":"label","x":12,"y":165,"w":180,"h":25,"text":"Termostat Salon","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":109,"obj":"label","x":12,"y":130,"w":180,"h":25,"text":"Offline","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":110,"obj":"label","x":12,"y":250,"w":180,"h":25,"text":"Offline","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":111,"obj":"btn","x":5,"y":75,"w":50,"h":50,"text":"\uE374","text_font":48,"mode":"break","align":1,"radius":15,"text_color":"#0000ff","border_color":"#2C3E50","bg_color":"#2C3E50"}
{"page":2,"id":112,"obj":"btn","x":67,"y":75,"w":70,"h":50,"text":"00.0","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#000000","border_color":"#2C3E50"}
{"page":2,"id":113,"obj":"btn","x":150,"y":75,"w":50,"h":50,"text":"\uE415","text_font":48,"mode":"break","align":1,"radius":15,"text_color":"#ff0000","border_color":"#2C3E50","bg_color":"#2C3E50"}
{"page":2,"id":114,"obj":"btn","x":5,"y":195,"w":50,"h":50,"text":"\uE374","text_font":48,"mode":"break","align":1,"radius":15,"text_color":"#0000ff","border_color":"#2C3E50","bg_color":"#2C3E50"}
{"page":2,"id":115,"obj":"btn","x":67,"y":195,"w":70,"h":50,"text":"00.0","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#000000","border_color":"#2C3E50"}
{"page":2,"id":116,"obj":"btn","x":150,"y":195,"w":50,"h":50,"text":"\uE415","text_font":48,"mode":"break","align":1,"radius":15,"text_color":"#ff0000","border_color":"#2C3E50","bg_color":"#2C3E50"}
{"page":2,"id":145,"obj":"btn","x":305,"y":45,"w":50,"h":110,"toggle":true,"text":"\uEAD7","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50","bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":2,"id":143,"obj":"btn","x":365,"y":45,"w":50,"h":50,"toggle":false,"text":"\uE60C","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":117,"obj":"btn","x":425,"y":45,"w":50,"h":50,"toggle":false,"text":"\uE594","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":144,"obj":"btn","x":365,"y":105,"w":50,"h":50,"toggle":false,"text":"\uE51B","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":118,"obj":"btn","x":425,"y":105,"w":50,"h":50,"toggle":false,"text":"\uE599","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":146,"obj":"btn","x":305,"y":165,"w":50,"h":110,"toggle":true,"text":"\uEAD7","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50","bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":2,"id":147,"obj":"btn","x":365,"y":165,"w":50,"h":50,"toggle":false,"text":"\uE60C","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":148,"obj":"btn","x":365,"y":225,"w":50,"h":50,"toggle":false,"text":"\uE51B","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":119,"obj":"btn","x":425,"y":165,"w":50,"h":50,"toggle":false,"text":"\uE594","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":120,"obj":"btn","x":425,"y":225,"w":50,"h":50,"toggle":false,"text":"\uE599","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":121,"obj":"label","x":223.5,"y":91,"w":70,"h":22,"text":"Offline","text_font":22,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":124,"obj":"label","x":223.5,"y":210,"w":70,"h":22,"text":"Offline","text_font":22,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":127,"obj":"label","x":223.5,"y":133,"w":70,"h":22,"text":"Offline","text_font":22,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":130,"obj":"label","x":223.5,"y":253,"w":70,"h":24,"text":"Offline","text_font":22,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":133,"obj":"label","x":245.5,"y":64,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":1,"text_color":"#ff0000"}
{"page":2,"id":136,"obj":"label","x":245.5,"y":183,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":1,"text_color":"#ff0000"}
{"page":2,"id":139,"obj":"label","x":245.5,"y":109,"w":24,"h":24,"text":"\uE58E","text_font":24,"align":1,"text_color":"#0000ff"}
{"page":2,"id":142,"obj":"label","x":245.5,"y":228,"w":24,"h":24,"text":"\uE58E","text_font":24,"align":1,"text_color":"#0000ff"}
{"page":2,"id":149,"obj":"btn","x":615,"y":75,"w":58,"h":60,"toggle":false,"text":"\uE5A8","text_font":50,"border_side":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":2,"id":150,"obj":"btn","x":715,"y":75,"w":58,"h":60,"toggle":false,"text":"\uE5A8","text_font":50,"border_side":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":2,"id":151,"obj":"label","x":625,"y":145,"w":70,"h":22,"text":"00.0°C","text_font":22,"align":0,"text_color":"#ff0000"}
{"page":2,"id":152,"obj":"label","x":625,"y":169,"w":70,"h":22,"text":"00.0°C","text_font":22,"align":0,"text_color":"#0000ff"}
{"page":2,"id":153,"obj":"label","x":596,"y":142,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":0,"text_color":"#ff0000"}
{"page":2,"id":154,"obj":"label","x":596,"y":166,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":0,"text_color":"#0000ff"}
{"page":2,"id":155,"obj":"label","x":625,"y":194,"w":70,"h":22,"text":"00%","text_font":22,"align":0,"text_color":"#0000ff"}
{"page":2,"id":156,"obj":"label","x":596,"y":191,"w":24,"h":26,"text":"\uE58E","text_font":24,"align":0,"text_color":"#0000ff"}
{"page":2,"id":157,"obj":"label","x":625,"y":218,"w":75,"h":22,"text":"00.0mm","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":158,"obj":"label","x":596,"y":215,"w":24,"h":26,"text":"\uE58C","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":159,"obj":"label","x":725,"y":145,"w":70,"h":22,"text":"00.0°C","text_font":22,"align":0,"text_color":"#ff0000"}
{"page":2,"id":160,"obj":"label","x":725,"y":169,"w":70,"h":22,"text":"00.0°C","text_font":22,"align":0,"text_color":"#0000ff"}
{"page":2,"id":161,"obj":"label","x":696,"y":142,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":0,"text_color":"#ff0000"}
{"page":2,"id":162,"obj":"label","x":696,"y":166,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":0,"text_color":"#0000ff"}
{"page":2,"id":163,"obj":"label","x":725,"y":194,"w":70,"h":22,"text":"00%","text_font":22,"align":0,"text_color":"#0000ff"}
{"page":2,"id":164,"obj":"label","x":696,"y":191,"w":24,"h":26,"text":"\uE58E","text_font":24,"align":0,"text_color":"#0000ff"}
{"page":2,"id":165,"obj":"label","x":725,"y":218,"w":75,"h":22,"text":"00.0mm","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":166,"obj":"label","x":696,"y":215,"w":24,"h":26,"text":"\uE58C","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":167,"obj":"label","x":525,"y":346,"w":70,"h":22,"text":"00.0°C","text_font":22,"align":0,"text_color":"#ff0000"}
{"page":2,"id":168,"obj":"label","x":525,"y":370,"w":70,"h":22,"text":"00%","text_font":22,"align":0,"text_color":"#0000ff"}
{"page":2,"id":169,"obj":"label","x":496,"y":343,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":0,"text_color":"#ff0000"}
{"page":2,"id":170,"obj":"label","x":496,"y":367,"w":24,"h":26,"text":"\uE58E","text_font":24,"align":0,"text_color":"#0000ff"}
{"page":2,"id":171,"obj":"label","x":525,"y":394,"w":70,"h":22,"text":"00km","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":172,"obj":"label","x":496,"y":393,"w":24,"h":26,"text":"\uE59D","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":173,"obj":"label","x":525,"y":418,"w":75,"h":22,"text":"00.0mm","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":174,"obj":"label","x":496,"y":415,"w":24,"h":26,"text":"\uE58C","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":175,"obj":"btn","x":515,"y":280,"w":58,"h":60,"toggle":false,"text":"\uE5A8","text_font":50,"border_side":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":2,"id":176,"obj":"label","x":625,"y":346,"w":70,"h":22,"text":"00.0°C","text_font":22,"align":0,"text_color":"#ff0000"}
{"page":2,"id":177,"obj":"label","x":625,"y":370,"w":70,"h":22,"text":"00%","text_font":22,"align":0,"text_color":"#0000ff"}
{"page":2,"id":178,"obj":"label","x":596,"y":343,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":0,"text_color":"#ff0000"}
{"page":2,"id":179,"obj":"label","x":596,"y":367,"w":24,"h":26,"text":"\uE58E","text_font":24,"align":0,"text_color":"#0000ff"}
{"page":2,"id":180,"obj":"label","x":625,"y":394,"w":70,"h":22,"text":"00km","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":181,"obj":"label","x":596,"y":393,"w":24,"h":26,"text":"\uE59D","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":182,"obj":"label","x":625,"y":418,"w":75,"h":22,"text":"00.0mm","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":183,"obj":"label","x":596,"y":415,"w":24,"h":26,"text":"\uE58C","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":184,"obj":"btn","x":615,"y":280,"w":58,"h":60,"toggle":false,"text":"\uE5A8","text_font":50,"border_side":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":2,"id":185,"obj":"label","x":725,"y":346,"w":70,"h":22,"text":"00.0°C","text_font":22,"align":0,"text_color":"#ff0000"}
{"page":2,"id":186,"obj":"label","x":725,"y":370,"w":70,"h":22,"text":"00%","text_font":22,"align":0,"text_color":"#0000ff"}
{"page":2,"id":187,"obj":"label","x":696,"y":343,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":0,"text_color":"#ff0000"}
{"page":2,"id":188,"obj":"label","x":696,"y":367,"w":24,"h":26,"text":"\uE58E","text_font":24,"align":0,"text_color":"#0000ff"}
{"page":2,"id":189,"obj":"label","x":725,"y":394,"w":70,"h":22,"text":"00km","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":190,"obj":"label","x":696,"y":393,"w":24,"h":26,"text":"\uE59D","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":191,"obj":"label","x":725,"y":418,"w":75,"h":22,"text":"00.0mm","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":192,"obj":"label","x":696,"y":415,"w":24,"h":26,"text":"\uE58C","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":193,"obj":"btn","x":715,"y":280,"w":58,"h":60,"toggle":false,"text":"\uE5A8","text_font":50,"border_side":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":2,"id":194,"obj":"label","x":12,"y":285,"w":190,"h":25,"text":"Ventilateur Salon","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":195,"obj":"btn","x":5,"y":315,"w":50,"h":50,"text":"\uE374","text_font":48,"mode":"break","align":1,"radius":15,"text_color":"#0000ff","border_color":"#2C3E50","bg_color":"#2C3E50"}
{"page":2,"id":196,"obj":"btn","x":67,"y":315,"w":70,"h":50,"text":"00","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#000000","border_color":"#2C3E50"}
{"page":2,"id":197,"obj":"btn","x":150,"y":315,"w":50,"h":50,"text":"\uE415","text_font":48,"mode":"break","align":1,"radius":15,"text_color":"#ff0000","border_color":"#2C3E50","bg_color":"#2C3E50"}
{"page":2,"id":198,"obj":"btn","x":305,"y":285,"w":50,"h":110,"toggle":true,"text":"\uE210","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50","bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":2,"id":199,"obj":"btn","x":365,"y":285,"w":50,"h":50,"toggle":true,"text":"\uE456","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50","bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":2,"id":200,"obj":"btn","x":425,"y":285,"w":50,"h":50,"toggle":true,"text":"\uE32A","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50","bg_color1":"#2C3E50","text_color1":"#fffb00"}
{"page":2,"id":201,"obj":"btn","x":365,"y":345,"w":50,"h":50,"toggle":false,"text":"\uE04D","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":202,"obj":"btn","x":425,"y":345,"w":50,"h":50,"toggle":false,"text":"\uE054","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":203,"obj":"label","x":12,"y":370,"w":180,"h":25,"text":"Offline","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":204,"obj":"btn","x":232,"y":345,"w":50,"h":50,"toggle":false,"text":"\uE51B","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50"}
{"page":2,"id":205,"obj":"btn","x":232,"y":285,"w":50,"h":50,"text":"00","text_font":32,"mode":"break","align":1,"radius":15,"text_color":"#000000","border_color":"#2C3E50"}
{"page":2,"id":206,"obj":"btn","x":7,"y":410,"w":188,"h":25,"text":"Alertes","text_font":22,"mode":"break","align":1,"radius":15,"text_color":"#2C3E50","border_color":"#2C3E50","bg_color":"#2C3E50"}
{"page":2,"id":207,"obj":"label","x":213,"y":410,"w":258,"h":25,"text":"Aucune","text_font":22,"mode":"crop","align":1,"text_color":"#2C3E50"}
{"page":2,"id":208,"obj":"label","x":128,"y":130,"w":100,"h":25,"text":"pourcent","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":209,"obj":"label","x":128,"y":250,"w":100,"h":25,"text":"pourcent","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":210,"obj":"label","x":2,"y":130,"w":62,"h":25,"text":"timer","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":211,"obj":"label","x":2,"y":250,"w":62,"h":25,"text":"timer","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":212,"obj":"label","x":475,"y":45,"w":140,"h":25,"text":"Maintenant","text_font":16,"align":1,"text_color":"#2C3E50"}
{"page":2,"id":213,"obj":"btn","x":515,"y":75,"w":58,"h":60,"toggle":false,"text":"\uE5A8","text_font":50,"border_side":0,"bg_color":"#2C3E50","text_color":"#FFFFFF"}
{"page":2,"id":214,"obj":"label","x":525,"y":145,"w":70,"h":22,"text":"00.0°C","text_font":22,"align":0,"text_color":"#ff0000"}
{"page":2,"id":215,"obj":"label","x":525,"y":169,"w":70,"h":22,"text":"00%","text_font":22,"align":0,"text_color":"#0000ff"}
{"page":2,"id":216,"obj":"label","x":496,"y":142,"w":24,"h":26,"text":"\uE50F","text_font":24,"align":0,"text_color":"#ff0000"}
{"page":2,"id":217,"obj":"label","x":496,"y":166,"w":24,"h":26,"text":"\uE58E","text_font":24,"align":0,"text_color":"#0000ff"}
{"page":2,"id":218,"obj":"label","x":525,"y":194,"w":70,"h":22,"text":"00km","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":219,"obj":"label","x":496,"y":191,"w":24,"h":26,"text":"\uE59D","text_font":24,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":220,"obj":"label","x":525,"y":218,"w":75,"h":22,"text":"spd","text_font":22,"align":0,"text_color":"#2C3E50"}
{"page":2,"id":221,"obj":"label","x":496,"y":215,"w":24,"h":26,"text":"\uF39D","text_font":24,"align":0,"text_color":"#2C3E50"}

{"page":3,"comment":" ---- Infos ----"}
{"page":3,"id":1,"obj":"btn","x":0,"y":0,"w":800,"h":32,"text":"Infos","text_font":28,"bg_color":"#2C3E50","text_color":"#FFFFFF","radius":0,"border_side":0}
{"page":3,"id":2,"obj":"label","x":3,"y":40,"h":40,"w":60,"text":"IP:","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":3,"obj":"label","x":34,"y":40,"h":40,"w":180,"text":"adressip","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":4,"obj":"label","x":3,"y":80,"h":40,"w":60,"text":"SSID:","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":5,"obj":"label","x":60,"y":80,"h":40,"w":180,"text":"ssidbox","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":6,"obj":"label","x":3,"y":120,"h":40,"w":90,"text":"UPTIME:","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":7,"obj":"label","x":95,"y":120,"h":40,"w":250,"text":"uptimebox","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":8,"obj":"label","x":3,"y":160,"h":40,"w":100,"text":"VERSION:","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":9,"obj":"label","x":108,"y":160,"h":40,"w":250,"text":"version","text_font":26,"text_color":"#2C3E50"}

Code du openhasp.yaml
  plate01:
    objects:
      - obj: "p0b1"
        properties:
          "text": "{{ as_timestamp(now()) | timestamp_custom('%H:%M %d/%m/%y') }}"
      - obj: "p0b2"
        properties:
          "text": "{{ states('sensor.temperature_humidity_sensor_sejour_temperature') |float(0) |round(1)}}°C"
      - obj: "p0b3"
        properties:
          "text_color": >
             {% if -40 <= state_attr('openhasp.plate01','rssi') |int(0) %}
             green
             {% elif -41 > state_attr('openhasp.plate01','rssi') |int(0) >= -60 %}
             yellow
             {% elif -61 > state_attr('openhasp.plate01','rssi') |int(0) >= -70 %}
             orange
             {% else %}
             red
             {% endif %}
      - obj: "p0b9"
        properties:
          "text": "{{ states('sensor.temperature_humidity_sensor_exterieur_av_temperature') |float(0) |round(1)}}°C"
      - obj: "p1b4"  # light-switch toggle button entrée
        properties:
          "val": '{{ 1 if states("light.lumieres_entree") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.lumieres_entree", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.lumieres_entree"
      - obj: "p1b6"  # light-switch toggle button cuisine
        properties:
          "val": '{{ 1 if states("light.0x00158d0002e75493") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.0x00158d0002e75493", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.0x00158d0002e75493"
      - obj: "p1b8"  # light-switch toggle button spot cuisine
        properties:
          "val": '{{ 1 if states("light.spots_cuisine") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.spots_cuisine", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.spots_cuisine"
      - obj: "p1b10"  # light-switch toggle button hotte
        properties:
          "val": '{{ 1 if states("light.lumieres_hotte_aspirante") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.lumieres_hotte_aspirante", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.lumieres_hotte_aspirante"
      - obj: "p1b12"  # light-switch toggle button Salle a M.
        properties:
          "val": '{{ 1 if states("light.0x00158d0007b079f0") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.0x00158d0007b079f0", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.0x00158d0007b079f0"
      - obj: "p1b14"  # switch toggle button Chat auto
        properties:
          "val": '{{ 1 if states("automation.chat_porte_arriere") == "on" else 0 }}'
          "click": "{{ 'false' if (is_state('automation.chat_porte_arriere','unavailable') or is_state('automation.chat_porte_arriere','unknown')) else 'true' }}"
          "opacity": "{{ 120 if (is_state('automation.chat_porte_arriere','unavailable') or is_state('automation.chat_porte_arriere','unknown')) else 255 }}"
        event:
          "up":
            - service: automation.toggle
              entity_id: "automation.chat_porte_arriere"
      - obj: "p1b16"  # switch toggle button Led matrrix
        properties:
          "val": '{{ 1 if states("light.wled") == "on" else 0 }}'
          "click": "{{ 'false' if (is_state('light.wled','unavailable') or is_state('light.wled','unknown')) else 'true' }}"
          "opacity": "{{ 120 if (is_state('light.wled','unavailable') or is_state('light.wled','unknown')) else 255 }}"
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.wled"
      - obj: "p1b20"  # light-switch toggle button Spot S
        properties:
          "val": '{{ 1 if states("light.0x540f57fffe0b7675") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.0x540f57fffe0b7675", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.0x540f57fffe0b7675"
      - obj: "p1b22"  # light-switch toggle button Séjour
        properties:
          "val": '{{ 1 if states("light.0x00158d0007b04489") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.0x00158d0007b04489", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.0x00158d0007b04489"
      - obj: "p1b18"  # light-switch toggle button Salon
        properties:
          "val": '{{ 1 if states("light.0x00158d0007b0454d") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.0x00158d0007b0454d", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.0x00158d0007b0454d"
      - obj: "p1b24"  # light-switch toggle button Led Salon
        properties:
          "val": '{{ 1 if states("light.wled_2") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.wled_2", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.wled_2"
      - obj: "p1b26"  # light-switch toggle button Led Table
        properties:
          "val": '{{ 1 if states("light.led_salon_tuya_local") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("light.led_salon_tuya_local", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "light.led_salon_tuya_local"
      - obj: "p1b29"
        properties:
          "text": "{{ states('sensor.energy_home_cout_daily') |float(0) |round(2)}}€"
      - obj: "p1b31"
        properties:
          "text": "{{ states('sensor.energy_home_total_daily') |float(0) /1000 |round(2)}}kWh"
      - obj: "p1b33"
        properties:
          "text": "{{ states('sensor.zlinky_current_summation_derived_one_minute') |int(0)}}W"
      - obj: "p1b34"
        properties:
          "text": >
             {% if states('select.energie_quotidienne_home') == "hp" -%}
             {{ "HP" }}
             {% else -%}
             {{ "HC" }}
             {% endif -%}
          "text_color": "{{ '#ff0000' if is_state('select.energie_quotidienne_home', 'hp') else '#009900' }}"
      - obj: "p1b36"  # light-switch toggle button Lampe pc
        properties:
          "val": '{{ 1 if states("switch.switch_pc_tuya_local") == "on" else 0 }}'
          "text": '{{ "\uE6E8" if is_state("switch.switch_pc_tuya_local", "on") else "\uE335" | e }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: "switch.switch_pc_tuya_local"
      - obj: "p2b109"
        properties:
          "text": >
             {% if state_attr('climate.versatile_thermostat_sejour', 'hvac_action') == "idle" %}
             {{ "inactif" }}
             {% elif state_attr('climate.versatile_thermostat_sejour', 'hvac_action') == "heating" %}
             {{ "chauffe" }}
             {% else %}
             {{ "éteint" }}
             {% endif %}
      - obj: "p2b110"
        properties:
          "text": >
             {% if state_attr('climate.versatile_thermostat_salon', 'hvac_action') == "idle" %}
             {{ "inactif" }}
             {% elif state_attr('climate.versatile_thermostat_salon', 'hvac_action') == "heating" %}
             {{ "chauffe" }}
             {% else %}
             {{ "éteint" }}
             {% endif %}
      - obj: "p2b111"
        event:
          "up":
            - service: script.thermostat_sejour_down_temp
              data:
                climate_id: climate.versatile_thermostat_sejour
                value: 0.1
      - obj: "p2b112"
        properties:
          "text": "{{ state_attr('climate.versatile_thermostat_sejour','temperature') |float(0) }}"
          "text_color": "{{ '#ff0000' if is_state('climate.versatile_thermostat_sejour', 'off') else '#008000' }}"
      - obj: "p2b113"
        event:
          "up":
            - service: script.thermostat_sejour_up_temp
              data:
                climate_id: climate.versatile_thermostat_sejour
                value: 0.1
      - obj: "p2b114"
        event:
          "up":
            - service: script.thermostat_salon_down_temp
              data:
                climate_id: climate.versatile_thermostat_salon
                value: 0.1
      - obj: "p2b115"
        properties:
          "text": "{{ state_attr('climate.versatile_thermostat_salon','temperature') |float(0) }}"
          "text_color": "{{ '#ff0000' if is_state('climate.versatile_thermostat_salon', 'off') else '#008000' }}"
      - obj: "p2b116"
        event:
          "up":
            - service: script.thermostat_salon_up_temp
              data:
                climate_id: climate.versatile_thermostat_salon
                value: 0.1
      - obj: "p2b121"
        properties:
          "text": "{{ states('sensor.0xa4c138e08a32a900_temperature') |float(0) |round(1)}}°C"
      - obj: "p2b124"
        properties:
          "text": "{{ states('sensor.temperature_humidity_sensor_sejour_temperature') |float(0) |round(1)}}°C"
      - obj: "p2b127"
        properties:
          "text": "{{ states('sensor.0xa4c138e08a32a900_humidity') |float(0) |round(0)}}%"
      - obj: "p2b130"
        properties:
          "text": "{{ states('sensor.temperature_humidity_sensor_sejour_humidity') |float(0) |round(0)}}%"
      - obj: "p2b145"  # switch climate
        properties:
          "val": '{{ 1 if states("climate.versatile_thermostat_sejour") == "heat" else 0 }}'
          "text": '{{ "\uE438" if is_state("climate.versatile_thermostat_sejour", "heat") else "\uEAD7" | e }}'
        event:
          "up":
            - service: script.climate_sejour_toggle
      - obj: "p2b143"
        event:
          "up":
            - service: climate.set_preset_mode
              data:
                preset_mode: none
              target:
                entity_id: climate.versatile_thermostat_sejour
      - obj: "p2b144"
        event:
          "up":
            - service: timer.start
              target:
                entity_id: timer.climate_sejour
      - obj: "p2b117"
        event:
          "up":
            - service: climate.set_preset_mode
              data:
                preset_mode: eco
              target:
                entity_id: climate.versatile_thermostat_sejour
      - obj: "p2b118"
        event:
          "up":
            - service: climate.set_preset_mode
              data:
                preset_mode: comfort
              target:
                entity_id: climate.versatile_thermostat_sejour
      - obj: "p2b146"  # switch climate
        properties:
          "val": '{{ 1 if states("climate.versatile_thermostat_salon") == "heat" else 0 }}'
          "text": '{{ "\uE438" if is_state("climate.versatile_thermostat_salon", "heat") else "\uEAD7" | e }}'
        event:
          "up":
            - service: script.climate_salon_toggle
      - obj: "p2b147"
        event:
          "up":
            - service: climate.set_preset_mode
              data:
                preset_mode: none
              target:
                entity_id: climate.versatile_thermostat_salon
      - obj: "p2b148"
        event:
          "up":
            - service: timer.start
              target:
                entity_id: timer.climate_salon
      - obj: "p2b119"
        event:
          "up":
            - service: climate.set_preset_mode
              data:
                preset_mode: eco
              target:
                entity_id: climate.versatile_thermostat_salon
      - obj: "p2b120"
        event:
          "up":
            - service: climate.set_preset_mode
              data:
                preset_mode: comfort
              target:
                entity_id: climate.versatile_thermostat_salon
      - obj: "p2b149" # Current weather icon j0
        properties:
          "text": >
             {% if states('sensor.meteo_xxxx_j0') == "clear-night" -%}
             {{ "\uE594" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'cloudy' -%}
             {{ "\uE590" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'fog' -%}
             {{ "\uE591" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'hail' -%}
             {{ "\uE592" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'lightning' -%}
             {{ "\uE593" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'lightning-rainy' -%}
             {{ "\uE67E" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'partlycloudy' -%}
             {{ "\uE595" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'pouring' -%}
             {{ "\uE596" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'rainy' -%}
             {{ "\uE597" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'snowy' -%}
             {{ "\uE598" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'snowy-rainy' -%}
             {{ "\uE67F" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'sunny' -%}
             {{ "\uE5A8" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'windy' -%}
             {{ "\uE59D" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'windy-variant' -%}
             {{ "\uE59E" }}
             {% elif states('sensor.meteo_xxxx_j0') == 'unavailable' -%}
             {{ "\uE156" }}
             {% else -%}
             {{ "\uE5A8" }}
             {% endif -%}
      - obj: "p2b150" # Current weather icon j1
        properties:
          "text": >
             {% if states('sensor.meteo_xxxx_j1') == "clear-night" -%}
             {{ "\uE594" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'cloudy' -%}
             {{ "\uE590" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'fog' -%}
             {{ "\uE591" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'hail' -%}
             {{ "\uE592" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'lightning' -%}
             {{ "\uE593" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'lightning-rainy' -%}
             {{ "\uE67E" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'partlycloudy' -%}
             {{ "\uE595" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'pouring' -%}
             {{ "\uE596" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'rainy' -%}
             {{ "\uE597" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'snowy' -%}
             {{ "\uE598" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'snowy-rainy' -%}
             {{ "\uE67F" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'sunny' -%}
             {{ "\uE5A8" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'windy' -%}
             {{ "\uE59D" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'windy-variant' -%}
             {{ "\uE59E" }}
             {% elif states('sensor.meteo_xxxx_j1') == 'unavailable' -%}
             {{ "\uE156" }}
             {% else -%}
             {{ "\uE5A8" }}
             {% endif -%}
      - obj: "p2b151"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_j0','temperature') }}°C"
      - obj: "p2b152"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_j0','templow') }}°C"
      - obj: "p2b155"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_j0','humidite') }}%"
      - obj: "p2b157"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_j0','precipitation') |float(0) |round(0)}}mm"
      - obj: "p2b159"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_j1','temperature') }}°C"
      - obj: "p2b160"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_j1','templow') }}°C"
      - obj: "p2b163"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_j1','humidite') }}%"
      - obj: "p2b165"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_j1','precipitation') |float(0) |round(0) }}mm"
      - obj: "p2b105"
        properties:
          "text": "{{ state_attr('sensor.meteo_sxxxx_h0','heure') }}H"
      - obj: "p2b106"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h1','heure') }}H"
      - obj: "p2b122"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h2','heure') }}H"
      - obj: "p2b175" # Current weather icon h0
        properties:
          "text": >
             {% if states('sensor.meteo_xxxx_h0') == "clear-night" -%}
             {{ "\uE594" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'cloudy' -%}
             {{ "\uE590" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'fog' -%}
             {{ "\uE591" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'hail' -%}
             {{ "\uE592" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'lightning' -%}
             {{ "\uE593" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'lightning-rainy' -%}
             {{ "\uE67E" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'partlycloudy' -%}
             {{ "\uE595" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'pouring' -%}
             {{ "\uE596" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'rainy' -%}
             {{ "\uE597" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'snowy' -%}
             {{ "\uE598" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'snowy-rainy' -%}
             {{ "\uE67F" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'sunny' -%}
             {{ "\uE5A8" }}
             {% elif states('sensor.meteo_sxxxx_h0') == 'windy' -%}
             {{ "\uE59D" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'windy-variant' -%}
             {{ "\uE59E" }}
             {% elif states('sensor.meteo_xxxx_h0') == 'unavailable' -%}
             {{ "\uE156" }}
             {% else -%}
             {{ "\uE5A8" }}
             {% endif -%}
      - obj: "p2b167"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h0','temperature') }}°C"
      - obj: "p2b168"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h0','humidite') }}%"
      - obj: "p2b171"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h0','wind') }}km"
      - obj: "p2b173"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h0','precipitation') }}mm"
      - obj: "p2b184" # Current weather icon h1
        properties:
          "text": >
             {% if states('sensor.meteo_xxxx_h1') == "clear-night" -%}
             {{ "\uE594" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'cloudy' -%}
             {{ "\uE590" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'fog' -%}
             {{ "\uE591" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'hail' -%}
             {{ "\uE592" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'lightning' -%}
             {{ "\uE593" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'lightning-rainy' -%}
             {{ "\uE67E" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'partlycloudy' -%}
             {{ "\uE595" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'pouring' -%}
             {{ "\uE596" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'rainy' -%}
             {{ "\uE597" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'snowy' -%}
             {{ "\uE598" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'snowy-rainy' -%}
             {{ "\uE67F" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'sunny' -%}
             {{ "\uE5A8" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'windy' -%}
             {{ "\uE59D" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'windy-variant' -%}
             {{ "\uE59E" }}
             {% elif states('sensor.meteo_xxxx_h1') == 'unavailable' -%}
             {{ "\uE156" }}
             {% else -%}
             {{ "\uE5A8" }}
             {% endif -%}
      - obj: "p2b176"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h1','temperature') }}°C"
      - obj: "p2b177"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h1','humidite') }}%"
      - obj: "p2b180"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h1','wind') }}km"
      - obj: "p2b182"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h1','precipitation') }}mm"
      - obj: "p2b193" # Current weather icon h2
        properties:
          "text": >
             {% if states('sensor.meteo_xxxx_h2') == "clear-night" -%}
             {{ "\uE594" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'cloudy' -%}
             {{ "\uE590" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'fog' -%}
             {{ "\uE591" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'hail' -%}
             {{ "\uE592" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'lightning' -%}
             {{ "\uE593" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'lightning-rainy' -%}
             {{ "\uE67E" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'partlycloudy' -%}
             {{ "\uE595" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'pouring' -%}
             {{ "\uE596" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'rainy' -%}
             {{ "\uE597" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'snowy' -%}
             {{ "\uE598" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'snowy-rainy' -%}
             {{ "\uE67F" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'sunny' -%}
             {{ "\uE5A8" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'windy' -%}
             {{ "\uE59D" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'windy-variant' -%}
             {{ "\uE59E" }}
             {% elif states('sensor.meteo_xxxx_h2') == 'unavailable' -%}
             {{ "\uE156" }}
             {% else -%}
             {{ "\uE5A8" }}
             {% endif -%}
      - obj: "p2b185"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h2','temperature') }}°C"
      - obj: "p2b186"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h2','humidite') }}%"
      - obj: "p2b189"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h2','wind') }}km"
      - obj: "p2b191"
        properties:
          "text": "{{ state_attr('sensor.meteo_xxxx_h2','precipitation') }}mm"
      - obj: "p2b195"
        event:
          "up":
            - service: fan.decrease_speed
              data:
                percentage_step: 5
              target:
                entity_id: fan.mi_smart_standing_fan_2
      - obj: "p2b196"
        properties:
          "text": "{{ state_attr('fan.mi_smart_standing_fan_2','percentage') |int(0)}}"
          "text_color": "{{ '#ff0000' if is_state('fan.mi_smart_standing_fan_2', 'off') else '#008000' }}"
      - obj: "p2b197"
        event:
          "up":
            - service: fan.increase_speed
              data:
                percentage_step: 5
              target:
                entity_id: fan.mi_smart_standing_fan_2
      - obj: "p2b198"  # switch ventilateur
        properties:
          "val": '{{ 1 if states("fan.mi_smart_standing_fan_2") == "on" else 0 }}'
        event:
          "up":
            - service: homeassistant.toggle
              entity_id: fan.mi_smart_standing_fan_2
      - obj: "p2b199"  # ventilateur oscille
        properties:
          "val": '{{ 1 if state_attr("fan.mi_smart_standing_fan_2","oscillating") == "true" else 0 }}'
        event:
          "up":
            - service: script.ventilateur_oscille_toggle
      - obj: "p2b200"  # ventilateur nature
        properties:
          "val": '{{ 1 if state_attr("fan.mi_smart_standing_fan_2","mode") == "nature" else 0 }}'
        event:
          "up":
            - service: script.ventilateur_nature_toggle
      - obj: "p2b201"  # ventilateur gauche
        event:
          "up":
            - service: fan.set_direction
              data:
                direction: reverse
              target:
                entity_id: fan.mi_smart_standing_fan_2
      - obj: "p2b202"  # ventilateur droite
        event:
          "up":
            - service: fan.set_direction
              data:
                direction: forward
              target:
                entity_id: fan.mi_smart_standing_fan_2
      - obj: "p2b203"
        properties:
          "text": "{{ states('fan.mi_smart_standing_fan_2') }}"
      - obj: "p2b204"  # ventilateur timer
        event:
          "up":
            - service: xiaomi_miio_fan.fan_set_delay_off
              data:
                entity_id: fan.mi_smart_standing_fan_2
                delay_off_countdown: 60
      - obj: "p2b205"
        properties:
          "text": "{{ state_attr('fan.mi_smart_standing_fan_2','delay_off_countdown') |int(0)}}"
          "text_color": "{{ '#ff0000' if is_state('fan.mi_smart_standing_fan_2', 'off') else '#008000' }}"
      - obj: "p2b206"
        properties:
          "text": "Alerte météo {{states('sensor.11_weather_alert')}}"
          "text_color": >
             {% if states('sensor.11_weather_alert') == "Jaune" -%}
             {{ "yellow" }}
             {% elif states('sensor.11_weather_alert') == 'Orange' -%}
             {{ "orange" }}
             {% elif states('sensor.11_weather_alert') == 'Rouge' -%}
             {{ "red" }}
             {% else -%}
             {{ "green" }}
             {% endif -%}
      - obj: "p2b207"
        properties:
          "text": >
             {% if states.sensor['11_weather_alert'] is not none %}
             {% if states('sensor.11_weather_alert') != 'Vert' %}
             {%- for attr, value in states.sensor['11_weather_alert'].attributes.items() -%}
             {%- if value in ['Jaune', 'Orange', 'Rouge'] -%}
             {{ "\uE026" }} {{ attr }}
             {%- endif %}
             {%- endfor %}
             {% else %}
             {{ "\uE12C" }} Aucunes alertes
             {% endif %}
             {% endif %}
      - obj: "p2b208"
        properties:
          "text": "{{ state_attr('climate.versatile_thermostat_sejour','power_percent') |int(0) }}%"
      - obj: "p2b209"
        properties:
          "text": "{{ state_attr('climate.versatile_thermostat_salon','power_percent') |int(0) }}%"
      - obj: "p2b210"
        properties:
          "text": "{{ states('sensor.timer_climate_sejour_minutes') |int(0) |round(0) }}min"
      - obj: "p2b211"
        properties:
          "text": "{{ states('sensor.timer_climate_salon_minutes') |int(0) |round(0) }}min"
      - obj: "p2b213" # Current weather icon Now
        properties:
          "text": >
             {% if states('weather.xxxxx') == "clear-night" -%}
             {{ "\uE594" }}
             {% elif states('weather.xxxxx') == 'cloudy' -%}
             {{ "\uE590" }}
             {% elif states('weather.xxxxx') == 'fog' -%}
             {{ "\uE591" }}
             {% elif states('weather.xxxxx') == 'hail' -%}
             {{ "\uE592" }}
             {% elif states('weather.xxxxx') == 'lightning' -%}
             {{ "\uE593" }}
             {% elif states('weather.xxxxx') == 'lightning-rainy' -%}
             {{ "\uE67E" }}
             {% elif states('weather.xxxxx') == 'partlycloudy' -%}
             {{ "\uE595" }}
             {% elif states('weather.xxxxxx') == 'pouring' -%}
             {{ "\uE596" }}
             {% elif states('weather.xxxxxx') == 'rainy' -%}
             {{ "\uE597" }}
             {% elif states('weather.xxxxx') == 'snowy' -%}
             {{ "\uE598" }}
             {% elif states('weather.xxxxx') == 'snowy-rainy' -%}
             {{ "\uE67F" }}
             {% elif states('weather.xxxxx') == 'sunny' -%}
             {{ "\uE5A8" }}
             {% elif states('weather.xxxx') == 'windy' -%}
             {{ "\uE59D" }}
             {% elif states('weather.xxxx') == 'windy-variant' -%}
             {{ "\uE59E" }}
             {% elif states('weather.xxxxx') == 'unavailable' -%}
             {{ "\uE156" }}
             {% else -%}
             {{ "\uE5A8" }}
             {% endif -%}
      - obj: "p2b214"
        properties:
          "text": "{{ state_attr('weather.xxxxxx','temperature') }}°C"
      - obj: "p2b215"
        properties:
          "text": "{{ state_attr('weather.xxxxx','humidity') }}%"
      - obj: "p2b218"
        properties:
          "text": "{{ state_attr('weather.xxxxx','wind_speed') |float(0) |round(0) }}km"
      - obj: "p2b220"
        properties:
          "text": "{{ states('sensor.direction_vent_xxxxx') }}"
      - obj: "p3b3"
        properties:
          "text": >
             {% if state_attr("openhasp.plate01","ip") == None %}
             {{ "Wait" }}
             {% else %}
             {{ state_attr("openhasp.plate01","ip") }}
             {% endif%}
      - obj: "p3b5"
        properties:
          "text": >
             {% if state_attr("openhasp.plate01","ssid") == None %}
             {{ "Wait" }}
             {% else %}
             {{ state_attr("openhasp.plate01","ssid") }}
             {% endif%}
      - obj: "p3b7"
        properties:
          "text": >
             {% set uptime = state_attr('openhasp.plate01','uptime') | int(0) %}
             {% set jours = (uptime / 86400) | int(0) %}
             {%- if jours > 0 -%}
               {{ jours }} jours, {{ (uptime - (jours * 86400)) | int(0) | timestamp_custom('%H:%M:%S', false) }}
             {%- else -%}
               {{ uptime | int(0) | timestamp_custom('%H:%M:%S', false) }}
             {%- endif -%}
      - obj: "p3b9"
        properties:
          "text": >
             {% if state_attr("openhasp.plate01","version") == None %}
             {{ "Wait" }}
             {% else %}
             {{ state_attr("openhasp.plate01","version") }}
             {% endif%}

Pour la météo (intégration météo france ), j’ai créer des sensors template pour J0 ( Aujourd’hui ) et J+1 ( Demain) , H0 ( heure en cours) H+1 H+2 et des trigger template pour récupérer les forecasts ( qui sont supprimer depuis le 04/2024 ) . Code a mettre dans votre configuration.yaml ou dans votre fichier template.yaml si vous avez découper votre configuration:

template:
  - sensor:
      - name: Météo xxxx H0
        unique_id: meteo_xxxx_h0
        state: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[0].condition | default(0) }}"
        attributes: 
          heure: "{{ as_timestamp(state_attr('sensor.weather_forecast_heure_xxxx','forecast')[0].datetime) | int(0) | timestamp_custom('%H') }}"
          temperature: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[0].temperature | float(0) }}"
          humidite: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[0].humidity | int(0) }}"
          wind: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[0].wind_speed | int(0) }}"
          precipitation: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[0].precipitation | int(0) }}"
        availability:  "{{ states('sensor.weather_forecast_heure_xxxx') not in ['unknown', 'unavailable', 'none'] }}"
      - name: Météo xxxx H1
        unique_id: meteo_xxxx_h1
        state: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[1].condition | default(0) }}"
        attributes: 
          heure: "{{ as_timestamp(state_attr('sensor.weather_forecast_heure_xxxx','forecast')[1].datetime) | int(0) | timestamp_custom('%H') }}"
          temperature: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[1].temperature | float(0) }}"
          humidite: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[1].humidity | int(0) }}"
          wind: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[1].wind_speed | int(0) }}"
          precipitation: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[1].precipitation | int(0) }}"
        availability:  "{{ states('sensor.weather_forecast_heure_xxxx') not in ['unknown', 'unavailable', 'none'] }}"
      - name: Météo xxxx H2
        unique_id: meteo_xxxx_h2
        state: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[2].condition | default(0) }}"
        attributes: 
          heure: "{{ as_timestamp(state_attr('sensor.weather_forecast_heure_xxxx','forecast')[2].datetime) | int(0) | timestamp_custom('%H') }}"
          temperature: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[2].temperature | float(0) }}"
          humidite: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[2].humidity | int(0) }}"
          wind: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[2].wind_speed | int(0) }}"
          precipitation: "{{ state_attr('sensor.weather_forecast_heure_xxxx','forecast')[2].precipitation | int(0) }}"
        availability:  "{{ states('sensor.weather_forecast_heure_xxxx') not in ['unknown', 'unavailable', 'none'] }}"
      - name: Météo xxxx J0
        unique_id: meteo_xxxx_j0
        state: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[0].condition | default(0) }}"
        attributes: 
          temperature: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[0].temperature | float(0) }}"
          templow: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[0].templow | float(0) }}"
          humidite: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[0].humidity | int(0) }}"
          precipitation: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[0].precipitation | float(0) }}"
        availability:  "{{ states('sensor.weather_forecast_jour_xxxx') not in ['unknown', 'unavailable', 'none'] }}"
      - name: Météo xxxx J1
        unique_id: meteo_xxxx_j1
        state: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[1].condition | default(0) }}"
        attributes: 
          temperature: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[1].temperature | float(0) }}"
          templow: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[1].templow | float(0) }}"
          humidite: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[1].humidity | int(0) }}"
          precipitation: "{{ state_attr('sensor.weather_forecast_jour_xxxx','forecast')[1].precipitation | float(0) }}"
        availability:  "{{ states('sensor.weather_forecast_jour_xxxx') not in ['unknown', 'unavailable', 'none'] }}"


  - trigger:
      - platform: time_pattern
        hours: /1
      - platform: homeassistant
        event: start
    action:
      - service: weather.get_forecasts
        data:
          type: daily
        target:
          entity_id: weather.xxxx
        response_variable: daily
    sensor:
      - name: Weather Forecast Jour xxxx
        unique_id: weather_forecast_jour_xxxx
        state: "{{ daily['weather.xxxx'].forecast[0].condition }}"
        attributes:
          forecast: "{{ daily['weather.xxxx'].forecast }}"
        availability:  "{{ states('weather.xxxx') not in ['unknown', 'unavailable', 'none'] }}"

  - trigger:
      - platform: time_pattern
        hours: /1
      - platform: homeassistant
        event: start
    action:
      - service: weather.get_forecasts
        data:
          type: hourly
        target:
          entity_id: weather.xxxx
        response_variable: hourly
    sensor:
      - name: Weather Forecast Heure xxxx
        unique_id: weather_forecast_heure_xxxx
        state: "{{ hourly['weather.xxxx'].forecast[0].condition }}"
        attributes:
          forecast: "{{ hourly['weather.xxxx'].forecast }}"
        availability:  "{{ states('weather.xxxx') not in ['unknown', 'unavailable', 'none'] }}"

Pour la direction du vent, j’utilise un template. Créer un template du UI et coller y le code dans la parti Modèle d'état:

{% set direction = ['N','NNE','NE','ENE','E','ESE','SE','SSE','S','SSO','SO','OSO','O','ONO','NO','NNO','N'] %}
{% set degree = state_attr('weather.xxxxx', 'wind_bearing')|int(0) %}
{% if degree > 1 %}
  {{ direction[((degree+11.25)/22.5)|int(0)] }}
{% else %}
  {{ "\uE156" }}
{% endif %}


Pour pallier au Sonoff NS panel ou autre, un peu cher a mon gout vous avez c’est solution pour une trentaine d’euros.

Le modèle Elecrow WZ8048C070 , est pris en charge dans OpenHASP ( depuis la v0.7.0-rc12 ) , sous le nom de Crowpanel 7". Fonctionne bien pour moi. ESP32 display-7.0 Inch HMI Display 800x480 RGB TFT LCD Touch Screen Compatible with Arduino/LVGL

Le modèle Sunton 8048S070C ( capacitive touch ), qui a des bugs de WiFi ( faut attendre un fix ). Ca fonctionne bien chez moi, mais j’ai un peu de latence pour les actions.
32.26€ |ESP32 S3 IHM 8M PSRAM 16M Flash Ardu37LVGL WIFI et Bluetooth 7.

Je mettrais a jour le post, avec un peu plus d’information. N’hésiter pas a demander des renseignements.
Bonne journée.

EDIT 12/04/24:
Ajout du modèle Elecrow 7inch WZ8048C070, dans la dernière version d’openHASP Nightly.

12 « J'aime »

Salut je galère un peu et dans mes recherches je viens de tomber sur ton post.
Je ne sais pas si tu pourra m’aider mais en gros je pense avoir réussi toute les étapes mais openhasp ne me détecte jamais mon écran dans les intégrations homeassistant
Il sagit d’un GST3E-16mb j’ai configuré openhasp dessus il se connecte bien au mqtt.
Lorsque je vais dans info sur l’écran il me met :
MQTT
Server homeassistant.local
Username auto
Client ID plate01_944758
Status Connected
Received 6
Published 10
Failed
lorsque sur homeassistant je vais voir le log de mosquitto broker je vois.
New client connected from 192.168.0.46:64933 as plate01_944758 (p2, c0, k15, u’auto’).
(plate01 est bien le nom de mon écran et 192.168.0.46 sont ip)
Alors je ne sais pas si le soucis ce trouve au niveau de l’intégration MQTT mais je t’avoue que la je sèche un peu.

L’humain est magique…
je galère depuis hier j’écris ici et je trouve le pain de moi même.
Alors ne me demande pas pourquoi mais la version la plus haute que je trouvais sur HACS était la 6.1
J’ai installer manuellement depuis une archive téléchargé sur github…
Ca m’à noté une version incompréhensible dans hacs qui m’à du coup proposé de faire la mise à jour vers 7.1
Et boum directement détecté…

1 « J'aime »

Bonjour,
oui, faut avoir la version 0.7.1 de l’addon si t’as un firmware 0.7.0rcx ou la version 0.6.6 si t’as un firmware 0.6.3.

Citation
You have to use component version consistently with the firmware version on your plates. For example, if your plates are at firmware version 0.7.x, you also need to use component version 0.7.y to ensure interoperability. Only the first two digits matter, i.e. 0.7, the last one can be different.
Home Assistant will show a warning if it finds a version mismatch. Note that you can only have one version of the component installed at a time so a mix of plate firmware versions is not supported.

Merci bcp pour ta réponse mais comme dis précédement j’avais trouvé.
mais je ne comprends tj pas pourquoi la dernière version n’était pas dispo sur HACS qui est pourtant à jour.
Maintenant je commence à me prendre la tête avec la config.
J’ai déja réussi à crée deux bouttons pour allumer ou éteindre des lampes.
Je commence à comprendre la logique mais je suis bien loin de ton interface :rofl: :rofl: :rofl:

Je partagerais ma config. C’est un coups a prendre, mais pas facile au début j’avoue :smile:

Ton lien pour l’éditeur est juste parfait.
La prise de tète c’est le fichier de config dans has :wink:
mais bon j’ai déja réussi à configuré des switch c’est top.
Dommage qu’ont ne sais pas simplement afficher une page web comme avec un T6E sous android.
Mais bon c’est moins de sport :rofl: :rofl: :rofl:

1 « J'aime »

Ajout du code de mes deux pages OpenHASP ( en dessous des captures des pages ).

C’est super merci je vais potasser ca au calme c’est avec ce genre de matière que j’apprends le mieux merci :wink:

Ajout Extra informations, IP - SSID - UPTiME ( page 3 ).

pages.jsonl

{"page":3,"comment":" ---- Infos ----"}
{"page":3,"id":1,"obj":"btn","x":0,"y":0,"w":800,"h":32,"text":"Infos","text_font":28,"bg_color":"#2C3E50","text_color":"#FFFFFF","radius":0,"border_side":0}
{"page":3,"id":2,"obj":"label","x":3,"y":40,"h":40,"w":60,"text":"IP:","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":3,"obj":"label","x":34,"y":40,"h":40,"w":180,"text":"adressip","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":4,"obj":"label","x":3,"y":80,"h":40,"w":60,"text":"SSID:","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":5,"obj":"label","x":60,"y":80,"h":40,"w":180,"text":"ssidbox","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":6,"obj":"label","x":3,"y":120,"h":40,"w":90,"text":"UPTIME:","text_font":26,"text_color":"#2C3E50"}
{"page":3,"id":7,"obj":"label","x":95,"y":120,"h":40,"w":250,"text":"uptimebox","text_font":26,"text_color":"#2C3E50"}

openhasp.yaml

    - obj: "p3b3"
      properties:
        "text": >
           {% if state_attr("openhasp.plate01","ip") == None %}
           {{ "Wait" }}
           {% else %}
           {{ state_attr("openhasp.plate01","ip") }}
           {% endif%}
    - obj: "p3b5"
      properties:
        "text": >
           {% if state_attr("openhasp.plate01","ssid") == None %}
           {{ "Wait" }}
           {% else %}
           {{ state_attr("openhasp.plate01","ssid") }}
           {% endif%}
    - obj: "p3b7"
      properties:
        "text": >
           {% set uptime = state_attr('openhasp.plate01','uptime') | int(0) %}
           {% set jours = (uptime / 86400) | int(0) %}
           {%- if jours > 0 -%}
             {{ jours }} jours, {{ (uptime - (jours * 86400)) | int(0) | timestamp_custom('%H:%M:%S', false) }}
           {%- else -%}
             {{ uptime | int(0) | timestamp_custom('%H:%M:%S', false) }}
           {%- endif -%}

Maj pour les alertes météo, qui affichera les alertes ou aucune s’il y en a pas avec une icone.
Merci @Herbs pour le code :wink:

exemple ( capture pourri , désoler )

le code a été modifier dans le tuto.

    - obj: "p2b207"
      properties:
        "text": >
           {% if states('sensor.11_weather_alert') != 'Vert' and states('sensor.11_weather_alert') != 'None' %}
           {% for attr, value in states.sensor['11_weather_alert'].attributes.items() %}
           {% if value in ['Jaune', 'Orange', 'Rouge'] %}
           {{ "\uE026" }} {{ attr }}
           {% endif %}
           {% endfor %}
           {% else %}
           {{ "\uE12C" }} Aucunes alertes
           {% endif %}
1 « J'aime »

Bonjour,
Nouveau sur le forum, de ce fait, je ne sais pas si je suis au bon endroit.

Je viens de prendre aussi un écran tactile (ESP32-4827S043) pour faire la même chose et je souhaiterais l’utiliser comme télécommande sans fil pour ma domotique.
Est-ce que des personnes ont fait la même chose car je n’arrive pas à trouver comme l’alimenter afin de pouvoir l’utiliser partout.
Je sais que l’ESP32 est en 3.3v mais l’écran est en 5v on dirait, du coup je ne sais pas quelle type de batterie prendre pour alimenter le tout.

Si une personne a l’information je suis intéressé svp.

Bonjour,
le model ESP32-4827S043 n’a pas d’écran tactile, c’est le ESP32-4827S043R ou ESP32-4827S043C avec écran tactile.

Effectivement erreur de ma part, c’est un ESP32-4827S043C

1 « J'aime »

Cependant si quelqu’un sait comment alimenter ce type de carte avec écran, hors secteur.

Merci à vous :wink:

Désoler je pourrais pas t’aider mon sunton et elecrow 7 pouces sont alimenter par usb.

Pas de soucis, merci quand même :wink:

Mettre sur batterie OK, mais par défaut OpenHASP ne supporte pas la batterie. Va falloir que tu compile un firmware avec le support.

1 « J'aime »

Salut @WarC0zes ,
Au top ! Merci de ta réponse :wink:
Je vais test ça.

Bonjour,
Merci pour ce super tuto, après avoir découvert OpenHASP, il ma permit d’intégrer mon CYD à HA.

Mais je n’arrive pas à gérer mon pages.jsonl via HA.
Si j’ai bien compris OpenHASP va chercher le pages.jsonl sur HA ou inversement.
J’ai bien configuré mon path pour le fichier pages.jsonl.
Mais après avoir restart l’intégration OpenHASP et mon device il ne charge le fichier pages.jsonl.

Alors que si je l’upload sur mon device il est bien fonctionnel.

J’ai la dernière version du plugin en 0.7.2 et mon device est en 0.7.0-rc10.

J’ai oublié quelque chose? Merci