Files
docker-configs/freshRSS/data/cache/0e64203310cd25935d600fea277cfaed617920c8.spc

1773 lines
180 KiB
Plaintext
Executable File

a:6:{s:5:"child";a:1:{s:0:"";a:1:{s:3:"rss";a:1:{i:0;a:6:{s:4:"data";s:4:"
";s:7:"attribs";a:1:{s:0:"";a:1:{s:7:"version";s:3:"2.0";}}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:1:{s:0:"";a:1:{s:7:"channel";a:1:{i:0;a:6:{s:4:"data";s:113:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:4:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:12:"My Canaletto";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:0:"";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:20:"http://canaletto.fr/";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"docs";a:1:{i:0;a:5:{s:4:"data";s:41:"http://www.rssboard.org/rss-specification";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:9:"generator";a:1:{i:0;a:5:{s:4:"data";s:22:"BlogEngine.NET 3.3.8.0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"language";a:1:{i:0;a:5:{s:4:"data";s:5:"en-US";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"item";a:10:{i:0;a:6:{s:4:"data";s:145:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:29:"Home Assistant &amp; Arrosage";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:10785:"<p style="text-align: justify;">J'ai fait quelque chose de simple en m'inspirant de ce que j'avais fait pour <a href="http://canaletto.fr/post/home-assistant-and-ecs" target="_blank" rel="noopener">mon chauffe eau</a>. Je publie ici le code suite &agrave; quelques demandes, m&ecirc;me si &ccedil;a n'a pas une grande valeur ajout&eacute;e. Pour l'instant &ccedil;a ne prends pas en compte les valeurs remont&eacute;s sur les capteurs de plantes car je n'en suis pas satisfait.</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/arrosage_1.png" width="400" /></p>
<p style="text-align: justify;">J'utilise une vanne Zigbee <a href="https://amzn.to/45QexEA" target="_blank" rel="noopener">Woox</a> qui alimente un goute &agrave; goute. Ca reste tr&egrave;s exp&eacute;rimental... Cot&eacute; int&eacute;gration j'utilise <a href="https://github.com/Olen/homeassistant-plant" target="_blank" rel="noopener">Home Assistant Plant</a> et la <a href="https://github.com/Olen/lovelace-flower-card" target="_blank" rel="noopener">carte</a> qui va avec. Mais les valeurs remont&eacute;es par les Plant Sensor ( <a href="https://amzn.to/3oOfyMR" target="_blank" rel="noopener">1</a> | 2 ) ne me semblent pas toujours tr&egrave;s r&eacute;alistes.</p>
<p style="text-align: justify;">Une automation de schedule simple et visuelle :</p>
<pre class="language-yaml"><code>input_datetime:
watering_start:
has_date: false
has_time: true
watering_stop:
has_date: false
has_time: true
input_boolean:
watering_day_monday:
name: "WATERING : Lundi"
icon: mdi:toggle-switch
watering_day_tuesday:
name: "WATERING : Mardi"
icon: mdi:toggle-switch
watering_day_wednesday:
name: "WATERING : Mercredi"
icon: mdi:toggle-switch
watering_day_thursday:
name: "WATERING : Jeudi"
icon: mdi:toggle-switch
watering_day_friday:
name: "WATERING : Vendredi"
icon: mdi:toggle-switch
watering_day_saturday:
name: "WATERING : Samedi"
icon: mdi:toggle-switch
watering_day_sunday:
name: "WATERING : Dimanche"
icon: mdi:toggle-switch
automation:
- id: 'xx8d0e1-fcb6-4412-abvxx-99c4d37be5xx'
alias: 'WATERING ON'
trigger:
- platform: template
value_template: '{{ states.sensor.time.state == states.input_datetime.watering_start.state[0:5] }}'
condition:
condition: or
conditions:
- '{{ (now().strftime("%a") == "Mon") and is_state("input_boolean.watering_day_monday", "on") }}'
- '{{ (now().strftime("%a") == "Tue") and is_state("input_boolean.watering_day_tuesday", "on") }}'
- '{{ (now().strftime("%a") == "Wed") and is_state("input_boolean.watering_day_wednesday", "on") }}'
- '{{ (now().strftime("%a") == "Thu") and is_state("input_boolean.watering_day_thursday", "on") }}'
- '{{ (now().strftime("%a") == "Fri") and is_state("input_boolean.watering_day_friday", "on") }}'
- '{{ (now().strftime("%a") == "Sat") and is_state("input_boolean.watering_day_saturday", "on") }}'
- '{{ (now().strftime("%a") == "Sun") and is_state("input_boolean.watering_day_sunday", "on")}}'
action:
- service: switch.turn_on
entity_id: switch.vanne_woox_switch
- service: notify.slack_hass_canaletto
data:
message: "{{now().strftime('%d/%m/%Y, %H:%M')}} &gt; WATERING | START | Soil : {{ states.sensor.soil_01_soil_moisture.state }}%"
- id: 'zz9csdfsef-76dd-4fdd-9dzz-40bfsdq158zz'
alias: 'WATERING OFF'
trigger:
- platform: template
value_template: '{{ states.sensor.time.state == states.input_datetime.watering_stop.state[0:5] }}'
action:
- service: switch.turn_off
entity_id: switch.vanne_woox_switch
- service: notify.slack_hass_canaletto
data:
message: "{{now().strftime('%d/%m/%Y, %H:%M')}} &gt; WATERING | STOP | Soil : {{ states.sensor.soil_01_soil_moisture.state }}%" </code></pre>
<p style="text-align: justify;">La carte Lovelace :</p>
<pre class="language-yaml"><code>type: vertical-stack
cards:
- type: entities
entities:
- entities:
- entity: automation.watering_on
name: false
- entity: sensor.energy_total_yearly_1pm_watering
name: false
unit: kWh
format: precision2
- entity: sensor.soil_01_soil_moisture
name: false
entity: switch.vanne_woox_switch
name: Arrosage
icon: mdi:watering-can-outline
show_state: false
state_color: true
type: custom:multiple-entity-row
- type: horizontal-stack
cards:
- type: custom:button-card
color_type: card
entity: input_boolean.watering_day_monday
name: Lundi
show_last_changed: false
show_state: false
tap_action:
action: toggle
state:
- value: 'on'
color: green
icon: mdi:water-boiler
- value: 'off'
color: grey
icon: mdi:water-boiler-off
styles:
card:
- height: 60px
- border-radius: 5px
- font-size: 12px
- type: custom:button-card
color_type: card
entity: input_boolean.watering_day_tuesday
name: Mardi
show_last_changed: false
show_state: false
tap_action:
action: toggle
state:
- value: 'on'
color: green
icon: mdi:water-boiler
- value: 'off'
color: grey
icon: mdi:water-boiler-off
styles:
card:
- height: 60px
- border-radius: 5px
- font-size: 12px
- type: custom:button-card
color_type: card
entity: input_boolean.watering_day_wednesday
name: Mercredi
show_last_changed: false
show_state: false
tap_action:
action: toggle
state:
- value: 'on'
color: green
icon: mdi:water-boiler
- value: 'off'
color: grey
icon: mdi:water-boiler-off
styles:
card:
- height: 60px
- border-radius: 5px
- font-size: 12px
- type: custom:button-card
color_type: card
entity: input_boolean.watering_day_thursday
name: Jeudi
show_last_changed: false
show_state: false
tap_action:
action: toggle
state:
- value: 'on'
color: green
icon: mdi:water-boiler
- value: 'off'
color: grey
icon: mdi:water-boiler-off
styles:
card:
- height: 60px
- border-radius: 5px
- font-size: 12px
- type: custom:button-card
color_type: card
entity: input_boolean.watering_day_friday
name: Vendredi
show_last_changed: false
show_state: false
tap_action:
action: toggle
state:
- value: 'on'
color: green
icon: mdi:water-boiler
- value: 'off'
color: grey
icon: mdi:water-boiler-off
styles:
card:
- height: 60px
- border-radius: 5px
- font-size: 12px
- type: custom:button-card
color_type: card
entity: input_boolean.watering_day_saturday
name: Samedi
show_last_changed: false
show_state: false
tap_action:
action: toggle
state:
- value: 'on'
color: green
icon: mdi:water-boiler
- value: 'off'
color: grey
icon: mdi:water-boiler-off
styles:
card:
- height: 60px
- border-radius: 5px
- font-size: 12px
- type: custom:button-card
color_type: card
entity: input_boolean.watering_day_sunday
name: Dimanche
show_last_changed: false
show_state: false
tap_action:
action: toggle
state:
- value: 'on'
color: green
icon: mdi:water-boiler
- value: 'off'
color: grey
icon: mdi:water-boiler-off
styles:
card:
- height: 60px
- border-radius: 5px
- font-size: 12px
- type: conditional
conditions:
- entity: automation.watering_on
state: 'on'
card:
type: custom:vertical-stack-in-card
cards:
- type: horizontal-stack
cards:
- type: markdown
content: '#### &lt;center&gt; Heure de d&eacute;but'
- type: markdown
content: '#### &lt;center&gt; Arrosage'
- type: markdown
content: '#### &lt;center&gt; Heure de Fin'
- type: horizontal-stack
cards:
- entity: input_datetime.watering_start
type: custom:time-picker-card
name: D&eacute;but
layout:
align_controls: center
embedded: true
hide:
name: true
icon: true
- type: glance
show_state: true
show_name: false
entities:
- switch.vanne_woox_switch
- entity: input_datetime.watering_stop
type: custom:time-picker-card
layout:
align_controls: center
embedded: true
hide:
name: true
icon: true
- color_thresholds:
- color: '#039BE5'
value: 0
- color: '#0da035'
value: 19
- color: '#e0b400'
value: 25
- color: '#e45e65'
value: 2400
color_thresholds_transition: hard
entities:
- entity: sensor.plant_01_moisture
name: Humidit&eacute; du sol
- entity: sensor.plant_01_temperature
name: Temp&eacute;ratire du sol
- color: rgba(0,0,255,1)
entity: binary_sensor.night_reworked
name: Nuit
show_line: false
y_axis: secondary
group: false
hour24: true
hours_to_show: 24
line_width: 2
name: Humidit&eacute; et temp&eacute;rature du sol
points_per_hour: 4
show:
extrema: true
fill: fade
icon: true
labels: false
name: true
state: true
state_map:
- label: Day
value: 'off'
- label: Night
value: 'on'
type: custom:mini-graph-card
- type: custom:flower-card
entity: plant.jardin
show_bars:
- illuminance
- humidity
- moisture
- conductivity
- temperature
- dli
battery_sensor: sensor.demo_battery</code></pre>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:52:"http://canaletto.fr/post/home-assistant-and-arrosage";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:60:"http://canaletto.fr/post/home-assistant-and-arrosage#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=73d63065-74d4-46d9-a913-740f09593ea0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:32:"mer., 7 juin 2023 20:21:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:9:"Domotique";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:6:{i:0;a:5:{s:4:"data";s:14:"Home Assistant";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:4:"HASS";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:5:"Plant";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:4:"Soil";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:8:"Arrosage";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:5;a:5:{s:4:"data";s:8:"Watering";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=73d63065-74d4-46d9-a913-740f09593ea0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=73d63065-74d4-46d9-a913-740f09593ea0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:60:"http://canaletto.fr/post/home-assistant-and-arrosage#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=73d63065-74d4-46d9-a913-740f09593ea0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:1;a:6:{s:4:"data";s:131:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:34:"Home Assistant &amp; Plug Security";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:6180:"<p style="text-align: justify;">On utilise souvent des prises command&eacute;es uniquement pour mesurer la consommation de certains appareils. Ces prises sont toujours en position ON. Ces prises, si elles ne sont pas de trop mauvaise qualit&eacute; un m&eacute;canisme de s&eacute;curit&eacute; int&eacute;gr&eacute; qui les passent OFF en cas de surtension ou de surcharge. Et dans la pratique &ccedil;a arrive parfois et on constate plus tard que le lave linge ou le lave vaisselle s'est arr&ecirc;t&eacute;, ou pire dans le cas d'un cong&eacute;lateur.</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/blitzwolf_bw_shp13_small.jpg" width="290" height="220" /></p>
<p style="text-align: justify;">Pour palier &agrave; cet inconv&eacute;nient on va cr&eacute;er une automation qui va r&eacute;armer la prise apr&egrave;s quelques minutes en OFF. Jusque l&agrave; c'est simple, mais il se peut &eacute;galement que le probl&egrave;me soit plus grave et qu'il ne faille pas forcer ind&eacute;finiment ce r&eacute;armement automatique. Etant donn&eacute; qu'on ne dispose g&eacute;n&eacute;ralement pas d'information sur la cause de ce passage en s&eacute;curit&eacute; on va consid&eacute;rer qu'au bout de "n" tentatives sur un temps donn&eacute; on ne r&eacute;arme plus. Pour &ccedil;a on va utiliser des compteurs (&agrave; cr&eacute;er avec un minimum &agrave; 0 et un maximum &agrave; 10) et on fera un reset de ceux-ci toutes les nuits...</p>
<p style="text-align: justify;">J'ai fix&eacute; ici arbitrairement &agrave; 5 le nombre de r&eacute;armements possibles.</p>
<p style="text-align: justify;"><span style="background-color: #f8cac6;"><strong>Attention :</strong> Je vous explique ici comment j'ai fait, mais un risque existe toujours et la mise en &oelig;uvre de cette solution est &agrave; vos risques (et p&eacute;rils). Je me d&eacute;gage ainsi de toute responsabilit&eacute;.</span></p>
<p style="text-align: justify;">On va faire &ccedil;a avec une seule automation que j'ai voulue la plus concise et qui servira &eacute;galement &agrave; notifier :</p>
<pre class="language-yaml"><code>automation:
- id: '2bd0ertyyf-2687-45f98f-aed0-to-off'
alias: "Notify Plug Off"
description: "Notification mise en s&eacute;curit&eacute; des prises"
mode: single
trigger:
- platform: state
entity_id: switch.bw_1
to: "off"
id: "Lave Vaisselle"
- platform: state
entity_id: switch.bw_2
to: "off"
id: "Lave Linge"
- platform: state
entity_id: switch.bw_3
to: "off"
id: "Seche Linge"
- platform: state
entity_id: switch.bw_4
to: "off"
id: "Congelateur"
- platform: time
at: "00:05:00"
id: "Reset"
condition: []
action:
- delay:
hours: 0
minutes: 5
seconds: 0
milliseconds: 0
- choose:
- conditions: "{{ trigger.id in ['Lave Vaisselle'] and states('counter.plug_bw_1') | int &lt; 5 }}"
sequence:
- service: switch.turn_on
target:
entity_id: switch.bw_1
- service: counter.increment
target:
entity_id: counter.plug_bw_1
- service: notify.slack_hass_mondon
data:
message: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; R&eacute;armement n&deg;{{ states('counter.plug_bw_1')}} du {{ trigger.id }}"
- conditions: "{{ trigger.id in ['Lave Linge'] and states('counter.plug_bw_2') | int &lt; 5 }}"
sequence:
- service: switch.turn_on
target:
entity_id: switch.bw_2
- service: counter.increment
target:
entity_id: counter.plug_bw_2
- service: notify.slack_hass_mondon
data:
message: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; R&eacute;armement n&deg;{{ states('counter.plug_bw_2')}} du {{ trigger.id }}"
- conditions: "{{ trigger.id in ['Seche Linge'] and states('counter.plug_bw_3') | int &lt; 5 }}"
sequence:
- service: switch.turn_on
target:
entity_id: switch.bw_3
- service: counter.increment
target:
entity_id: counter.plug_bw_3
- service: notify.slack_hass_mondon
data:
message: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; R&eacute;armement n&deg;{{ states('counter.plug_bw_3')}} du {{ trigger.id }}"
- conditions: "{{ trigger.id in ['Congelateur'] and states('counter.plug_bw_4') | int &lt; 5 }}"
sequence:
- service: switch.turn_on
target:
entity_id: switch.bw_4
- service: counter.increment
target:
entity_id: counter.plug_bw_3
- service: notify.slack_hass_mondon
data:
message: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; R&eacute;armement n&deg;{{ states('counter.plug_bw_4')}} du {{ trigger.id }}"
- conditions:
- condition: or
conditions:
- "{{ trigger.id in ['Lave Vaisselle'] and states('counter.plug_bw_1') | int &gt;= 5 }}"
- "{{ trigger.id in ['Lave Linge'] and states('counter.plug_bw_2') | int &gt;= 5 }}"
- "{{ trigger.id in ['Seche Linge'] and states('counter.plug_bw_3') | int &gt;= 5 }}"
- "{{ trigger.id in ['Congelateur'] and states('counter.plug_bw_4') | int &gt;= 5 }}"
sequence:
- service: notify.slack_hass_mondon
data:
message: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; Probl&egrave;me avec le {{ trigger.id }}. On ne r&eacute;arme plus, une v&eacute;rification s'impose."
- conditions: "{{ trigger.id in ['Reset'] }}"
sequence:
- service: counter.reset
target:
entity_id:
- counter.plug_bw_1
- counter.plug_bw_2
- counter.plug_bw_3
- counter.plug_bw_4</code></pre>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/enjoy2.jpg" width="302" height="202" /></p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:57:"http://canaletto.fr/post/home-assistant-and-plug-security";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:65:"http://canaletto.fr/post/home-assistant-and-plug-security#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=3b6db46a-58aa-41b8-a651-23fda8859b7a";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:32:"dim., 4 juin 2023 17:03:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:9:"Domotique";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:4:{i:0;a:5:{s:4:"data";s:4:"HASS";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:14:"Home Assistant";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:6:"Prises";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:5:"Plug ";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=3b6db46a-58aa-41b8-a651-23fda8859b7a";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=3b6db46a-58aa-41b8-a651-23fda8859b7a";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:65:"http://canaletto.fr/post/home-assistant-and-plug-security#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=3b6db46a-58aa-41b8-a651-23fda8859b7a";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:2;a:6:{s:4:"data";s:131:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:25:"Tailscale Access Controls";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:5420:"<p style="text-align: justify;">J'ai souvent parl&eacute; de Zerotier que j'utilise au quotidien, mais qui dans sa version gratuite comporte quelques limitations en terme de contr&ocirc;le d'acc&egrave;s dans un environnement mixant du site-to-site et des clients isol&eacute;s. J'ai donc voulut voir ce que proposait <a href="https://tailscale.com/" target="_blank" rel="noopener">Tailscale</a>, qui est un VPN manag&eacute; relativement similaire reposant sur Wireguard. Tous deux offrent des fonctionnalit&eacute;s gratuites et payantes. Si payer ne doit pas &ecirc;tre un probl&egrave;me dans un environnement de production, c'est un peu diff&eacute;rent en mode home lab.... d'autant plus que certaines fonctionnalit&eacute;s de la version gratuite ne se retrouvent que dans la <a href="https://tailscale.com/pricing/" target="_blank" rel="noopener">version Premium</a> &agrave; $18 /mois/utilisateur.</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/tailscale.png" width="250" height="51" /></p>
<p style="text-align: justify;">La version gratuite des Tailscale est plut&ocirc;t g&eacute;n&eacute;reuse, elle propose 100 nodes et 3 utilisateurs (&agrave; condition de disposer d'un "custom domain" (je vais utiliser des comptes Microsoft 365, mais plusieurs autres possibilit&eacute;s sont disponibles : <a href="https://tailscale.com/kb/1013/sso-providers/" target="_blank" rel="noopener">SSO Identity Providers</a>). On peut donc disposer de 3 comptes sur un m&ecirc;me domaine. Je parle de comptes car nativement (et normalement) le contr&ocirc;le d'acc&egrave;s se fait sur l'utilisateur. Manque de chance j'ai besoin de g&eacute;rer 4 utilisateurs, et je ne suis pas pr&ecirc;t &agrave; payer 4 x $18, ce qui me ferait plus de $ 800 par an !</p>
<p style="text-align: justify;">J'ai donc cherch&eacute; &agrave; contourner et je vais finalement g&eacute;rer mes autorisations &agrave; partir des machines Tailscale que j'ai approuv&eacute;es (mode NFS pour ceux qui se souviennent). Dans cet usage je ne cherche pas faire communiquer les clients Tailscale entre eux mais &agrave; leur permettre d'acc&eacute;der &agrave; des ressources situ&eacute;es sur diff&eacute;rents subnets sur lesquels je souhaite restreindre les possibilit&eacute;s.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/tailscale-subnet.png" width="698" height="445" /></p>
<p style="text-align: justify;">Pour la suite on consid&egrave;re que le r&eacute;seaux Tailscale est configur&eacute; avec les nodes qui servent &agrave; joindre les subnets.</p>
<p style="text-align: justify;">Je vais cr&eacute;er deux utilisateurs :</p>
<pre class="language-yaml"><code>admin@canaletto.fr
user@canaletto.fr</code></pre>
<p style="text-align: justify;">Le premier compte qui sera &eacute;galement le mien va &eacute;galement me permettre de configurer et approuver les machines clientes.</p>
<p style="text-align: justify;">Le second servira &agrave; connecter mes utilisateurs et je pourrais approuver leurs machines. Ce compte &eacute;tant prot&eacute;g&eacute; en MFA, il n&eacute;cessitera une validation de ma part. Une fois la machine connect&eacute;e, je d&eacute;sactive l'expiration de la cl&eacute; et on passe au contr&ocirc;le s'acc&egrave;s :</p>
<pre class="language-yaml"><code>{
"acls": [
{"action": "accept", "src": ["admin@canaletto.fr"], "dst": ["*:*"]}, // Ici l'admin dispose de tous les droits
// Autorisation par machines
{
"action": "accept",
"src": ["azura", "lydia"], // Ici deux clients Tailscale
"dst": [
"pipa:25,53", // On autorise le host qui supporte le DNS si on veut utiliser les noms courts...
"mixa:80,443,445,3389",
"nona:80,443,445,1443,3389", // Ports autoris&eacute;s
"lab-1:*",
"192.168.2.12:80,443,9100,5001,3389", // Par IP + ports
"192.168.6.0/24:*", // Par subnet
],
},
],
"hosts": {
"azura": "100.1.2.3", // Client Tailscale
"lydia": "100.5.2.3", // Client Tailscale
"mixa": "192.168.1.4", // Host on subnet
"nona": "192.168.2.8", // Host on subnet
"pipa": "192.168.2.1", // Host on subnet
"lab-1": "192.168.6.0/24", // subnet
},
}</code></pre>
<p style="text-align: justify;"><strong>Dans l'ordre :</strong></p>
<ol style="text-align: justify;">
<li>J'autorise l'admin &agrave; tout voir.</li>
<li>Ensuite j'autorise les machines <code>azura</code> et <code>lydia</code> &agrave; acc&eacute;der uniquement aux hosts que j'aurais d&eacute;fini avec une restriction sur certains ports. C'est possible en d&eacute;finissant les hosts plus loin ou en se servant directement des adresses IP. L'ICMP (ping) est ouvert automatiquement vers les destinations autoris&eacute;es.</li>
<li>Je d&eacute;fini les clients et serveurs.</li>
</ol>
<p>Voil&agrave;. Je n'ai pas creus&eacute; toutes les possibilit&eacute; offertes par le contr&ocirc;le d'acc&egrave;s propos&eacute; par Tailscale, la liste est longue et le <a href="https://tailscale.com/kb/" target="_blank" rel="noopener">documentation</a> plut&ocirc;t bien faire. Id&eacute;es bienvenues !</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/enjoy2.jpg" width="285" height="191" /></p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:50:"http://canaletto.fr/post/tailscale-access-controls";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:58:"http://canaletto.fr/post/tailscale-access-controls#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=41efab1a-c669-47a9-9b5f-5f67128e8eb2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:31:"mar., 2 mai 2023 20:24:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:2:{i:0;a:5:{s:4:"data";s:7:"IP & Co";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:2:"IT";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:3:{i:0;a:5:{s:4:"data";s:3:"vpn";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:9:"TailScale";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:9:"WireGuard";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=41efab1a-c669-47a9-9b5f-5f67128e8eb2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=41efab1a-c669-47a9-9b5f-5f67128e8eb2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:58:"http://canaletto.fr/post/tailscale-access-controls#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=41efab1a-c669-47a9-9b5f-5f67128e8eb2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:3;a:6:{s:4:"data";s:138:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:37:"Home Assistant &amp; Alarm, encore...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:26973:"<p style="text-align: justify;">J'ai souvent parl&eacute; d'alarme ici, de t&eacute;l&eacute;commandes, de claviers et de sir&egrave;nes. Je pense cette fois &ecirc;tre parvenu &agrave; quelque chose de fonctionnel et je vais vous en parler. Pour faire face aux diff&eacute;rentes contraintes, notamment la gestion bizarre des t&eacute;l&eacute;commandes sous ZHA, il va falloir un peu ruser. Avant que vous me demandiez pourquoi je m'obstine sous ZHA alors que ces m&ecirc;mes t&eacute;l&eacute;commandes sont bien g&eacute;r&eacute;es sous Z2M, je vous r&eacute;pondrait que mon objectif est la simplification et donc d'&eacute;viter le plus possible les adons qui complexifient une installation, pas forc&eacute;ment pour moi ou je dispose de toutes les passerelles possibles, mais sur des installations que je g&egrave;re &agrave; distance ou je me dois de faire simple et fiable.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/Alarm_07.png" /></p>
<p style="text-align: justify;"><span style="background-color: #f8cac6;"><strong>Attention :</strong>&nbsp; on parle ici d'un syst&egrave;me de s&eacute;curit&eacute; DIY, donc non agr&eacute;e par les assurances et autres...&nbsp;Ca ne veut pas dire que &ccedil;a ne fonctionne pas, juste que &ccedil;a ne r&eacute;pond pas aux normes NF en vigueur dans ce domaine</span></p>
<p style="text-align: justify;">Afin de g&eacute;rer toutes les contraintes, je vais principalement m'appuyer sur deux <code>automations:</code>, quelques <code>scripts:</code> et un <code>alarm_control_panel:</code> virtuel.</p>
<p style="text-align: justify;"><strong>L'objectif est de g&eacute;rer :</strong></p>
<ul style="text-align: justify;">
<li>Un mode absent (away) (avec une variable pour simuler un peu de pr&eacute;sence).</li>
<li>Un mode pr&eacute;sent/nuit arm&eacute; (home) (plus ou moins utile mais mais &ccedil;a fait partie de tout syst&egrave;me d'alarme face au home jacking.</li>
<li>Un mode alerte (emergency) qui va permettre de d&eacute;clencher une action d'urgence en appuyant sur un bouton de t&eacute;l&eacute;commande ou m&eacute;daillon (je pense &agrave; mes vieux jours).</li>
</ul>
<p style="text-align: justify;"><strong>De l'armement / d&eacute;sarmement vont &eacute;galement d&eacute;couler :</strong></p>
<ul style="text-align: justify;">
<li>La fermeture compl&egrave;te ou partielle des volets roulants, leur r&eacute;ouverture coh&eacute;rente avec la programmation en cours et &eacute;ventuellement le passage en manuel des volets des chambres des enfants / invit&eacute;s s'ils sont pr&eacute;sents.</li>
<li>La gestion du climatiseur et des convecteurs avec passage en mode &eacute;co ou absent en fonction du type d'armement).</li>
<li>La gestion du chauffe eau en cas d'absence de longue dur&eacute;e.</li>
<li>La gestion des &eacute;clairages et la mise en veille des &eacute;crans et ordinateurs.</li>
<li>...</li>
</ul>
<p style="text-align: justify;">Etant donn&eacute; que j'ai deux syst&egrave;mes d'alarme qui fonctionnent en parall&egrave;le (Alarmo et Visonic), j'ai commenc&eacute; par cr&eacute;er une alarme virtuelle et je me servirait d'elle pour les diff&eacute;rentes actions.</p>
<pre class="language-yaml"><code>alarm_control_panel:
- platform: manual
name: Home Alarm Command
code: 1234
code_arm_required: false
disarm_after_trigger: false
arming_time: 0
delay_time: 0
trigger_time: 600
disarmed:
trigger_time: 0
armed_home:
arming_time: 0
delay_time: 0</code></pre>
<h3 style="text-align: justify;">L'Armement / D&eacute;sarmement</h3>
<p style="text-align: justify;">L'armement / d&eacute;sarmement va pouvoir se faire de plusieurs fa&ccedil;ons :</p>
<ul style="text-align: justify;">
<li>Clavier &agrave; code</li>
<li>T&eacute;l&eacute;commande d&eacute;di&eacute;e</li>
<li>Application mobile</li>
<li>Tag RFID (pour d&eacute;sarmer dans mon cas)</li>
</ul>
<p style="text-align: justify;">J'ai volontairement &eacute;cart&eacute; les t&eacute;l&eacute;commandes radio en 433 Mhz dont j'avais parl&eacute; ici, d'une part parce qu'elles sont facilement piratables, et d'autre part parce qu'elles ne permettent pas de savoir qui a d&eacute;sarm&eacute; le syst&egrave;me.</p>
<p style="text-align: justify;">Je vais utiliser deux automations et les d&eacute;couper ce dessous/</p>
<ul style="text-align: justify;">
<li>La premi&egrave;re pour g&eacute;rer les armements / d&eacute;sarmements</li>
<li>La seconde pour g&eacute;rer le d&eacute;sarmement des t&eacute;l&eacute;commandes, claviers &agrave; code afin d'int&eacute;grer les particularit&eacute;s ZHA (en attendant une am&eacute;lioration de la part des d&eacute;veloppeurs de Home Assistant qui pour l'instant font la sourde oreille, parfois plus concentr&eacute;s sur les nouveaut&eacute;s que l'affinage de l'existant).</li>
</ul>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/Alarm_10_panel.png" width="500" /></p>
<h3>Gestion de l'armement / d&eacute;sarmement et des boutons d'urgence</h3>
<p style="text-align: justify;"><strong>Les d&eacute;clencheurs</strong>&nbsp;: Ici on va empiler nos d&eacute;clencheurs d'armement, qu'ils soient g&eacute;r&eacute;s par ZHA, Z2M ou toute autre source. 3 par fonction, <code>armed_away, armed_home, triggered</code>, mais cela peut &eacute;galement &ecirc;tre un bouton virtuel pour Lovelace, voire n'importe quelle t&eacute;l&eacute;commande ou bouton poussoir.</p>
<pre class="language-yaml"><code>- id: 078fsdg412-3545-4f37-ba02-bccsfds5646sf
alias: "Alarm : Global ON/OFF"
mode: restart
trigger:
- platform: device
device_id: c036b6547a0347878dcc6d06152267ab
domain: alarm_control_panel
entity_id: alarm_control_panel.lk_zb_keypad
type: armed_away
id: "KeyPad Away"
- platform: device
device_id: c036b6547a0347878dcc6d06152267ab
domain: alarm_control_panel
entity_id: alarm_control_panel.lk_zb_keypad
type: armed_home
id: "KeyPad Home"
- platform: device
device_id: c036b6547a0347878dcc6d06152267ab
domain: alarm_control_panel
entity_id: alarm_control_panel.lk_zb_keypad
type: triggered
id: "KeyPad Triggered"
- platform: state
entity_id: input_button.arm_alarm_away
id: "Push Button Away"</code></pre>
<p style="text-align: justify;">Et un d&eacute;clencheur de d&eacute;sarmement activ&eacute; par une seconde automation que l'on verra plus loin :</p>
<pre class="language-yaml"><code> - platform: state
entity_id:
- alarm_control_panel.home_alarm_command
to: disarmed
id: "Remote or Keypad"</code></pre>
<p style="text-align: justify;"><strong>Les conditions</strong> : Dans mon cas je n'en ai pas utilis&eacute;. Chacun adaptera.</p>
<pre class="language-yaml"><code> condition:</code></pre>
<p style="text-align: justify;"><strong>Les actions</strong> :&nbsp;</p>
<p style="text-align: justify;">Je commence par arr&ecirc;ter les &eacute;ventuels scripts en cours. Cela est principalement utile quand on a ferm&eacute; la porte, arm&eacute; le syst&egrave;me et que l'on doit rapidement d&eacute;sarmer car on a oubli&eacute; quelque chose dans la maison.</p>
<pre class="language-yaml"><code> action:
- service: homeassistant.turn_off
target:
entity_id:
- script.privacy_on
- script.privacy_off
- script.alarmo_after_arm
- script.alarmo_after_disarm
- script.alarm_actions_on_leave_common_tasks
- script.alarm_actions_on_return_common_tasks</code></pre>
<p style="text-align: justify;">Ensuite on va utiliser <code>chose:</code> pour ex&eacute;cuter les diff&eacute;rentes actions en fonction de la source et de l'&eacute;tat.</p>
<p style="text-align: justify;">On commence par l'armement en mode absent :</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">On envoie les bips d'armement sur la sir&egrave;ne. En MQTT pour l'instant car elle aussi est tr&egrave;s mal g&eacute;r&eacute;e sous ZHA</li>
<li style="text-align: justify;">On arme Alarmo</li>
<li style="text-align: justify;">On arme Visonic (en mode Home sans les PIR qui d&eacute;raillent).</li>
<li style="text-align: justify;">On arme notre panneau d'alarme virtuel qui nous servira au d&eacute;sarmement</li>
<li style="text-align: justify;">On arme &eacute;galement le clavier, &ccedil;a ne change rien &agrave; l'usage mais quand on se pr&eacute;sentera pour d&eacute;sarm&eacute; il apparaitra comme &eacute;tant arm&eacute;. Dans la pratique &ccedil;a relance de fait l'automation avec la m&ecirc;me automation, et donc &ccedil;a fausse le message, j'ai donc retir&eacute; cette option pour l'instant. (D'ailleurs si vous &ecirc;tes sous Z2M il le d&eacute;veloppeur d'Alarmo a fait <a href="https://community.home-assistant.io/t/zigbee2mqtt-control-alarmo-via-keypad/420016" target="_blank" rel="noopener">un joli travail</a> pour ce clavier).</li>
<li style="text-align: justify;">On inscrit un message texte dans un <code>input_text:</code> que l'on affiche dans Lovelace et qui nous permet de savoir qui fait quoi. A terme je remplacerait les <code>id:</code> par le pr&eacute;nom de l'utilisateur pour plus de lisibilit&eacute;.</li>
</ul>
<pre class="language-yaml"><code> - choose:
- conditions: "{{ trigger.id in ['KeyPad Away', 'Heiman RC1 Away', 'Heiman RC2 Away', 'Woox RC1 Away'] }}"
sequence:
- service: mqtt.publish
data:
topic: zigbee2mqtt/Sir&egrave;ne SMaBiT/set
payload: &gt;-
{"squawk": {"state": "system_is_armed", "level": "veryhigh", "strobe": "true"}}
- service: alarm_control_panel.alarm_arm_away # ALARMO Away
data:
code: !secret alarm_code
entity_id: alarm_control_panel.alarmo
- service: alarm_control_panel.alarm_arm_home # VISONIC Home (ne jamais armer AWAY &agrave; cause des d&eacute;tecteurs HS)
data:
code: !secret alarm_code_visonic
entity_id: alarm_control_panel.visonic_alarm
- service: script.alarm_actions_on_leave_common_tasks
- service: alarm_control_panel.alarm_arm_away # FAKE ALARM PANEL Away
target:
entity_id: alarm_control_panel.home_alarm_command
- service: alarm_control_panel.alarm_arm_away # On arme le clavier afin qu'il apparaisse arm&eacute;
data:
code: !secret alarm_code_zha
target:
entity_id:
- alarm_control_panel.lk_zb_keypad
- service: input_text.set_value
target:
entity_id: input_text.last_arm
data:
value: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; Arm Away by : {{ trigger.id }}" </code></pre>
<p style="text-align: justify;">On fait la m&ecirc;me chose pour le mode home. Je fais l'impasse sur Visonic, par contre j'&eacute;met un son de confirmation sur un buzzer (on verra plus loin l'utilisation possible d'un TTS sur une enceinte.</p>
<pre class="language-yaml"><code> - conditions: "{{ trigger.id in ['KeyPad Home', 'Heiman RC1 Home', 'Heiman RC2 Home', 'Woox RC1 Home'] }}"
sequence:
- service: alarm_control_panel.alarm_arm_home # ALARMO Home
data:
code: !secret alarm_code
entity_id: alarm_control_panel.alarmo
- service: alarm_control_panel.alarm_arm_home # FAKE ALARM PANEL Home
target:
entity_id: alarm_control_panel.home_alarm_command
- service: alarm_control_panel.alarm_arm_home # On arme le clavier afin qu'il apparaisse arm&eacute;
data:
code: !secret alarm_code_zha
target:
entity_id:
- alarm_control_panel.lk_zb_keypad
- service: button.press
target:
entity_id: button.up_chime_play_buzzer
- service: input_text.set_value
target:
entity_id: input_text.last_arm
data:
value: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; Arm Home by : {{ trigger.id }}" </code></pre>
<p style="text-align: justify;">Ensuite on passe au d&eacute;sarmement du mode absent. On remarque que l'on &eacute;crit pas d'<code>input_text:</code> car ici on ne sait pas qui a fait quoi car l'ordre vient de la seconde automation que l'on verra plus loi. C'est donc elle qui &eacute;crira. Par contre on &eacute;met le son de d&eacute;sarmement sur la sir&egrave;ne.</p>
<pre class="language-yaml"><code> - conditions: "{{ trigger.id in ['Remote or Keypad'] and is_state('alarm_control_panel.alarmo', 'armed_away') }}"
sequence:
- service: alarm_control_panel.alarm_disarm
data:
code: !secret alarm_code
entity_id:
- alarm_control_panel.alarmo
- alarm_control_panel.visonic_alarm
- service: mqtt.publish
data:
topic: zigbee2mqtt/Sir&egrave;ne SMaBiT/set
payload: &gt;-
{"squawk": {"state": "system_is_disarmed", "level": "veryhigh", "strobe": "true"}} </code></pre>
<p style="text-align: justify;">Pareil pour le mode Home. Ici on joue un son sur le buzzer.</p>
<pre class="language-yaml"><code> - conditions:
- "{{ trigger.id in ['Push Button'] }}"
- "{{ is_state('alarm_control_panel.alarmo', 'armed_home') }}"
sequence:
- service: alarm_control_panel.alarm_disarm
data:
code: !secret alarm_code
entity_id:
- alarm_control_panel.alarmo
- service: button.press
target:
entity_id: button.up_chime_play_buzzer</code></pre>
<p style="text-align: justify;">On continue avec la gestion du bouton d'urgence :</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">On joue un son pour confirmer</li>
<li style="text-align: justify;">On arme notre panneau d'alarme virtuel dans un mode inutilis&eacute; (Nuit) pour ensuite pouvoir d&eacute;sarmer.</li>
<li style="text-align: justify;">On envoie un SMS d'Au Secours, ou toute autre action &agrave; imaginer.</li>
<li style="text-align: justify;">On &eacute;crit un <code>input_text:</code> pour avoir une trace.</li>
</ul>
<pre class="language-yaml"><code> - conditions: "{{ trigger.id in ['KeyPad Triggered', 'Heiman RC1 Triggered', 'Heiman RC2 Triggered', 'Woox RC1 Triggered'] and is_state('alarm_control_panel.alarmo', 'disarmed') }}"
sequence:
- service: button.press
target:
entity_id: button.up_chime_play_chime
- service: alarm_control_panel.alarm_arm_night # FAKE ALARM PANEL Night pour pouvoir d&eacute;sarmer
target:
entity_id: alarm_control_panel.home_alarm_command
- service: notify.free_mobile_andre
data:
message: "{{ states.sensor.date_time.state}} &gt; TEST Alerte au secours par t&eacute;l&eacute;commande TEST"
- service: input_text.set_value
target:
entity_id: input_text.last_arm
data:
value: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; Triggered by : {{ trigger.id }}" </code></pre>
<p style="text-align: justify;">Enfin, on d&eacute;sarme cette alerte. A ce stade on peut aussi envoyer un SMS pour dire que c'&eacute;tait une fausse alerte... Je vais me contenter de jouer du buzzer...</p>
<pre class="language-yaml"><code> - conditions:
- "{{ trigger.id in ['Remote or Keypad'] and is_state('alarm_control_panel.alarmo', 'disarmed') }}"
sequence:
- service: button.press
target:
entity_id: button.up_chime_play_buzzer</code></pre>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/Alarm_09.png" width="500" /></p>
<h3 style="text-align: justify;">Gestion des commandes de d&eacute;sarmement</h3>
<p style="text-align: justify;">Au risque de me r&eacute;p&eacute;ter, cette partie aurait pu &ecirc;tre int&eacute;gr&eacute;e &agrave; la premi&egrave;re automation, si ZHA ne posait pas probl&egrave;me... Je le ferait probablement, mais pour l'exemple on va pour l'instant scinder cette partie.</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/Alarm_01_remote.png" width="395" height="287" /></p>
<p style="text-align: justify;">Donc, pour les t&eacute;l&eacute;commandes d'alarme sous ZHA on va devoir &eacute;couter un <code>event:</code>, s'en servir pour d&eacute;sarmer nos syst&egrave;me d'alarme mais &eacute;galement pour la d&eacute;sarmer et d&eacute;sarmer ses copines ainsi que le clavier. Simple ! J'avais explor&eacute; dans <a href="http://canaletto.fr/post/home-assistant-and-remote-alarm" target="_blank" rel="noopener">un pr&eacute;c&eacute;dent article plusieurs pistes</a> afin de ne prendre en compte qu'un seul de ses "<em>events</em>" (en + elle en envoie 3 ou 4 identiques selon l'humeur et le mod&egrave;le). J'ai un peu avanc&eacute; et on ne va pas les &eacute;couter dans l'automation, mais se servir de l'&eacute;tat temporaire d'un <code>binary_sensor:</code> que l'on va pouvoir temporiser et ainsi ne prendre en compte qu'un seul <code>event:</code></p>
<pre class="language-yaml"><code>template:
- trigger:
- platform: event
event_type: zha_event
event_data:
device_ieee: a4:c1:38:96:0b:cf:c9:61 # Woox RC1
command: 'arm'
args:
arm_mode: 0
arm_mode_description: 'Disarm'
code: ''
zone_id: 0
binary_sensor:
name: Woox RC1 to Disarmed
icon: "{{ (trigger.platform == 'event') | iif('mdi:remote-off', 'mdi:remote') }}"
state: "{{ trigger.platform == 'event' }}"
auto_off:
seconds: 5</code></pre>
<p style="text-align: justify;"><strong>Les d&eacute;clencheurs</strong> : Ici on va &eacute;couter des actions de d&eacute;sarmement, que cela provienne d'un clavier, une t&eacute;l&eacute;commande (via leur <code>binary_sensor:</code>), ou en direct pour une source classique (tag RFID, MQTT, ...).</p>
<pre class="language-yaml"><code>- id: '2bd0ertyyf-43fa-45f98f-aed0-disarm'
alias: "Alarm @ Remote Disarm"
description: 'Disarm Remote Control panel'
mode: single
trigger:
- platform: state
entity_id: binary_sensor.heiman_rc1_to_disarmed
to: "on"
id: "Heiman RC 1"
- platform: tag
tag_id: 2b855225-c999-4b5558123-6c7d12345641
id: "TAG Jaune"
- platform: device
domain: mqtt
device_id: 139eb4ce27246465b0d5aa7560a953601
type: action
subtype: disarm
discovery_id: 0x84fd27fffe915905 action_disarm
id: "Heiman RC2"</code></pre>
<p style="text-align: justify;"><strong>Les conditions</strong> : Aucune, mais on pourrait imagine un flag de blocage activ&eacute; &agrave; distance apr&egrave;s une alerte...</p>
<pre class="language-yaml"><code>condition:</code></pre>
<p style="text-align: justify;"><strong>Les actions</strong> : On utilise un chose: et on commence par :</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">D&eacute;sarmer le panneau d'alarme virtuel, ce qui d&eacute;clenchera l'action idoine dans la premi&egrave;re automation.</li>
<li style="text-align: justify;">D&eacute;sarmer les t&eacute;l&eacute;commandes et claviers qui sont &eacute;galement des panneaux d'alarme, avec cette particularit&eacute; ZHA qui fait qu'il faut un code pour d&eacute;sarmer une t&eacute;l&eacute;commande...</li>
<li style="text-align: justify;">Ecrire un <code>input_text:</code> afin de savoir qui a d&eacute;sarm&eacute;.</li>
<li style="text-align: justify;">J'envoie un message dans Slack qui me sert de log. Ca va &eacute;galement m'informer &agrave; distance que quelqu'un est arriv&eacute; et a d&eacute;sarm&eacute;&nbsp;</li>
</ul>
<pre class="language-yaml"><code> action:
- choose: # DISARM
- conditions: "{{ trigger.id in ['Push Button', 'KeyPad', 'Linkind RC', 'Heiman RC 1', 'Woox RC 1', 'TAG Porte', 'TAG Jaune', 'TAG Cl&eacute;', 'TAG Carte', 'Heiman RC2' ] }}"
sequence:
- service: alarm_control_panel.alarm_disarm # FAKE ALARM PANEL to Command
data:
code: "1234"
target:
entity_id: alarm_control_panel.home_alarm_command
- service: alarm_control_panel.alarm_disarm
data:
code: !secret alarm_code_zha
target:
entity_id:
- alarm_control_panel.lk_zb_keypad
- alarm_control_panel.lk_zb_remote
- alarm_control_panel.heiman_remote
- alarm_control_panel.woox_01
- service: input_text.set_value
target:
entity_id: input_text.last_disarm
data:
value: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; Disarm by : {{ trigger.id }}"
- service: notify.slack_hass_canaletto
data:
message: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} &gt; Disarmed by : {{ trigger.id }}" </code></pre>
<p style="text-align: justify;">On peut &eacute;galement faire une place &agrave; une fonctionnalit&eacute; d&eacute;tourn&eacute;e du clavier. En effet au del&agrave; de l'amen&eacute;e Home, Away et Emergency, on peut &eacute;galement lui faire avaler n'importe quel code et effectuer une action pr&eacute;cise en fonction de celui ci. Ici si je saisit 33 et valide je vais allumer les projecteurs.</p>
<pre class="language-yaml"><code> - choose:
- conditions: "{{ trigger.id in ['KeyPad 33'] }}"
sequence:
- service: light.turn_off
target:
entity_id:
- light.groupe_de_projecteurs
</code></pre>
<p style="text-align: justify;">Enfin j'ai quelques actions par d&eacute;faut, comme &eacute;teindre les sir&egrave;nes au cas ou... (&ccedil;a sent le debug...).</p>
<pre class="language-yaml"><code> - service: mqtt.publish
data:
topic: zigbee2mqtt/Sir&egrave;ne SMaBiT/set
payload: &gt;-
{"warning": {"mode": "stop"}}
- service: siren.turn_off
target:
entity_id:
- siren.heiman_sirene_1
- siren.heiman_sirene_2
- siren.sirene_terrasse
</code></pre>
<p style="text-align: justify;"><span style="text-decoration: line-through;">Et surtout <span style="background-color: #fbeeb8;">on ajoute un d&eacute;lai</span> car ces t&eacute;l&eacute;commandes ont la f&acirc;cheuse id&eacute;e d'envoyer 3 ou 4 <code>event:</code> identique pour chaque appui. Donc combin&eacute; au <code>mode: single</code> de cette automation, on va en capturer qu'un seul. Ce d&eacute;lais est bien sur &agrave; ajuster plus ou moins au pif...</span> Maintenant que je passe par des <code>binary_sensor:</code> temporis&eacute;s, je pense que ce d&eacute;lai est devenu inutile.</p>
<pre class="language-yaml"><code> - delay : '00:00:08'</code></pre>
<h3 style="text-align: justify;">Les actions POST Armement / D&eacute;sarmement</h3>
<p style="text-align: justify;">On va utiliser deux scripts qui seront ex&eacute;cut&eacute;s par Alarmo apr&egrave;s l'armement et apr&egrave;s le d&eacute;sarmement. Chez moi ils vont servir &agrave; :</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Jouer une annonce vocale en TTS sur une enceinte ext&eacute;rieure pour annoncer l'&eacute;tat arm&eacute; ou d&eacute;sarm&eacute;.</li>
<li style="text-align: justify;">Activer ou d&eacute;sactiver la vid&eacute;o surveillance.</li>
<li style="text-align: justify;">Passer les volets en mode manuel et automatique au retour (voir l'automatisation des volets).</li>
<li style="text-align: justify;">G&eacute;rer le mode ECO/Absent du climatiseur et des convecteurs.</li>
<li style="text-align: justify;">G&eacute;rer les &eacute;clairages et le mode veille de mon PC.</li>
<li style="text-align: justify;">Et plus encore selon votre imagination....</li>
</ul>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/Alarm_08.png" /></p>
<h3 style="text-align: justify;">Les notifications d'alarme et sir&egrave;nes</h3>
<ul style="text-align: justify;">
<li style="text-align: justify;">Notifications SMS pour l'intrusion, la d&eacute;tection incendie ou fuite d'eau. (notifications g&eacute;r&eacute;es par Alarmo).</li>
<li style="text-align: justify;">Sir&egrave;nes et projecteurs en cas d'intrusion :
<ul>
<li>la l&eacute;gislation autorise au maximum 3 minutes pour chaque lancement de sir&egrave;ne.</li>
<li>Pas de limite pour les projecteurs. Et &eacute;clairer comme en plein jour peut &eacute;galement faire fuir et permettra d'avoir des images bien nettes sur les cam&eacute;ras.</li>
<li>Si vous avez un syst&egrave;me audio multi room bien puissant, vous pouvez &eacute;galement envoyer une bonne salve d'AC-DC, &ccedil;a peu perturber... ou inciter les voisins &agrave; appeler la mar&eacute;chauss&eacute;e.</li>
<li>Les armes, explosifs et autres gaz toxiques sont &agrave; proscrire.</li>
</ul>
</li>
</ul>
<p style="text-align: justify;">Pour cela on va utiliser des scripts: qui seront lanc&eacute;s par Alarmo selon les conditions choisies (voir <a href="http://canaletto.fr/post/home-assistant-and-sirenes" target="_blank" rel="noopener">ici</a>).</p>
<p style="text-align: justify;">Etant donn&eacute; que j'ai des d&eacute;tecteurs d'ouverture sur mes volets roulants, je peux &eacute;galement imaginer l'&eacute;clairage ext&eacute;rieur avant de d&eacute;clencher l'alarme si un de ces volets est touch&eacute;. Il faut &ecirc;tre pr&eacute;venant et &eacute;clairer l'intrus. Cela peut se gr&eacute;er dans une partition secondaire d'Alarmo, ou simple une automation. Les cam&eacute;ras Unifi Protect (G4) font &eacute;galement de la d&eacute;tection de personne qui remonte dans Home Assistant.</p>
<p style="text-align: justify;">Voil&agrave;, ce n'est pas exhaustif, vos id&eacute;es son les bienvenues, ici ou sur <a href="https://forum.hacf.fr/t/alarme-encore/21838" target="_blank" rel="noopener">HACF</a>.</p>
<p style="text-align: justify;">&nbsp;</p>
<p style="text-align: justify;">&nbsp;</p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:56:"http://canaletto.fr/post/home-assistant-and-alarm-encore";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:64:"http://canaletto.fr/post/home-assistant-and-alarm-encore#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=9217dc3a-beac-408d-9078-45b874365a1a";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:33:"lun., 13 mars 2023 00:01:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:9:"Domotique";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:5:{i:0;a:5:{s:4:"data";s:4:"HASS";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:6:"Hassio";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:6:"Alarme";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:6:"Alarmo";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:6:"Remote";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=9217dc3a-beac-408d-9078-45b874365a1a";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"2";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=9217dc3a-beac-408d-9078-45b874365a1a";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:64:"http://canaletto.fr/post/home-assistant-and-alarm-encore#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=9217dc3a-beac-408d-9078-45b874365a1a";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:4;a:6:{s:4:"data";s:166:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:43:"VMWare ESXi sur Nuc 9 &amp; SSD firmware...";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:10810:"<p style="text-align: justify;">Comme je vous en avait parl&eacute; <a href="http://canaletto.fr/post/vmware-esxi-nuc-9" target="_blank" rel="noopener">ici</a>, j'ai remplac&eacute; mon serveur ESXi HP ML350p par un Nuc 9. Depuis plus de 6 mois &ccedil;a fonctionne tr&egrave;s bien.</p>
<p style="text-align: justify;">Dans ce Nuc j'ai install&eacute; deux SSD NVMe Samsung 980 Pro. Les performance sont au top, mais voil&agrave; que plusieurs utilisateurs se plaignent que leurs SSD s'usent pr&eacute;matur&eacute;ment et finissent par passer en R/O. C'est d'autant plus f&acirc;cheux que sous ESX on ne dispose de rien pour surveiller les disques sur un NUC, celui ci ne remontant pas de donn&eacute;es IPML comme le ferait un vrai serveur. Apr&egrave;s avoir fait un peu la sourde oreille, Samsung a fini par sortir <a href="https://semiconductor.samsung.com/consumer-storage/support/tools/" target="_blank" rel="noopener">la mise &agrave; jour</a> idoine.</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/nuc_ssd_updat_05.png" width="600" /></p>
<p style="text-align: justify;">Sous Windows il est tr&egrave;s facile de mettre &agrave; jour (ou de migrer) un SSD, il suffit de lancer Samsung Magician et le tour est jou&eacute; ! Sous VMWare ESXi rien de tout &ccedil;a et il va falloir le faire &agrave; la mano. Heureusement pour cela Samsung fournit &eacute;galement les firmawares sous la forme d'une ISO, il suffit, en principe, de le griller sur une cl&eacute; USB et de booter avec et de faire la mise &agrave; jour. Mais &ccedil;a c'est la th&eacute;orie. Dans la pratique j'ai appris &agrave; mes d&eacute;pends que cette cl&eacute; bas&eacute;e sur un vieux Linux &eacute;tait incapable de booter sur du mat&eacute;riel moderne, et quand elle boote certains disent m&ecirc;me qu'elle ne reconnait que les claviers PS2... Allons donc !</p>
<p style="text-align: justify;">Apr&egrave;s quelques recherches j'ai d&eacute;couvert qu'il existait un contournement possible mis en pratique par la communaut&eacute; Linux, mais nullement support&eacute;e par Samsung qui doit consid&eacute;rer que ses SSD sont destin&eacute;s uniquement &agrave; l'environnement Windows, tout comme VMWare qui a sa liste de hardware support&eacute;...</p>
<p style="text-align: justify;">L'astuce consiste &agrave; booter sous Linux, un Live CD Ubuntu. Facile, non pas si simple car ce live CD ne voulait lui non plus pas booter. Le bios de ce Nuc n'&eacute;tant pas de toute fraicheur j'en profite pour le mettre &agrave; jour sans plus de succ&egrave;s.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/nuc_ssd_updat_01.png" width="600" /></p>
<p style="text-align: justify;">J'ai fini par trouver que pour booter sous Ubuntu il fallait d&eacute;sactiver TPM et SGX. Ca ne s'invente pas mais j'ai fini par pouvoir booter mon Ubuntu Live.</p>
<p style="text-align: justify;">Une fois sur le desktop de mon Ubuntu je copie l'ISO de mise &agrave; jour (<code>Samsung_SSD_980_PRO_5B2QGXA7.iso</code>) que j'ai au pr&eacute;alable pr&eacute;par&eacute;e sur une autre cl&eacute; USB vers le r&eacute;pertoire Home et je monte le volume. Ensuite toujours depuis l'interface graphique j'extrait le fichier <code>initrd</code> un r&eacute;pertoire (<code>/home/samsung</code> par exemple). Ensuite je vais jusqu'&agrave; <code>/home/samsung/initrd/root/fumagician</code> et je peux lancer la mise &agrave; jour de mes SSD :</p>
<pre class="language-yaml"><code>sudo ./fumagicien</code></pre>
<p style="text-align: justify;">Je fais la mise &agrave; jour de mes deux SSD et je relance le Nuc. Attention, le bon num&eacute;ro de version n'apparaitra qu'&acirc;pres le prochain red&eacute;marrage. Donc m&ecirc;me si c'est un peu fastidieux, je vous conseille de relancer le Live CD pour v&eacute;rifier. De m&ecirc;me si vous avez d'autres machines &agrave; mettre &agrave; jour, vous pouvez sauvegarder <code>fumagician</code> sur une cl&eacute; pour &eacute;viter l'&eacute;tape de l'extraction.&nbsp;</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/nuc_ssd_updat_02.png" width="600" /></p>
<p style="text-align: justify;">Il existe une autre m&eacute;thode en CLI pour les barbus, elle demandera toutefois de connecter le Live CE au r&eacute;seau si on veut &eacute;viter l'&eacute;tape de la cl&eacute; USB, mais in fine &ccedil;a revient au m&ecirc;me :</p>
<pre class="language-yaml"><code>wget https://semiconductor.samsung.com/resources/software-resources/Samsung_SSD_980_PRO_5B2QGXA7.iso
apt-get -y install gzip unzip wget cpio
mkdir /mnt/iso
sudo mount -o loop ./Samsung_SSD_980_PRO_5B2QGXA7.iso /mnt/iso/
mkdir /tmp/fwupdate
cd /tmp/fwupdate
gzip -dc /mnt/iso/initrd | cpio -idv --no-absolute-filenames
cd root/fumagician/
sudo ./fumagician</code></pre>
<p style="text-align: justify;">Voil&agrave; comment occuper (perdre) un apr&egrave;s-midi d'hiver !</p>
<p style="text-align: justify;">Attention toutefois, si vous avez cr&eacute;&eacute; un volume RAID, ce qui est discutable avec des SSD, il semblerait que vous ne puissiez les voir sans repasser le bios en AHCI.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/enjoyit.png" width="206" height="206" /></p>
<h3 style="text-align: left;">Sources</h3>
<ul>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://askubuntu.com/questions/1405963/ubuntu-22-04-failed-to-boot-on-intel-nuc-nuc9i9qnx-out-of-memory" target="_blank" rel="noopener">https://askubuntu.com/questions/1405963/ubuntu-22-04-failed-to-boot-on-intel-nuc-nuc9i9qnx-out-of-memory</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.phonandroid.com/samsung-ne-trouve-pas-de-solution-contre-la-degradation-rapide-de-ses-ssd-les-plus-performants.html" target="_blank" rel="noopener">https://www.phonandroid.com/samsung-ne-trouve-pas-de-solution-contre-la-degradation-rapide-de-ses-ssd-les-plus-performants.html</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.clubic.com/pro/entreprises/samsung/actualite-455880-samsung-publie-enfin-un-correctif-pour-ses-ssd-980-pro.html" target="_blank" rel="noopener">https://www.clubic.com/pro/entreprises/samsung/actualite-455880-samsung-publie-enfin-un-correctif-pour-ses-ssd-980-pro.html</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://semiconductor.samsung.com/resources/software-resources/Samsung_SSD_Firmware_Update_Utility_User_Manual_English.pdf" target="_blank" rel="noopener">https://semiconductor.samsung.com/resources/software-resources/Samsung_SSD_Firmware_Update_Utility_User_Manual_English.pdf</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.malekal.com/mettre-a-jour-firmware-ssd/" target="_blank" rel="noopener">https://www.malekal.com/mettre-a-jour-firmware-ssd/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://semiconductor.samsung.com/consumer-storage/support/tools/" target="_blank" rel="noopener">https://semiconductor.samsung.com/consumer-storage/support/tools/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://askubuntu.com/questions/1263336/unable-to-install-20-04-lts-on-intel-nuc-10i3fnh" target="_blank" rel="noopener">https://askubuntu.com/questions/1263336/unable-to-install-20-04-lts-on-intel-nuc-10i3fnh</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://help.ubuntu.com/rst/" target="_blank" rel="noopener">https://help.ubuntu.com/rst/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.nextinpact.com/article/68212/nuc-9-pro-nuc9vxqnx-quartz-canyon-dintel-on-y-a-installe-deux-ssd-et-geforce" target="_blank" rel="noopener">https://www.nextinpact.com/article/68212/nuc-9-pro-nuc9vxqnx-quartz-canyon-dintel-on-y-a-installe-deux-ssd-et-geforce</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.storagereview.com/review/intel-nuc-9-pro-as-an-esxi-server" target="_blank" rel="noopener">https://www.storagereview.com/review/intel-nuc-9-pro-as-an-esxi-server</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.ubackup.com/enterprise-backup/esxi-recovery-mode.html" target="_blank" rel="noopener">https://www.ubackup.com/enterprise-backup/esxi-recovery-mode.html</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://bytespeed.com/nuc-bios-uefi-shell-update/" target="_blank" rel="noopener">https://bytespeed.com/nuc-bios-uefi-shell-update/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.reddit.com/r/zfs/comments/fuqgoi/script_to_update_samsung_ssd_firmware/" target="_blank" rel="noopener">https://www.reddit.com/r/zfs/comments/fuqgoi/script_to_update_samsung_ssd_firmware/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://apple.stackexchange.com/questions/387414/ssd-firmware-upgrade-requires-iso-on-a-pendrive-how-to-make-that-bootable" target="_blank" rel="noopener">https://apple.stackexchange.com/questions/387414/ssd-firmware-upgrade-requires-iso-on-a-pendrive-how-to-make-that-bootable</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.malekal.com/mettre-a-jour-firmware-ssd/" target="_blank" rel="noopener">https://www.malekal.com/mettre-a-jour-firmware-ssd/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://blog.quindorian.org/2021/05/firmware-update-samsung-ssd-in-linux.html/" target="_blank" rel="noopener">https://blog.quindorian.org/2021/05/firmware-update-samsung-ssd-in-linux.html/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://askubuntu.com/questions/1348219/how-to-update-samsung-ssd-firmware-from-ubuntu" target="_blank" rel="noopener">https://askubuntu.com/questions/1348219/how-to-update-samsung-ssd-firmware-from-ubuntu</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.youtube.com/watch?v=mAPWugrTO5Q" target="_blank" rel="noopener">https://www.youtube.com/watch?v=mAPWugrTO5Q</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://github.com/ventoy/Ventoy/issues/550" target="_blank" rel="noopener">https://github.com/ventoy/Ventoy/issues/550</a></span></li>
</ul>
<p>&nbsp;</p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:61:"http://canaletto.fr/post/vmware-esxi-nuc9-update-ssd-firmware";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post/vmware-esxi-nuc9-update-ssd-firmware#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=9efc2b9d-524d-442f-8beb-9d9b6e866358";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:35:"dim., 12 févr. 2023 22:46:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:2:"IT";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:9:{i:0;a:5:{s:4:"data";s:7:"Samsung";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:3:"SSD";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:4:"NVMe";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:3:"ESX";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:4:"ESXi";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:5;a:5:{s:4:"data";s:6:"VMWare";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:6;a:5:{s:4:"data";s:5:"Linux";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:7;a:5:{s:4:"data";s:8:"Firmware";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:8;a:5:{s:4:"data";s:5:"NUC 9";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=9efc2b9d-524d-442f-8beb-9d9b6e866358";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=9efc2b9d-524d-442f-8beb-9d9b6e866358";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post/vmware-esxi-nuc9-update-ssd-firmware#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=9efc2b9d-524d-442f-8beb-9d9b6e866358";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:5;a:6:{s:4:"data";s:152:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:29:"Home Assistant &amp; Sirènes";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:12028:"<p style="text-align: justify;">J'ai d&eacute;j&agrave; parl&eacute; ici du syst&egrave;me d'alarme Alarmo pour Home Assistant et notamment des commandes possibles pour armer et d&eacute;sarmer le syst&egrave;me. Aujourd'hui il s'agira des sir&egrave;nes.</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/siren_heiman.png" width="300" height="300" /></p>
<p style="text-align: justify;">J'ai trois mod&egrave;les</p>
<ul style="text-align: justify;">
<li>La plus basique est juste branch&eacute;e sur une prise command&eacute;e Zigbee ondul&eacute;e. Donc un <code>switch:</code> vu en tant que <code>siren:</code>.</li>
<li>Une sir&egrave;ne Heiman qui sous ZHA d&eacute;croche r&eacute;guli&egrave;rement et que j'ai du appairer &agrave; ma seconde passerelle sous Z2M.
<ul>
<li>Sous ZHA elle &eacute;tait vue en tant que&nbsp;<code>siren:</code>.</li>
<li>Sous Z2M elle est vue en tant que rien du tout...</li>
</ul>
</li>
<li>Une sir&egrave;ne SMaBit sous Z2M &eacute;galement vue en rien du tout...</li>
</ul>
<p style="text-align: justify;">Pour commander une sir&egrave;ne via ZHA HA propose :</p>
<pre class="language-yaml"><code> - service: siren.turn_on
target:
entity_id:
- siren.heiman_sirene</code></pre>
<p style="text-align: justify;">Pour commander une sir&egrave;ne sous Z2M il faut lui envoyer le <code>payload</code> correspondant :</p>
<pre class="language-yaml"><code> - service: mqtt.publish
data:
topic: zigbee2mqtt/Sir&egrave;ne SMaBiT/set
payload: &gt;-
{"warning": {"mode": "fire", "level": "very_high", "strobe_level": "low", "strobe": "false", "strobe_duty_cycle": "10", "duration": "360"}}</code></pre>
<p style="text-align: justify;">Un peu plus compliqu&eacute; et moins facile &agrave; m&eacute;moriser, mais &ccedil;a fonctionne.</p>
<p style="text-align: justify;">Mon objectif a donc &eacute;t&eacute; de faire en sorte qu'une sir&egrave;ne Z2M soit vue par Home Assistant comme une sir&egrave;ne ZHA et ainsi pouvoir la commander par un <code>siren.turn_on</code> comme les autres... Et voici ce que &ccedil;a donne :</p>
<pre class="language-yaml"><code>mqtt:
siren:
- unique_id: heiman_sirene_1s
name: Heiman Sir&egrave;ne 1s
state_topic: "zigbee2mqtt/Heiman Sir&egrave;ne 1/set"
command_topic: "zigbee2mqtt/Heiman Sir&egrave;ne 1/set"
optimistic: false
qos: 0
retain: true
state_value_template: "{{ value_json.warning['mode'] }}"
command_template: '{"warning": {"duration": 2, "mode": "burglar", "level": "very_high", "strobe": true}}'
command_off_template: '{"warning": {"duration": 2, "mode": "stop", "level": "very_high", "strobe": true}}'
state_on: "burglar"
state_off: "stop"</code></pre>
<p style="text-align: justify;">Probl&egrave;me, car il y en a un, la sir&egrave;ne Heiman ne retourne aucun &eacute;tat sous Z2M. Il y a beaucoup d'articles &agrave; ce sujet, et l'int&eacute;gration ne semble pas vraiment termin&eacute;e. Hors dans l'activation il y a une dur&eacute;e, le principe &eacute;tant d'activer la sir&egrave;ne pour x secondes. Et donc comme elle ne retourne pas son &eacute;tat, son commutateur restera sur ON alors que le d&eacute;lais d'activation est termin&eacute; et la prochaine action n'aura aucun effet... De plus certaines sir&egrave;nes proposent plusieurs fonctions et tonalit&eacute;s (les bips de d&eacute;lais d'armement et d&eacute;sarmement par exemple).</p>
<p style="text-align: justify;">Donc contrairement &agrave; ZHA ou l'int&eacute;gration <code>siren:</code> peut g&eacute;rer tous les modes, chercher &agrave; g&eacute;rer une sir&egrave;ne Z2M en tant que <code>siren:</code> n'a pas de sens... (hormis peut &ecirc;tre de bricoler un <code>template:</code> qui en fonction de la dur&eacute;e d'activation repasserait le commutateur &agrave; off, on peut aussi le faire via une automation: mais l&agrave; &ccedil;a va alourdir la chose...).</p>
<h3 style="text-align: justify;">Alternative</h3>
<p style="text-align: justify;">S'agissant d'envoyer un <code>payload</code> &agrave; une sir&egrave;ne Z2M, ce que j'ai trouv&eacute; de plus logique est un <code>mqtt:/button:</code> et il faut donc en faire deux :</p>
<pre class="language-yaml"><code>mqtt:
button:
- unique_id: siren_heiman_1_warning
name: "Sir&egrave;ne Heiman 1 : Waraning"
command_topic: "zigbee2mqtt/Heiman Sir&egrave;ne 1/set"
payload_press: '{"warning": {"duration": 2000, "mode": "burglar", "level": "very_high", "strobe": true}}'
qos: 0
retain: false
entity_category: "config"
device_class: "restart"
- unique_id: siren_heiman_1_stopped
name: "Sir&egrave;ne Heiman 1 : Stopped"
command_topic: "zigbee2mqtt/Heiman Sir&egrave;ne 1/set"
payload_press: '{"warning": {"duration": 2, "mode": "stop", "level": "very_high", "strobe": true}}'
qos: 0
retain: false
entity_category: "config"
device_class: "restart" </code></pre>
<p style="text-align: justify;">Ou plusieurs pour g&eacute;rer les diff&eacute;rents mode de la SMaBit :</p>
<pre class="language-yaml"><code>mqtt:
button:
- unique_id: siren_smabit_armed
name: "Sir&egrave;ne SMaBit : Armed"
command_topic: "zigbee2mqtt/Sir&egrave;ne SMaBiT/set"
payload_press: '{"squawk": {"state": "system_is_armed", "level": "veryhigh", "strobe": "true"}}'
qos: 0
retain: false
entity_category: "config"
device_class: "restart"
- unique_id: siren_smabit_disarmed
name: "Sir&egrave;ne SMaBit : Disarmed"
command_topic: "zigbee2mqtt/Sir&egrave;ne SMaBiT/set"
payload_press: '{"squawk": {"state": "system_is_disarmed", "level": "veryhigh", "strobe": "true"}}'
qos: 0
retain: false
entity_category: "config"
device_class: "restart"
- unique_id: siren_smabit_warning
name: "Sir&egrave;ne SMaBit : Warning"
command_topic: "zigbee2mqtt/Sir&egrave;ne SMaBiT/set"
payload_press: '{"warning": {"mode": "fire", "level": "very_high", "strobe_level": "low", "strobe": "false", "strobe_duty_cycle": "10", "duration": "360"}}'
qos: 0
retain: false
entity_category: "config"
device_class: "restart"
- unique_id: siren_smabit_stopped
name: "Sir&egrave;ne SMaBit : Stopped"
command_topic: "zigbee2mqtt/Sir&egrave;ne SMaBiT/set"
payload_press: '{"warning": {"mode": "stop"}}'
qos: 0
retain: false
entity_category: "config"
device_class: "restart"</code></pre>
<p style="text-align: justify;">Vous l'aurez compris, il s'agit plus d'un exercice de style qu'autre chose. Mais &ccedil;a m'aura permis de comprendre comment cr&eacute;er des devices MQTT non reconnus par le <code>discovery:</code>. Merci <a href="https://ghost.canaletto.fr/author/mathieu/" target="_blank" rel="noopener">@Mathieu</a> pour ta participation !</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/siren_smabit2.jpg" width="400" height="400" /></p>
<h3 style="text-align: left;">Sources</h3>
<ul>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://community.home-assistant.io/t/outdoor-zigbee-siren-smabit-bitron-video-av2010-29a/284993" target="_blank" rel="noopener">https://community.home-assistant.io/t/outdoor-zigbee-siren-smabit-bitron-video-av2010-29a/284993</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://github.com/samuprofe/zigbee2mqtt.io/blob/master/docs/devices/AV2010_29A.md" target="_blank" rel="noopener">https://github.com/samuprofe/zigbee2mqtt.io/blob/master/docs/devices/AV2010_29A.md</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.zigbee2mqtt.io/devices/AV2010_29A.html" target="_blank" rel="noopener">https://www.zigbee2mqtt.io/devices/AV2010_29A.html</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.zigbee2mqtt.io/devices/HS2WD-E.html" target="_blank" rel="noopener">https://www.zigbee2mqtt.io/devices/HS2WD-E.html</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://community.home-assistant.io/t/migrate-siren-switch-to-new-mqtt-siren-zigbee2mqtt/509084" target="_blank" rel="noopener">https://community.home-assistant.io/t/migrate-siren-switch-to-new-mqtt-siren-zigbee2mqtt/509084</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://github.com/home-assistant/core/issues/84703" target="_blank" rel="noopener">https://github.com/home-assistant/core/issues/84703</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://github.com/home-assistant/core/issues/67735" target="_blank" rel="noopener">https://github.com/home-assistant/core/issues/67735</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://community.home-assistant.io/t/issues-setting-up-siren-heiman-hs2wd-e-with-zigbee2mqtt/520303/9" target="_blank" rel="noopener">https://community.home-assistant.io/t/issues-setting-up-siren-heiman-hs2wd-e-with-zigbee2mqtt/520303/9</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://github.com/Koenkk/zigbee2mqtt/issues/14424" target="_blank" rel="noopener">https://github.com/Koenkk/zigbee2mqtt/issues/14424</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://community.home-assistant.io/t/mqtt-json-switch/125882" target="_blank" rel="noopener">https://community.home-assistant.io/t/mqtt-json-switch/125882</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://community.home-assistant.io/t/how-to-get-value-from-mqtt-json-to-mqtt-sensor/122774" target="_blank" rel="noopener">https://community.home-assistant.io/t/how-to-get-value-from-mqtt-json-to-mqtt-sensor/122774</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://community.home-assistant.io/t/how-to-template-mqtt-sensor-json-as-entity-attributes/460875" target="_blank" rel="noopener">https://community.home-assistant.io/t/how-to-template-mqtt-sensor-json-as-entity-attributes/460875</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://community.home-assistant.io/t/mqtt-sensor-how-to-access-non-json-payload-in-value-template/311165" target="_blank" rel="noopener">https://community.home-assistant.io/t/mqtt-sensor-how-to-access-non-json-payload-in-value-template/311165</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.home-assistant.io/integrations/siren.mqtt/" target="_blank" rel="noopener">https://www.home-assistant.io/integrations/siren.mqtt/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://smarthomescene.com/reviews/heiman-zigbee-alarm-siren-hs2wd-e-review/" target="_blank" rel="noopener">https://smarthomescene.com/reviews/heiman-zigbee-alarm-siren-hs2wd-e-review/</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://github.com/Koenkk/zigbee2mqtt/issues/3365" target="_blank" rel="noopener">https://github.com/Koenkk/zigbee2mqtt/issues/3365</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://haade.fr/fr/blog/test-alarme-sirene-heiman-zigbee-3-HS2WD-E" target="_blank" rel="noopener">https://haade.fr/fr/blog/test-alarme-sirene-heiman-zigbee-3-HS2WD-E</a></span></li>
<li style="text-align: left;"><span style="font-size: 10pt;"><a href="https://www.reddit.com/r/homeassistant/comments/10ikn3t/not_able_to_get_heiman_hs2wde_siren_to_work_with/" target="_blank" rel="noopener">https://www.reddit.com/r/homeassistant/comments/10ikn3t/not_able_to_get_heiman_hs2wde_siren_to_work_with/</a></span></li>
</ul>
<p>&nbsp;</p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:51:"http://canaletto.fr/post/home-assistant-and-sirenes";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:59:"http://canaletto.fr/post/home-assistant-and-sirenes#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=7c4933bb-867f-472c-82ff-2db47cccf3ca";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:35:"sam., 11 févr. 2023 22:29:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:9:"Domotique";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:7:{i:0;a:5:{s:4:"data";s:4:"HASS";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:6:"Hassio";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:14:"Home Assistant";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:6:"Alarme";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:6:"Alarmo";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:5;a:5:{s:4:"data";s:7:"Sirène";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:6;a:5:{s:4:"data";s:4:"MQTT";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=7c4933bb-867f-472c-82ff-2db47cccf3ca";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=7c4933bb-867f-472c-82ff-2db47cccf3ca";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:59:"http://canaletto.fr/post/home-assistant-and-sirenes#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=7c4933bb-867f-472c-82ff-2db47cccf3ca";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:6;a:6:{s:4:"data";s:187:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:16:"Sony mon amour !";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:9233:"<p style="text-align: justify;">Amour d&eacute;&ccedil;u comme on le verra plus loin ! Depuis tr&egrave;s jeune j'ai toujours &eacute;t&eacute; un afficionado de la marque Sony. Et si d'aucune pourraient trouver cela d&eacute;plac&eacute;, il est des domaines ou je suis fid&egrave;le ! Cot&eacute; TV apr&egrave;s avoir eu quelques Trinitrons cathodiques c&eacute;l&egrave;bres tel le Profeel, je me suis offert jadis le premier moniteur plasma pro de la marque, qui avait du me couter un an de salaire et que je me suis r&eacute;solu r&eacute;cemment &agrave; le porter &agrave; la d&eacute;chetterie, le pauvre il trainait dans le garage depuis bient&ocirc;t 20 ans !</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/sony3.png" /></p>
<p style="text-align: justify;">Je ne vais pas vous faire la liste des &eacute;crans Sony que j'ai eu successivement, ni leur cout car &ccedil;a me d&eacute;primerait, mais juste vous parler des d&eacute;boires de mon dernier TV. Il y a un an j'ai craqu&eacute; pour le A80J, un Oled ! Un TV intelligent sous Google TV, m&ecirc;me si d'intelligence il n'a que la pub et les traqueurs que cela induit !</p>
<p style="text-align: justify;">Je consid&egrave;re Google TV / Android TV comme &eacute;tant le meilleur choix car il me permet d'installer les application qui me sont utiles, en opposition aux &eacute;cosyst&egrave;mes fragment&eacute;s de la concurrence qui ne proposent que l'essentiel bien commercial ! C'est du business, on le sait et on l'accepte car &ccedil;a nous apporte du confort.</p>
<p style="text-align: justify;">Autres points que les pseudo journalistes testeurs oublient souvent, c'est la t&eacute;l&eacute;commande et l'impl&eacute;mentation du CEC. Celles de Sony m'ont toujours satisfait alors que je d&eacute;teste certaines d'autres marques. Mais Sony est radin, et sur le A80J la t&eacute;l&eacute;commande n'est pas m&ecirc;me r&eacute;tro&eacute;clair&eacute;e ! Qu'&agrave; cela ne tienne il suffit de <a href="https://amzn.to/3kyZ6xr" target="_blank" rel="noopener">commander sur Amazon celle du A90J</a> qui elle est premium et r&eacute;tro &eacute;clair&eacute;e... Quant au CEC il a toujours &eacute;t&eacute; tr&egrave;s bien chez Sony.</p>
<p style="text-align: justify;">Je ne vais pas vous raconter ce que vaut cette TV, plusieurs sites l'ont d&eacute;j&agrave; fait plus ou moins bien. Enfin, je parle de TV, mais je ne regarde m&ecirc;me pas la t&eacute;l&eacute; et aucune antenne n'y est raccord&eacute;e. Je r&ecirc;ve d'une version moniteur !</p>
<h3 style="text-align: justify;">Domotique</h3>
<p style="text-align: justify;">Oh le gros mot ! Encore un client qui veut faire des choses louches ! Louches car je ne me plie pas &agrave; la domotique commerciale et forc&eacute;ment limitative (Amazon, Google, Apple, Tuya, etc...) mais que ma domotique est libre, Home Assistant.</p>
<p style="text-align: justify;">Et pourquoi faire ? Pas grand chose, juste inclure ce TV dans me sc&eacute;narios (sc&egrave;nes). Et on va faire simple !</p>
<ul style="text-align: justify;">
<li>Play / Pause : on &eacute;teint et on rallume progressivement les &eacute;clairages comme au cin&eacute;ma.</li>
<li>On / Off : on mets sur pause la musique qui &eacute;tait diffus&eacute;e.</li>
</ul>
<p style="text-align: justify;">Ce n'est pas sorcier et tr&egrave;s simple &agrave; faire. Mais pour ca il faut pouvoir extraire les informations du TV. Ca tombe bien ce TV est reconnu sous Home Assistant par l'int&eacute;gration Bravia ou HomeKit. D&egrave;s lors on dispose des information idoines et &ccedil;a fonctionne tr&egrave;s bien, il suffit d'agir en fonction de l'&eacute;tat remont&eacute;.</p>
<p style="text-align: justify;">Mais alors il se plaint de quoi le r&acirc;leur ? Et oui il y a un "mais" !</p>
<h3 style="text-align: justify;">Consommation</h3>
<p style="text-align: justify;">Pour acc&eacute;der &agrave; ces fonctions il faut que le contr&ocirc;le &agrave; distance ou / et HomeKit soit activ&eacute;. C'est d'ailleurs le cas par d&eacute;faut. Et les ing&eacute;s de chez Sony, dont je ne doute pas des prouesses en audio / vid&eacute;o s'av&egrave;rent des br&egrave;les en r&eacute;seau ! Pour que ces fonctions soient accessibles ils laissent simplement la partie r&eacute;seau allum&eacute;e quand le t&eacute;l&eacute;viseur est en veille. Et comme leur carte r&eacute;seau doit dater du si&egrave;cle dernier (elle a du mal &agrave; accrocher le r&eacute;seau et est <span style="background-color: #fbeeb8;">limit&eacute;e &agrave; du 10/100 en 2022</span> ou on est cens&eacute;s passer de la full 4K !), <span style="background-color: #f8cac6;">elle consomme en veille pas moins de 26/28 W</span> alors que si ces fonctions sont d&eacute;sactiv&eacute;es la veille est &agrave; seulement 0.9 W.</p>
<p style="text-align: justify;">Cela pose deux constats :</p>
<ul style="text-align: justify;">
<li>Il est inacceptable qu'un TV en veille consomme 27 W en 2022 (c-a-d + ou - 50 &euro; / an).</li>
<li>Il est inacceptable que ces fonctionnalit&eacute;s soient activ&eacute;es par d&eacute;faut et induisent cette surconsommation ! Et certainement contraire aux directives europ&eacute;ennes en la mati&egrave;re. Il est en effet peu probable qu'un consommateur lambda ne pense &agrave; mesurer et d&eacute;sactiver ces fonctions.</li>
</ul>
<p style="text-align: justify;">En l'&eacute;tat il est donc inenvisageable d'utiliser ces fonctionnalit&eacute;s qui ajoutent un plus au t&eacute;l&eacute;viseur. Et il faut noter que tout pilotage par les applis standard, Chromecast, Alexa, etc pose le m&ecirc;me probl&egrave;me...</p>
<p style="text-align: justify;">Le pire &eacute;tant que si on d&eacute;sactive ces fonctions, quand on allume le t&eacute;l&eacute;viseur il mets bien trop longtemps pour accrocher le r&eacute;seau, que ce soit en Ethernet ou en WI-FI. Je sais c'est fait pour regarder la t&eacute;l&eacute; avec un r&acirc;teau sur la toiture !</p>
<h3 style="text-align: justify;">Alternative</h3>
<p style="text-align: justify;">Avant j'utilisait un LCD Sony bien plus b&ecirc;te et une NVidia Shield que je pilotait tr&egrave;s bien sans que cela ne gr&egrave;ve mon budget. Le Shield allumait le TV en CEC et tout &eacute;tait parfait. Je vais peut &ecirc;tre en racheter un, encore que mon Shield de 2015 fonctionne encore tr&egrave;s bien dans ma chambre. Un bel exemple de non obsolescence qui m&eacute;rite d'&ecirc;tre signal&eacute; !</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/nvidia1.jpg" width="400" /></p>
<h3 style="text-align: justify;">Et les autres ?</h3>
<p style="text-align: justify;">Je ne sais pas comment &ccedil;a se passe chez les autres constructeurs de TV car je ne suis pas client. On me remonte 1 &agrave; 2 W avec les options de pilotage activ&eacute;es chez Samsung ou Panasonic, mais je n'ai pas v&eacute;rifi&eacute;. Par contre j'ai un bel &eacute;levage de Sonos, et l&agrave; non plus ce n'est pas tr&egrave;s joli &agrave; voir : aucun progr&egrave;s depuis le d&eacute;but, conso identique en veille sur les anciens Play 1 et 3 et les nouveaux One (gen 1 et 2), entre 3 et 4 W voire plus de 8 &agrave; 11 W sur un AMP ou 6 W pour une Beam !</p>
<h3 style="text-align: justify;">Moralit&eacute;</h3>
<p style="text-align: justify;">La domotique n'est pas vraiment &eacute;cologique, elle cr&eacute;e un &eacute;norme talon de consommation de part son infrastructure (cam&eacute;ras, nvr, switches, micro modules et autres prise connect&eacute;es). Elle apporte plus de confort qu&rsquo;elle ne fait r&eacute;aliser des &eacute;conomies (les &eacute;conomies c&rsquo;est le bobard que racontent certains &agrave; leur compagne quand c&rsquo;est elle qui tiens les cordons de la bourse, car, h&eacute;las, la domotique reste un truc de mec, comme le BBQ, n&rsquo;en d&eacute;plaise &agrave; Sandrine).</p>
<p style="text-align: justify;">Un panneau solaire va devoir s'imposer &agrave; moi !</p>
<h3 style="text-align: justify;">Sources</h3>
<ul>
<li style="text-align: justify;"><span style="font-size: 10pt;"><a href="https://news.ycombinator.com/item?id=32888844#:~:text=Sony%20Android%20TVs%20waste%2025W,in%20Google%20Chromecast%20%7C%20Hacker%20News" target="_blank" rel="noopener">https://news.ycombinator.com/item?id=32888844#:~:text=Sony%20Android%20TVs%20waste%2025W,in%20Google%20Chromecast%20%7C%20Hacker%20News</a></span></li>
<li style="text-align: justify;"><span style="font-size: 10pt;"><a href="https://community.sony.nl/t5/android-tv/standby-mode-high-power-usage-sony-oled/td-p/2602088" target="_blank" rel="noopener">https://community.sony.nl/t5/android-tv/standby-mode-high-power-usage-sony-oled/td-p/2602088</a></span></li>
<li style="text-align: justify;"><span style="font-size: 10pt;"><a href="https://community.sony.fr/t5/televiseurs/kg65ag9-consommation-elevee-en-veille/td-p/3668543" target="_blank" rel="noopener">https://community.sony.fr/t5/televiseurs/kg65ag9-consommation-elevee-en-veille/td-p/3668543</a>&nbsp;</span></li>
</ul>
<p>&nbsp;</p>
<p style="text-align: justify;">&nbsp;</p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:39:"http://canaletto.fr/post/sony-mon-amour";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:47:"http://canaletto.fr/post/sony-mon-amour#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=7e3ff20f-6b0e-4479-b9e8-3e55638470a9";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:34:"mar., 24 janv. 2023 04:14:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:3:{i:0;a:5:{s:4:"data";s:9:"Domotique";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:7:"IP & Co";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:11:"Multimédia";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:10:{i:0;a:5:{s:4:"data";s:5:"Conso";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:7:"Energie";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:6:"Energy";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:4:"Sony";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:4:"Oled";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:5;a:5:{s:4:"data";s:6:"Plasma";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:6;a:5:{s:4:"data";s:3:"LCD";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:7;a:5:{s:4:"data";s:4:"HASS";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:8;a:5:{s:4:"data";s:14:"Home Assistant";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:9;a:5:{s:4:"data";s:13:"Nvidia Shield";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=7e3ff20f-6b0e-4479-b9e8-3e55638470a9";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=7e3ff20f-6b0e-4479-b9e8-3e55638470a9";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:47:"http://canaletto.fr/post/sony-mon-amour#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=7e3ff20f-6b0e-4479-b9e8-3e55638470a9";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:7;a:6:{s:4:"data";s:138:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:52:"Home Assistant &amp; Volets roulants, automatismes !";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:28176:"<p style="text-align: justify;">Dans un <a href="http://canaletto.fr/post/home-assistant-et-volets-roulants" target="_blank" rel="noopener">pr&eacute;c&eacute;dent article</a> je vous avait parl&eacute; de la partie mat&eacute;rielle de mes volets roulants et de leur commande via des interrupteurs et des t&eacute;l&eacute;commandes. Mais avec une installation domotique ouverte, on peut faire bien mieux !</p>
<p style="text-align: justify;">L'objectif ici sera pour chaque volet (ou groupe de volets) d'automatiser leur ouverture, position interm&eacute;diaire et fermeture en fonction de :</p>
<ul style="text-align: justify;">
<li>Le jour et la nuit</li>
<li>La temp&eacute;rature ext&eacute;rieure et int&eacute;rieure et les contraintes m&eacute;t&eacute;o (canicule, etc.)</li>
<li>La position du soleil</li>
<li>Les contraintes de vie (lever tardif, soir&eacute;e, etc...)</li>
<li>Les contraintes de pr&eacute;sence / absence plus ou moins longue (alarme et simulation de pr&eacute;sence)</li>
<li>Le d&eacute;brayage de l'automatisme afin de laisser en paix un invit&eacute; ou les enfants en vacances avec leur propres horaires et mode de vie.</li>
</ul>
<p style="text-align: justify;">Vous allez me dire tout de suite que la tache est complexe et vous aurez raison, mais pas tant que &ccedil;a car je vais m'appuyer sur le travail de <a href="https://omitech.fr/article/gestion-volets-home-assistant" target="_blank" rel="noopener">Fabien</a> qui a cr&eacute;&eacute; un superbe moteur pour g&eacute;rer tout &ccedil;a, moteur que chacun pourra adapter &agrave; ses propres besoin en lui fournissant des pr&eacute;requis (inputs, binary, etc..) qui permettront de g&eacute;rer les diff&eacute;rents conditions de positionnement. Vous trouverez les d&eacute;tails sur son blog, mais l'installation est relativement ais&eacute;e, on commence par cr&eacute;er les entit&eacute;s n&eacute;cessaires, ensuite on ajoute les BluePrint's de configuration et on termine avec un peu de yaml pour la configuration des conditions.</p>
<p style="text-align: justify;"><img src="http://canaletto.fr/image.axd?picture=/images/vr-facade.jpg" /></p>
<p style="text-align: justify;">Facile, mais &ccedil;a prends un peu de temps. Et surtout commencez par mettre sur le papier le r&eacute;sultat que vous voulez obtenir. Dans cet article je vais vous parler de ce que j'ai mis autour de son travail, plus que de son travail.&nbsp;</p>
<p style="text-align: justify;"><span style="background-color: #fbeeb8;">Avant de chercher &agrave; int&eacute;grer mes exemples, prenez le temps d'avoir une installation vraiment fonctionnelle avec les Blueprint's de Fabien.</span></p>
<p style="text-align: justify;">De base et sans rien ajouter le moteur de Fabien va permettre d'ouvrir le volet au lever de soleil et de le fermer au coucher du soleil gr&acirc;ce &agrave; l'int&eacute;gration <code>sun.sun</code>. Bon, pour faire &ccedil;a on a pas besoin d'une usine, c'est pour &ccedil;a que je vais vous montrer que son moteur permet bien d'autres choses.</p>
<h3 style="text-align: justify;">Temp&eacute;rature ext&eacute;rieure et position du soleil</h3>
<p style="text-align: justify;">Voici un exemple des plus basic de ce que j'avais fait au d&eacute;part, mais je vous conseille d'adapter la <a href="https://omitech.fr/article/donnees-calculs-index-meteorologiques-home-assistant" target="_blank" rel="noopener">version de Fabien</a> que j'ai moi m&ecirc;me adopt&eacute;e et qui permet d'aller plus loin, avec diff&eacute;rentes sources et notamment un capteur de luminosit&eacute;.</p>
<h4 style="text-align: justify;">Exemple</h4>
<p style="text-align: justify;">J'utilise les Packages et je vais commencer par cr&eacute;er deux <code>sensor:</code> en fonction de ma localisation en m'appuyant sur <code>sun.sun</code></p>
<pre class="language-yaml"><code>sensor:
- platform: template
sensors:
sunelevation:
friendly_name: "Elevation du soleil"
value_template: "{{ state_attr('sun.sun', 'elevation') }}"
sunazimuth:
friendly_name: "Azimut du soleil"
value_template: "{{ state_attr('sun.sun', 'azimuth') }}"</code></pre>
<p style="text-align: justify;">Ensuite je vais me servir de <a href="https://www.sunearthtools.com/" target="_blank" rel="noopener">ce site</a> pour trouver les bonnes valeurs et je vais cr&eacute;er 3 <code>binary_sensor:</code> avec les les valeurs basses et hautes d'azimut, ces binary passeront &agrave; ON quand le soleil tapera sur la fa&ccedil;ade concern&eacute;e. Bien sur il faudra un peu t&acirc;tonner pour trouver les bonnes valeurs et les ajuster.</p>
<pre class="language-yaml"><code>binary_sensor:
- platform: threshold
name: "Soleil : Ouest"
upper: 170
lower: 80
entity_id: sensor.sunazimuth
- platform: threshold
name: "Soleil : Sud"
upper: 270
lower: 100
entity_id: sensor.sunazimuth
- platform: threshold
name: "Soleil : Est"
upper: 299
lower: 260
entity_id: sensor.sunazimuth</code></pre>
<p style="text-align: justify;">Et pour terminer je vais cr&eacute;er un dernier <code>binary_sensor:</code> pour d&eacute;terminer les conditions m&eacute;t&eacute;o. Il s'appuie sur les infos de l'int&eacute;gration M&eacute;t&eacute;o France (ou avec un capteur de luminosit&eacute; en s'appuyant sur l'<a href="https://omitech.fr/article/exemple-gestion-volet-roulant-cuisine" target="_blank" rel="noopener">exemple de Fabien</a>) et d&eacute;pend de seuils d&eacute;finis dans des <code>input_number:</code> qui pourront s'afficher dans Lovelace. (je n'ai pas pris en compte la temp&eacute;rature int&eacute;rieure pour l'instant).</p>
<pre class="language-yaml"><code>binary_sensor:
- platform: template
sensors:
vr_sun_hot:
device_class: heat
delay_on:
seconds: 300
delay_off:
seconds: 300
value_template: "{{states('sensor.avignon_temperature')|float(0) &gt;= states('input_number.vr_sun_hot') |float(0)
and states('sensor.avignon_cloud_cover')|float(0) &lt;= states('input_number.vr_cloud_cover')|float(0) }}"
friendly_name: "Alerte haute temp&eacute;rature"
input_number:
vr_sun_hot:
name: Seuil haute temp&eacute;rature
min: "10"
max: "40"
step: "1"
unit_of_measurement: "&deg;"
icon: mdi:sun-thermometer-outline
vr_cloud_cover:
name: Seuil couverture nuageuse
min: "0"
max: "100"
step: "5"
unit_of_measurement: "%"
icon: mdi:cloud-lock-outline </code></pre>
<p style="text-align: justify;">Et voici le travail :</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/vr_auto_01.png" width="400" /></p>
<h4 style="text-align: justify;">Exploitation</h4>
<p>Vous aurez remarqu&eacute; que j'ai deux seuils. Il y aura donc deux conditions possibles dans le <code>choose:</code> de l'automation de positionnement qui exploite les Blueprint's de Fabien. On retrouve dans l'ordre :</p>
<ol>
<li>La ou les conditions (and), ici la temp&eacute;rature est hot et le soleil au sud.</li>
<li>La s&eacute;quence de services &agrave; lancer :
<ol>
<li>Je positionne le volet dans un <code>input_number:</code>&nbsp;&agrave; partir d'un <code>input_number:</code> de pr&eacute;r&eacute;glage.</li>
<li>A des fin de debug je note la derni&egrave;re condition utilis&eacute;e et la position du volet dans un <code>input_text:</code> que je peux afficher dans Lovelace</li>
</ol>
</li>
</ol>
<pre class="language-yaml"><code> - conditions:
- condition: state
entity_id: binary_sensor.vr_sun_hot
state: "on"
- condition: state
entity_id: binary_sensor.soleil_sud
state: "on"
sequence:
- service: input_number.set_value
target:
entity_id: input_number.vr_cuisine_planned_position
data:
value: "{{ states('input_number.vr_global_position_sun_alert') }}"
- service: input_text.set_value
target:
entity_id: input_text.vr_cuisine_condition
data:
value: "Condition : Ensoleillement excessif - {{ states('input_number.vr_global_position_sun_alert') }} %"</code></pre>
<p style="text-align: justify;"><span style="background-color: #fbeeb8;"><strong>Attention :</strong> Dans un <code>choose:</code> l'ordre de priorit&eacute; des diff&eacute;rentes conditions est important. Il y a aussi une option par d&eacute;faut si aucune des conditions n'est valide mais que l'automation est tout de m&ecirc;me d&eacute;clench&eacute;e. On placera donc en premier celles qui doivent prendre le dessus, par exemple la condition issue de l'activation de l'alarme sera en premier car il est &eacute;vident que l'on se moque de position du soleil si on est en voyage et que la maison est ferm&eacute;e. </span></p>
<p style="text-align: justify;">Cela n'emp&ecirc;chera &eacute;ventuellement pas une solution de simulation de pr&eacute;sence qui agirait sur les volets de fonctionner. Je suis en train de tester cette <a href="https://github.com/slashback100/presence_simulation" target="_blank" rel="noopener">int&eacute;gration</a>, attention &agrave; bien valider avant de partir en vacances...</p>
<h3 style="text-align: justify;">Contraintes de vie</h3>
<p style="text-align: justify;"><strong>R&eacute;veil</strong></p>
<p style="text-align: justify;">Ici c'est au petit bonheur de chacun. En ce qui me concerne je n'ai pas d'horaires r&eacute;guliers et je suis un l&egrave;ve tard. J'ai donc cr&eacute;&eacute; un script qui se d&eacute;roule quand je dis bonjour (ou bonne nuit) &agrave; Alexa ou que j'appuis simplement sur un bouton de t&eacute;l&eacute;commande. Ce script va entre autres choses faire un push, si je suis pr&eacute;sent dans la maison, sur un <code>input_button:</code> que je vais utiliser ici pour entrouvrir le volet de ma chambre et de la baie du s&eacute;jour (une baie vitr&eacute;e coulissante s'ouvre tr&egrave;s facilement si elle n'est pas prot&eacute;g&eacute;e, je vais donc &eacute;viter d'ouvrir son volet quand je dors). On a donc deux <code>input_button:</code> :<code></code></p>
<pre class="language-yaml"><code>input_button:
lionel_up:
name: Je me l&egrave;ve
icon: mdi:human-greeting-variant
lionel_down:
name: Je me couche
icon: mdi:bed</code></pre>
<p>La condition correspondant au r&eacute;veil (la position du volet est stock&eacute;e dans un <code>input_number:</code> afin d'&ecirc;tre facilement ajust&eacute;e depuis l'interface)</p>
<pre class="language-yaml"><code> - conditions:
- "{{ as_timestamp(states('input_button.lionel_up'))|timestamp_custom('%H:%M', true) == states('sensor.time') }}"
sequence:
- service: input_number.set_value
target:
entity_id: input_number.vr_lionel_planned_position
data:
value: "{{ states('input_number.vr_global_position_reveil') }}"</code></pre>
<p>Il faut bien sur ne pas oublier de d&eacute;clarer <code>input_button:</code> dans le BluePrint correspondant au volet (en condition imm&eacute;diate) et l'actionner dans le script ou l'interface :</p>
<pre class="language-yaml"><code> - service: input_button.press
target:
entity_id: input_button.lionel_up</code></pre>
<p style="text-align: justify;">Et pour ce volet je vais modifier l'action par d&eacute;faut d'ouverture dans l'automation afin qu'il ne se passe rien avant 13 heures... mais &eacute;galement rien si le volet est d&eacute;j&agrave; un peu ouvert par une condition fugitive (button.press).</p>
<pre class="language-yaml"><code> - conditions:
- condition: numeric_state # On ouvre le volet si le soleil est au dessus de l'horizon
entity_id: sun.sun
attribute: elevation
above: 0
- condition: time
after: "13:00:00"
- condition: state
entity_id: cover.vr_baie
state: "closed"</code></pre>
<p><strong>Soir&eacute;e</strong></p>
<p style="text-align: justify;">En soir&eacute;e, surtout en &eacute;t&eacute;, je n'ai pas envie que les volets soient compl&egrave;tement ferm&eacute;s car c'est l'heure ou on ouvre les fen&ecirc;tres pour faire entrer un air plus frais. Je vais donc d&eacute;finir un <code>binary-sensor:</code> correspondant &agrave; ma soir&eacute;e (merci <a href="https://omitech.fr" target="_blank" rel="noopener">Fabien</a>) :</p>
<pre class="language-yaml"><code>binary_sensor:
- platform: template
sensors:
vr_evening:
value_template: "{{ (state_attr('sun.sun', 'azimuth') | float(0.0)) &gt; 180 and (state_attr('sun.sun', 'elevation') | float(0.0)) &lt; 0 and ('12:00:00' &lt; states('sensor.time')) }}"
friendly_name: "Soir&eacute;e"</code></pre>
<p style="text-align: justify;">J'aurais pu y ajouter un <code>and</code> suppl&eacute;mentaire afin de valider la saison en me basant sur l'int&eacute;gration <strong>Season</strong>. Sauf que les saisons tout le monde sait que &ccedil;a ne veut plus dire grand chose et qu'ici depuis le d&eacute;but du mois de mail il fait plus ou moins 30&deg; en journ&eacute;e, je testerais donc un <code>input_boolean:</code> de plus pour valider cette condition (que j'aurais &eacute;galement pu valider dans le <code>binary-sensor:</code>) :</p>
<pre class="language-yaml"><code> - conditions:
- condition: state
entity_id: binary_sensor.vr_evening
state: "on"
- condition: state
entity_id: input_boolean.vr_evening
state: "on"
sequence:
- service: input_number.set_value
target:
entity_id: input_number.vr_cuisine_planned_position
data:
value: "{{ states('input_number.vr_global_position_soir') }}"
- service: input_text.set_value
target:
entity_id: input_text.vr_cuisine_condition
data:
value: "Condition : Soir&eacute;e - {{ states('input_number.vr_global_position_soir') }} %"</code></pre>
<p>On peut aussi faire la m&ecirc;me chose avec d'autres conditions et sans <code>binary_sensor:</code> et tout mettre dans les conditions...</p>
<pre class="language-yaml"><code> - conditions:
- condition: numeric_state
entity_id: sun.sun
attribute: azimuth
above: 180
- condition: numeric_state
entity_id: sun.sun
attribute: elevation
below: 0
- condition: time
after: "18:00:00"
- condition: state
entity_id: input_boolean.vr_evening
state: "on" </code></pre>
<h3 style="text-align: justify;">Pr&eacute;sence / Absence et Alarme&nbsp;</h3>
<p style="text-align: justify;">Pour ce chapitre c'est un peu plus compliqu&eacute;. J'utilise en parall&egrave;le deux syst&egrave;me. Ma centrale Visonic ind&eacute;pendante mais que je pilote dans Home Assistant et l'int&eacute;gration Alarmo. Lors de mes test je me suis aper&ccedil;u que tester uniquement l'&eacute;tat "armed" pouvait conduire &agrave; des surprises. Lors de l'armement et surtout le d&eacute;clenchement d'une alarme (possiblement fausse) l'&eacute;tat de <code>alarm_control_panel:</code> passe par des phases successives peu simple &agrave; g&eacute;rer, et &ccedil;a peu conduire &agrave; une ouverture des volets non souhait&eacute;e.</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/vr_auto_02.png" width="400" /></p>
<p style="text-align: justify;">Chez moi j'ai diff&eacute;rentes possibilit&eacute;s pour armer ces deux syst&egrave;mes (t&eacute;l&eacute;commande, code, tag), je vais donc me servir d'Alarmo qui permet de lancer un script selon un &eacute;tat pour basculer un <code>input_boolean:</code> qui me servira dans la condition imm&eacute;diates du volet :</p>
<ul>
<li style="text-align: justify;">On passe tous les volets en mode automatique (certains auraient pu &ecirc;tres d&eacute;bray&eacute;s comme on le verra plus loin)</li>
<li style="text-align: justify;">On active <code>l'input_boolean:</code> qui va nous servir dans la condition de l'automatisation</li>
<li style="text-align: justify;">Sur le mode Vacances (absence de longue dur&eacute;e) je rebascule tous les volets en mode manuel. Une s&eacute;curit&eacute; de plus afin d'emp&ecirc;cher qu'ils soient ouverts par erreur.</li>
</ul>
<pre class="language-yaml"><code>script:
alarmo_after_arm:
alias: Alarmo - after Arm
sequence:
- if:
then:
- service: input_select.select_option
target:
entity_id:
- input_select.vr_cuisine_immediate
- input_select.vr_marie_immediate
- input_select.vr_baie_immediate
- input_select.vr_sejour_immediate
- input_select.vr_antoine_immediate
- input_select.vr_lionel_immediate
data:
option: Automatique
- if: "{{ is_state('alarm_control_panel.alarmo', 'armed_away') }}"
then:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.alarmo_armed_away
- if: "{{ is_state('alarm_control_panel.alarmo', 'armed_vacation') }}"
then:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.alarmo_armed_vacation
- delay: "00:02:30"
- service: input_select.select_option
target:
entity_id:
- input_select.vr_cuisine_immediate
- input_select.vr_marie_immediate
- input_select.vr_baie_immediate
- input_select.vr_sejour_immediate
- input_select.vr_antoine_immediate
- input_select.vr_lionel_immediate
data:
option: Manuel
- if: "{{ is_state('alarm_control_panel.alarmo', 'armed_home') }}"
then:
- service: input_boolean.turn_on
target:
entity_id: input_boolean.alarmo_armed_home
entity_id: input_boolean.alarmo_armed_away</code></pre>
<p style="text-align: justify;">Et au retour sur le disarm :</p>
<ul>
<li style="text-align: justify;">Je repasse les <code>input_boolean:</code> &agrave; off</li>
<li style="text-align: justify;">Je repasse tous les volets en automatique afin que les conditions courantes prennent effet.</li>
<li style="text-align: justify;">Et si ma fille ou mon fils sont pr&eacute;sents pr&eacute;sente je vais basculer leurs volets en manuel afin qu'ils soient g&eacute;r&eacute;s comme bon leur semble. Mais j'attend un peu afin que l'automatisation du volet&nbsp; le place dans la position de la contrainte en cours.</li>
</ul>
<pre class="language-yaml"><code>script:
alarmo_after_to_disarm:
alias: Alarmo - after Disarm
sequence:
- if:
then:
- service: input_boolean.turn_off
target:
entity_id:
- input_boolean.alarmo_armed_away
- input_boolean.alarmo_armed_vacation
- input_boolean.alarmo_armed_home
- service: input_select.select_option
target:
entity_id:
- input_select.vr_cuisine_immediate
- input_select.vr_marie_immediate
- input_select.vr_baie_immediate
- input_select.vr_sejour_immediate
- input_select.vr_antoine_immediate
- input_select.vr_lionel_immediate
data:
option: Automatique
- if: "{{ is_state('input_boolean.presence_marie', 'on') }}"
then:
- delay: "00:01:30"
- service: input_select.select_option
target:
entity_id:
- input_select.vr_marie_immediate
data:
option: Manuel
- if: "{{ is_state('input_boolean.presence_antoine', 'on') }}"
then:
- delay: "00:01:30"
- service: input_select.select_option
target:
entity_id:
- input_select.vr_antoine_immediate
data:
option: Manuel</code></pre>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/vr_auto_03.png" width="400" /></p>
<p style="text-align: justify;">Ensuite il me reste qu'&agrave; configurer la contrainte dans l'automatisation, et surtout de la placer en priorit&eacute; (la premi&egrave;re).</p>
<pre class="language-yaml"><code> - conditions:
- condition: state
entity_id: input_boolean.alarmo_armed_away
state: "on"
sequence:
- service: input_number.set_value
target:
entity_id: input_number.vr_cuisine_planned_position
data:
value: "{{ states('input_number.vr_global_position_alarm') }}"
- service: input_text.set_value
target:
entity_id: input_text.vr_cuisine_condition
data:
value: "Condition : Alarmo Away - {{ states('input_number.vr_global_position_alarm') }} %"</code></pre>
<p style="text-align: justify;">J'ai deux positions d'alarme, ARMED_AWAY et ARMED_VACATION. J'utilise la premi&egrave;re quand que pars quelques heures, &ccedil;a laisse certains volets entrouverts afin de simuler une pr&eacute;sence avec d'autres artifices, et la seconde pour une fermeture totale.</p>
<h3 style="text-align: justify;">Le d&eacute;brayage</h3>
<p style="text-align: justify;">Les automatismes c'est bien, mais si mes enfants sont ici en vacances ou des amis occupent leurs chambres, je ne voudrais pas qu'un automatisme les sortent du lit &agrave; l'aube. Pour mes enfants qui disposent de l'application Home Assistant je pourrait imaginer un automatisme, mais on va oublier et leur laisser de la libert&eacute;, d'autant plus que s'agissant d'amis je ne vais pas leur imposer ma domotique.</p>
<p style="text-align: justify;">Par contre je dispose facilement de leur date de d&eacute;part et d'arriv&eacute;e et une automation bascule d&eacute;j&agrave; un input_boolean: qui sert au chauffage. Je vais donc m'en servir pour passer le volet de leur chambre en mode manuel :</p>
<pre class="language-yaml"><code>automation:
- id: a800970c-9bf4-48ce-aedg-a67c29093eb3
description: Change vr_marie_immediate
alias: VR Global - Change mode VR Marie
mode: restart
trigger:
- platform: state
entity_id: input_boolean.presence_marie
action:
- choose:
- conditions:
- condition: state
entity_id: input_boolean.presence_marie
state: "on"
sequence:
- service: input_select.select_option
target:
entity_id:
- input_select.vr_marie_immediate
data:
option: Manuel
- conditions:
- condition: state
entity_id: input_boolean.presence_marie
state: "off"
sequence:
- service: input_select.select_option
target:
entity_id:
- input_select.vr_marie_immediate
data:
option: Automatique</code></pre>
<p style="text-align: justify;">Enfants et amis commanderont donc leur volets avec la petite t&eacute;l&eacute;commande de leur chambre.</p>
<h3 style="text-align: justify;">Suspension</h3>
<p style="text-align: justify;">Si vous &ecirc;tes arriv&eacute;s l&agrave; et que vous avez lors de la configuration des BluePrint's la dur&eacute;e de suspension vous vous demandez peut &ecirc;tre de quoi il s'agit. En fait configure l&agrave; le dur&eacute;e pendant laquelle l'automatisme sera suspendu. Imaginons que celle ci est r&eacute;gl&eacute;e du 60 minutes, il est 13 heures, le soleil frappe fort et vous d&eacute;cidez de d&eacute;jeuner dans le cuisine. Vous remontez le volet avec la t&eacute;l&eacute;commande (ou l'application), il restera lev&eacute; le temps de manger (suspension de 60 minutes) et l'automatisme reprendra le dessus ensuite avec la contrainte idoine... Magique !</p>
<h3 style="text-align: justify;">Conclusion</h3>
<p style="text-align: justify;">Tout cela m'a pris un peu de temps et j'ai servi de cobaye dans la phase de test d'appr&eacute;hension de la solution que Fabien viens de mettre &agrave; disposition. Quand vous aurez parfaitement valid&eacute; le fonctionnement souhait&eacute; sur un volet pour pourrez le dupliquer sur l'ensemble des volets.</p>
<p style="text-align: justify;">Pour cela il faut :</p>
<ol>
<li style="text-align: justify;">Dupliquer le fichier qui contient les informations propres &agrave; chaque volet (mes fichiers sont <a href="https://github.com/mycanaletto/hass-canaletto/tree/main/package" target="_blank" rel="noopener">ici</a>) et changer l'<code>ID:</code> de l'automation.</li>
<li style="text-align: justify;">Rep&eacute;rer les informations des 3 BluePrint's du premier volet dans le fichier <code>/config/automations.yaml</code>, les dupliquer &agrave; la suite en changeant les informations propres &agrave; chaque volet et les <code>ID:</code> . Si vous ne le sentez pas configurez les BluePrint's individuellement &agrave; la main.</li>
<li style="text-align: justify;">V&eacute;rifier une fois de plus que tous les <code>ID:</code> ont bien &eacute;t&eacute; chang&eacute;s. J'insiste sur ce point car &ccedil;a peut &ecirc;tre la cause de bien des dysfonctionnements. Vous trouverez <a href="https://www.uuidgenerator.net/" target="_blank" rel="noopener">ici</a> un g&eacute;n&eacute;rateur d'UUID.</li>
<li style="text-align: justify;">Red&eacute;marrer Home Assistant</li>
<li style="text-align: justify;">S'armer de patience car ce que l'on imagine parfait pour le premier volet ne le sera pas n&eacute;cessairement pour les autres.</li>
<li style="text-align: justify;">Et surtout tester toutes les conditions car il sera d&eacute;sagr&eacute;able de voir s'ouvrir le volet de la chambre quand on dort (v&eacute;cu) voir certains volets ne pas se fermer sur l'alarme enclench&eacute;e quand on part que l'on est d&eacute;j&agrave; en retard (v&eacute;cu avec obligation de tous les passer en mode manuel et de les baisser &agrave; la main).</li>
</ol>
<p>Avec plaisir pour en parler, ici ou mieux sur ce fil <a href="https://forum.hacf.fr/t/gestion-des-volets-avec-home-assistant/18596" target="_blank" rel="noopener">HACF</a>.</p>
<h3>Sources</h3>
<ul>
<li><a href="https://omitech.fr/article/gestion-volets-home-assistant" target="_blank" rel="noopener">https://omitech.fr/article/gestion-volets-home-assistant</a> : L'article original sur ce moteur de gestion de volets.</li>
<li><a href="https://omitech.fr/article/exemple-gestion-volet-roulant-cuisine" target="_blank" rel="noopener">https://omitech.fr/article/exemple-gestion-volet-roulant-cuisine</a> : Un exemple de mise en oeuvre.</li>
<li><a href="https://omitech.fr/article/donnees-calculs-index-meteorologiques-home-assistant" target="_blank" rel="noopener">https://omitech.fr/article/donnees-calculs-index-meteorologiques-home-assistant</a> : L'approche de Fabien qui &agrave; l'aide de capteurs ext&eacute;rieurs va permettre de se passer totalement des donn&eacute;es M&eacute;t&eacute;o France et d'avoir une solution autonome. Je ne l'ai pas utilis&eacute;e au d&eacute;but car je n'en disposait pas.</li>
<li><a href="https://github.com/mycanaletto/hass-canaletto/tree/main/package" target="_blank" rel="noopener">https://github.com/mycanaletto/hass-canaletto/tree/main/package</a> : Pour les flemmards vous trouverez mes fichiers ici.</li>
</ul>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/enjoy2.jpg" width="212" height="142" /></p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:72:"http://canaletto.fr/post/home-assistant-and-volets-roulants-automatismes";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:80:"http://canaletto.fr/post/home-assistant-and-volets-roulants-automatismes#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=98bcb86f-d463-4d34-bdd6-ffb42c10aaca";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:34:"mar., 20 déc. 2022 13:20:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:9:"Domotique";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:5:{i:0;a:5:{s:4:"data";s:15:"Volets Roulants";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:14:"Home Assistant";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:4:"HASS";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:6:"Hassio";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:9:"BluePrint";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=98bcb86f-d463-4d34-bdd6-ffb42c10aaca";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"1";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=98bcb86f-d463-4d34-bdd6-ffb42c10aaca";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:80:"http://canaletto.fr/post/home-assistant-and-volets-roulants-automatismes#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=98bcb86f-d463-4d34-bdd6-ffb42c10aaca";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:8;a:6:{s:4:"data";s:152:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:21:"Microsoft mon amour !";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:13653:"<p style="text-align: justify;">Et non, ce n'est pas une d&eacute;claration ! J'ai longtemps &eacute;t&eacute; in love avec Microsoft, mais comme on le sait, <a href="https://www.youtube.com/watch?v=ln0VwCqMkcA" target="_blank" rel="noopener">les histoires d'amour finissent souvent mal</a> ! Blague &agrave; part, en imposant d'abord Exchange dans les entreprises, Microsoft telle une pieuvre avait bien pr&eacute;par&eacute; le terrain afin que celles-ci migrent vers Exchange Online, une des briques de la m&eacute;ga suite 365. Le r&eacute;sultat est qu'aujourd'hui la domination est quasi totale, domination que les autres acteurs ont bien du mal &agrave; concurrencer. Bien ou pas, ce n'est pas l'objet de cet article, par contre cette domination devrait imposer un devoir d'exemplarit&eacute;, et force est de constater que ce n'est pas toujours le cas, loin s'en faut !</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/exchange.png" width="250" height="160" /></p>
<p style="text-align: justify;">En devenant l'acteur majeur de la messagerie d'entreprise, Microsoft est &eacute;galement devenu un acteur majeur du spam. Face &agrave; cette d&eacute;ferlante certains acteurs moins cons&eacute;quents n'ont d'autre choix que d'imposer r&eacute;guli&egrave;rement le blocage des adresses IP de Microsoft, une pratique certes discutable, mais &eacute;galement adopt&eacute;e par Microsoft lui m&ecirc;me pour son service grand public Hotmail (comme on peut le lire <a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fanswers.microsoft.com%2Fen-us%2Foutlook_com%2Fforum%2Fall%2F550-571-unfortunately-messages-from-werent-sent%2F71763bb5-e345-47db-ade7-c1f5605d7861&amp;data=05%7C01%7Cemmanuel.kerhoz%40valor.pro%7C2128fb1a675844927b7208dad9f84851%7Ce7c4dbca5a8147f49bdc2e2add8f6027%7C0%7C0%7C638061958640364822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C5000%7C%7C%7C&amp;sdata=guXtzZeWN4VfkT%2BC1tLPeM5uIHWydrI95jHpQvXN2DY%3D&amp;reserved=0" target="_blank" rel="noopener">1</a> | <a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fanswers.microsoft.com%2Fen-us%2Foutlook_com%2Fforum%2Fall%2Fhotmailoutlook-block-list-s3140-blocks-all-new%2F699f3a56-406e-4804-97e2-cbe23b9bb01c%3Fpage%3D8&amp;data=05%7C01%7Cemmanuel.kerhoz%40valor.pro%7C2128fb1a675844927b7208dad9f84851%7Ce7c4dbca5a8147f49bdc2e2add8f6027%7C0%7C0%7C638061958640364822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C5000%7C%7C%7C&amp;sdata=gd7zvN4PM1jPIJyn912kwvG77Gi03eA7Qr0RIhx7bl8%3D&amp;reserved=0" target="_blank" rel="noopener">2</a> | <a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fsendersupport.olc.protection.outlook.com%2Fsnds%2Findex.aspx&amp;data=05%7C01%7Cemmanuel.kerhoz%40valor.pro%7C2128fb1a675844927b7208dad9f84851%7Ce7c4dbca5a8147f49bdc2e2add8f6027%7C0%7C0%7C638061958640364822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C5000%7C%7C%7C&amp;sdata=ltkjQTslssC%2Bi9uKY8j22IKo4WSLF%2B74zI0EQZzat%2Bc%3D&amp;reserved=0" target="_blank" rel="noopener">3</a> )</p>
<p style="text-align: justify;">Dans la pratique on se retrouve avec une messagerie professionnelle incapable d'envoyer des messages vers certaines destinations, @free.fr et @orange.fr par exemple, mais pas que. La situation peut se d&eacute;bloquer toute seule et alors les messages prennent du retard, ou sont simplement renvoy&eacute;s &agrave; l'exp&eacute;diteur via un NDR.</p>
<p style="text-align: justify;">L'un de nos coll&egrave;gue, <a href="https://twitter.com/marcolanie" target="_blank" rel="noopener">Marc</a>, a eu l'opportunit&eacute; d&rsquo;&eacute;changer avec le responsable de la messagerie chez Free et il lui a pos&eacute; la question :</p>
<p style="padding-left: 40px; text-align: justify;">Pensez vous qu&rsquo;il puisse &ecirc;tre envisageable d&rsquo;exploiter d&rsquo;autres m&eacute;canismes permettant un filtrage avec une granularit&eacute; plus fine (genre trio DKIM, SPF, DMARC) ?</p>
<ul style="text-align: justify;">
<li style="list-style-type: none;">
<ul style="list-style-type: square;">
<li style="text-align: left;"><em>Non, pas &agrave; ce jour et probablement pas dans un futur proche.</em></li>
<li style="text-align: left;"><em>Le premier probl&egrave;me est que la situation dans laquelle vous &ecirc;tes ne concerne qu'Office365 et aucun autre h&eacute;bergeur de messagerie. Il y a bien des probl&egrave;mes avec Gmail mais les solutions techniques mises en place chez eux n'ont rien &agrave; voir avec celles d'Office365 et les dommages collat&eacute;raux en sont drastiquement r&eacute;duits.</em></li>
<li style="text-align: left;"><em>Le second probl&egrave;me est que si nous devions basculer sur une r&eacute;putation par domaine en nous basant sur les signatures DKIM, il nous faudrait &eacute;galement prendre en compte les sceaux ARC (signature de l'interm&eacute;diaire technique) et qu'ici, il y a un sceau ARC sur microsoft.com sur les mails sortant d'Office365 et qu'il y a un risque cons&eacute;quent pour que ce soit toute la plateforme Office365 qui se retrouve bloqu&eacute;e.</em></li>
<li style="text-align: left;"><em>Le troisi&egrave;me probl&egrave;me est que nous avons pu constater ces derni&egrave;res ann&eacute;es des campagnes de spams exp&eacute;di&eacute;es au travers de comptes compromis. Sur certaines journ&eacute;es en d&eacute;cembre dernier, c'est plus de 1500 domaines qui participaient ainsi aux envois rien que pour Office365. Il est d&eacute;licat de mettre en place une whiteliste concernant un domaine ou un compte car cela revient &agrave; retirer toutes nos protections alors que nous g&eacute;rons pas ce domaine ou ce compte.</em></li>
</ul>
</li>
</ul>
<p style="text-align: justify;">Dans ces conditions et puisque Microsoft ne r&eacute;agit pas plus, il faut trouver un contournement qui va nous permettre de rerouter les messages destin&eacute;s aux domaines qui pratiquent de tels blocages. D&rsquo;aucuns diront que continuer &agrave; utiliser en 2022 un compte de messagerie chez un FAI n&rsquo;est pas une bonne id&eacute;e, mais peu importe, dans le cadre d&rsquo;une relation commerciale on ne commence pas par expliquer la vie au client, mais &agrave; entretenir la relation avec lui et ainsi lui apporter des solution viable.&nbsp;<strong>On est tous d'accord, on ne devrait pas avoir &agrave; apporter une telle solution !</strong></p>
<h3 style="text-align: justify;">Contournement</h3>
<p style="text-align: justify;">Sur Microsoft 365, Exchange Online plus pr&eacute;cis&eacute;ment, nous allons utiliser une r&egrave;gle et un connecteur pour d&eacute;router les messages destin&eacute;s au domaine <code>free.fr</code>&nbsp; et <code>orange.fr</code> vers un serveur SMTP externe qui va servir de relais. S&rsquo;il existe bien des services de relai SMTP sur Internet, ces services n&eacute;cessitent soit une authentification, soit une restriction sur une adresse IP. Probl&egrave;me, il n&rsquo;est pas possible de s&rsquo;authentifier sur un connecteur sortant, et Microsoft utilise une multitude d&rsquo;adresses IP sur ses serveurs SMTP.</p>
<pre class="language-yaml"><code>*.protection.outlook.com : 40.92.0.0/15, 40.107.0.0/16, 52.100.0.0/14, 52.238.78.88/32, 104.47.0.0/17</code></pre>
<p style="text-align: justify;">Il va donc nous falloir monter un serveur SMTP externe sur lequel on va autoriser le relai depuis ces blocks d&rsquo;adresses IP. Il existe toutefois un petit risque que d&rsquo;autres administrateurs trouvent la faille et se servent de notre serveur. Ce risque est faible, et au pire on changera notre adresse IP.</p>
<h4 style="text-align: justify;">Le relai</h4>
<p style="text-align: justify;">Ou <a href="https://www.lalanguefrancaise.com/orthographe/un-relai-ou-un-relais" target="_blank" rel="noopener">relais</a>, une fois de plus les anglais font plus simple avec relay, smtp-relay. Bref, pour monter un tel serveur il existe certainement plusieurs produits possibles, pour peu que ces logiciels soient capable de g&eacute;rer de multiples plages d&rsquo;adresses IP sources &agrave; relayer. J&rsquo;ai utilis&eacute; <a href="https://www.hmailserver.com/" target="_blank" rel="noopener">HMailServer</a> sous Windows car je le connais bien, mais on doit pouvoir faire &ccedil;a sous Linux &agrave; moindre frais. Quant &agrave; la restriction au niveau des IP sources, &ccedil;a peut aussi se faire au niveau du firewall.</p>
<p style="text-align: justify;">Dans HMailServer (IP Ranges) on va d&eacute;clarer nos adresses IP autoris&eacute;s sans authentification, celle des serveur Microsoft 365 :</p>
<p style="text-align: justify;"><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/365-smtp-1.png" width="700" /></p>
<p style="text-align: justify;">On r&eacute;p&egrave;te &ccedil;a pour chaque plage d&rsquo;IP et ensuite de la m&ecirc;me fa&ccedil;on on va d&eacute;clarer nos relais autoris&eacute;s, les m&ecirc;mes IP :</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/365-smtp-2.png" width="700" /></p>
<p style="text-align: justify;">C'est un peu fastidieux et ce serait plus simple de d&eacute;clarer 107.47.0.0/17, mais ici c&rsquo;est ainsi.</p>
<p style="text-align: justify;">Ensuite on s&rsquo;assurera que notre serveur est correctement install&eacute; (il n&rsquo;accepte rien d&rsquo;autre) et est correctement d&eacute;clar&eacute; et configur&eacute; (<span style="background-color: #fbeeb8;">SPF, reverse IP, etc...</span>) pour les domaines pour lesquels il devra assurer le transit. On fait un Telnet sur mx1.free.fr afin de s&rsquo;assurer que l&rsquo;on peut bien les joindre et&nbsp; que notre IP publique n'est pas elle aussi blacklist&eacute;e.</p>
<p style="text-align: justify;">A ce stade on se connecte &agrave; l&rsquo;administration Exchange de Microsoft 365 dans laquelle on va faire en sorte que tous les mails &agrave; destination de Free et Orange devront transiter via l&rsquo;IP de notre serveur relai.</p>
<h4 style="text-align: justify;">Exchange Online</h4>
<p style="text-align: justify;">Pour ce faire on va commencer par cr&eacute;er un connecteur qui s'appliquera aux messages sortant d'Exchange Online vers ce qui s'appelle ici Organisation Partenaire :</p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/365-smtp-3.png" /></p>
<p style="text-align: justify;">Le choix suivant est important :</p>
<ol style="text-align: justify;">
<li style="text-align: justify;">Soit on d&eacute;cide que ce connecteur s'applique &agrave; tous les messages &agrave; destination de Free et Orange, auquel cas on configure simplement ces domaines. C'est la solution la plus simple pour un tenant qui ne g&egrave;re qu'un seul domaine.</li>
<li style="text-align: justify;">Soit on d&eacute;cide que ce connecteur ne s'applique qu'au messages qui ont &eacute;t&eacute; redirig&eacute;s par une r&egrave;gle. On utilisera cette option dans le cas ou on souhaite rediriger uniquement certains mails, exp&eacute;diteurs ou domaines sources, qui seront le fruit d'une r&egrave;gle &agrave; cr&eacute;er.</li>
</ol>
<p style="text-align: justify;">Ensuite se pose la question de la validation du connecteur ou l'on utilisera une adresse @free.fr par exemple. Dans la pratique valid&eacute; ou pas le connecteur fonctionne tout de m&ecirc;me....</p>
<p style="text-align: justify;">Si l'on a fait le choix 2 il va nous falloir cr&eacute;er une r&egrave;gle pour que cela fonctionne. Dans cette r&egrave;gle on va demander &agrave; ce que :</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">le destinataire soit sur le domaine free.fr</li>
<li style="text-align: justify;">le domaine de l'exp&eacute;diteur</li>
<li style="text-align: justify;">Et enfin que ce trafic transite via le connecteur pr&eacute;c&eacute;demment cr&eacute;&eacute;.</li>
</ul>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/365-smtp-4.png" /></p>
<p style="text-align: justify;">Cela va nous permettre de ne d&eacute;router vers notre MTA premise uniquement les domaines sources qui y seront configur&eacute;s. Ce cas est sp&eacute;cifique &agrave; des tenant "partag&eacute;s" ou plusieurs domaines coexistent, mais cela peut &eacute;galement permettre d'utiliser plusieurs serveurs relais en fonction des domaines sources.</p>
<p style="text-align: justify;">Il est bien sur possible de faire ceci en PowerShell, vous trouverez les d&eacute;tails dans cet <a href="https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmymicrosoftexchange.wordpress.com%2F2017%2F04%2F06%2Foffice-365-outbound-conditional-per-source-domain-mail-flow-routing%2F&amp;data=05%7C01%7Cemmanuel.kerhoz%40valor.pro%7C2128fb1a675844927b7208dad9f84851%7Ce7c4dbca5a8147f49bdc2e2add8f6027%7C0%7C0%7C638061958640364822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C5000%7C%7C%7C&amp;sdata=qCmjd7Yur5ZUVxwL%2BWqKS8Ds3Yge%2FETQAAcjpTy3BSg%3D&amp;reserved=0" target="_blank" rel="noopener">excellent article</a>.</p>
<p style="text-align: justify;"><img style="display: block; margin-left: auto; margin-right: auto;" src="http://canaletto.fr/image.axd?picture=/images/enjoyit.png" width="283" height="283" /></p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:44:"http://canaletto.fr/post/microsoft-mon-amour";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:52:"http://canaletto.fr/post/microsoft-mon-amour#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=a0cc763c-9ef6-4048-8555-00a72fb42b20";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:34:"sam., 10 déc. 2022 17:25:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:2:"IT";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:7:{i:0;a:5:{s:4:"data";s:8:"Exchange";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:15:"Exchange Online";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:9:"Microsoft";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:13:"Microsoft 365";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:4;a:5:{s:4:"data";s:10:"Office 365";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:5;a:5:{s:4:"data";s:4:"SMTP";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:6;a:5:{s:4:"data";s:10:"Relay-SMTP";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=a0cc763c-9ef6-4048-8555-00a72fb42b20";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=a0cc763c-9ef6-4048-8555-00a72fb42b20";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:52:"http://canaletto.fr/post/microsoft-mon-amour#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=a0cc763c-9ef6-4048-8555-00a72fb42b20";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}i:9;a:6:{s:4:"data";s:131:"
";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";s:5:"child";a:7:{s:0:"";a:7:{s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:22:"Synology mon amour....";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:11:"description";a:1:{i:0;a:5:{s:4:"data";s:16844:"<p style="text-align: justify;">J'utilise des NAS Synology &agrave; titre professionnel depuis plus de 10 ans avec une plut&ocirc;t bonne exp&eacute;rience. J'en ai par exemple de gros qui fonctionnent encore tr&egrave;s bien mais par exemple un RS3411xs de 2011 m&eacute;rite d'&ecirc;tre chang&eacute; pr&eacute;ventivement...</p>
<p style="text-align: justify;">Je commande donc un RS3621RPxs et 6 disques Western Digital Ultrastar HC530, un mod&egrave;le que j'avais utilis&eacute; avec succ&egrave;s il y a deux mois dans un RS820RP+. Disque de classe entreprise. Et l&agrave; c'est le flop, dans ce dernier NAS il apparaissent comme disques non v&eacute;rifi&eacute;s et impossible de les monter en SHR, alors que ce disque est compatible avec le RS820RP+ !</p>
<p style="text-align: center;"><img src="http://canaletto.fr/image.axd?picture=/images/nas1.png" /></p>
<p style="text-align: justify;">Me voici donc partit &agrave; la recherche d'informations, le constat est des plus simples et probablement surtout mercantile. Synology vend maintenant ses propres disques en apposant leur &eacute;tiquette sur des disques Toshiba, et les disques concurrents encore pr&eacute;sent dans les listes de compatibilit&eacute; sont de plus en plus rares. Rien de bien neuf sous le soleil, HPE, Dell et d'autres ont les m&ecirc;mes pratiques. Saut que Synology nous avait d'une part habitu&eacute; &agrave; pouvoir utiliser n'importe quel disque, le credo des fabricants de NAS, et surtout que les disques estampill&eacute;s Synology sont peu disponibles et coutent souvent jusqu'&agrave; 30/40 % plus cher. Scandaleux, et les groupes d'utilisateurs ne se privent pas pour le dire et orienter les clients vers d'autres solutions.</p>
<p style="text-align: justify;">Bref, j'ai donc 6 disque de 16 TO sur les bras. On va voir qu'il existe des contournements, mais pour des questions l&eacute;gales et de responsabilit&eacute; vis &agrave; vis de mon client, je ne peux pas me permettre d'utiliser ces disque en production sensible. Donc Synology &agrave; gagn&eacute;, et je repasse une commande de 6 disques Synology que je vais monter en stockage de VM. Quant aux 6 premiers je vais les utiliser dans un second groupe d&eacute;di&eacute; &agrave; des sauvegardes secondaires en utilisant un contournement.</p>
<h3 style="text-align: justify;">Synology</h3>
<p style="text-align: justify;">Dans la terminologie de Synology, il existe 3 classes de disques :</p>
<ul style="text-align: justify;">
<li><strong>Compatible : </strong>Les disques compatibles ont &eacute;t&eacute; test&eacute;s par Synology et sont certifi&eacute;s pour fonctionner sans limitation.</li>
<li><strong>Incompatible :</strong> les disques incompatibles sont &laquo; mis sur liste noire &raquo; par Synology et ne peuvent pas &ecirc;tre utilis&eacute;s (les disques SMR sont inclus dans ce lot). Rien que du normal.</li>
<li><strong>Non v&eacute;rifi&eacute; :</strong> un disque qui n'a pas &eacute;t&eacute; test&eacute; par Synology est d&eacute;fini comme un lecteur non v&eacute;rifi&eacute;. Ca ne veut pas dire qu'il n'est pas 100% compatible, et ici c'est bien plus contestable.</li>
</ul>
<p style="text-align: justify;">Les disques non v&eacute;rifi&eacute;s sont utilisables dans un &eacute;tat non pris en charge avec les contraintes suivantes :</p>
<ul style="text-align: justify;">
<li>L'&eacute;tat d'un disque non v&eacute;rifi&eacute; peut appara&icirc;tre comme <em><strong>non v&eacute;rifi&eacute;</strong></em>&nbsp;dans le gestionnaire de stockage de DSM.</li>
<li>Des avertissements s'afficheront lors de la s&eacute;lection de lecteurs non v&eacute;rifi&eacute;s pour cr&eacute;er un pool de stockage.</li>
<li>Il est parfois impossible de cr&eacute;er des volumes de type SHR avec des disques non v&eacute;rifi&eacute;s.</li>
<li>Les pools de stockage contenant des lecteurs non v&eacute;rifi&eacute;s peuvent afficher un &eacute;tat de danger pouvant faire peur.</li>
<li>DSM peut envoyer des notifications d'avertissement lorsque des lecteurs non v&eacute;rifi&eacute;s sont en cours d'utilisation.</li>
<li>Les informations sur le lecteur telles que l'&eacute;tat de l'allocation, le nombre de secteurs d&eacute;fectueux, la temp&eacute;rature, le num&eacute;ro de s&eacute;rie, 4K natif peuvent ne pas &ecirc;tre affich&eacute;es.</li>
<li>La prise en charge de Synology sera limit&eacute;e si le probl&egrave;me de prise en charge peut &ecirc;tre li&eacute; au lecteur non v&eacute;rifi&eacute; (la d&eacute;cision de refuser la prise en charge reste &agrave; la discr&eacute;tion de Synology)</li>
<li>L'utilisation de disques non v&eacute;rifi&eacute;s n'a aucun effet sur la garantie mat&eacute;rielle de Synology</li>
</ul>
<p>Bien sur cette liste n'est pas exhaustive et malheureusement Synology est rest&eacute; vague sur le fonctionnement de leur classification de disques et de SSD. Par exemple&hellip;</p>
<ul>
<li>Les disques approuv&eacute;s comme <strong><em>compatibles</em></strong> pour un mod&egrave;le de NAS peuvent &ecirc;tre <em><strong>non v&eacute;rifi&eacute;s</strong></em> pour un autre mod&egrave;le.</li>
<li>Les disques approuv&eacute;s comme <em><strong>compatibles</strong></em> peuvent voir leur classification chang&eacute;e en <strong><em>incompatible</em></strong> ou <em><strong>non v&eacute;rifi&eacute;</strong></em> sans pr&eacute;avis par Synology.</li>
<li>La compatibilit&eacute; du lecteur est li&eacute;e &agrave; la version du micrologiciel du lecteur.</li>
<li>Le test des disques nouvellement sortis est souvent retard&eacute; de plusieurs mois.</li>
<li>Le r&eacute;sultat de ces classifications de disques est que l'achat de disques <em><strong>c</strong><strong>ompatibles</strong></em> est souvent limit&eacute; &agrave; <span style="color: #ecf0f1;">des</span> disques rares dans le commerce, avec des micrologiciels obsol&egrave;tes, qui sont soit indisponibles &agrave; la vente, soit en nombre insuffisant, aupr&egrave;s de fournisseurs non &eacute;prouv&eacute;s, &agrave; des co&ucirc;ts non comp&eacute;titifs.</li>
</ul>
<p>De mani&egrave;re r&eacute;aliste, un disque SATA de classe NAS/Enterprise utilisant la technologie CMR devrait convenir. Bien sur tout cela vaut pour les SSD...</p>
<h3 style="text-align: justify;">Contournements</h3>
<p style="text-align: justify;">Dans tous les cas, et quelque soient les disques utilis&eacute;s, on commence toujours par monter un volume et stresser les disques avant une mise en production, en faisant par exemple de gros transferts de donn&eacute;es pendant quelques jours... Et si &ccedil;a se passe mal on n'h&eacute;site pas &agrave; renvoyer les disques.</p>
<p style="text-align: justify;">Si &ccedil;a se passe bien on peut envisager deux contournements, l'un va faire croire que le disque a &eacute;t&eacute; v&eacute;rifi&eacute;, et l'autre que l'on ne s'occupe pas de v&eacute;rifications... Et rien ne dit que de futures mises &agrave; jour ne rendront pas ce contournement obsol&egrave;te.</p>
<p style="text-align: justify;"><span style="background-color: #e03e2d; color: #ecf0f1;"><strong>Attention :</strong> S'agissant de modifications de fichiers syst&egrave;me, vous savez et comprenez ce que vous faites, je d&eacute;cline toute forme de responsabilit&eacute;, tout comme les personnes qui ont trouv&eacute; ces hacks et les ont divulgu&eacute;s sur les forums cit&eacute;s en sources (non, ce n'es pas moi qui ait trouv&eacute; !).</span></p>
<p style="text-align: justify;">Cette mise en garde &eacute;tant pos&eacute;e, j'ai trouv&eacute; deux possibilit&eacute;s :</p>
<p style="text-align: justify;"><strong>Premi&egrave;re option, ajout du disque dans la liste de compatibilit&eacute;</strong></p>
<p style="text-align: justify;">On active SSH, on se connecte au NAS et on fait :</p>
<pre class="language-yaml"><code>sudo-i</code></pre>
<p style="text-align: justify;">Qui va vous redemander le mot de passe pour cette &eacute;l&eacute;vation. Enduite on va dans le r&eacute;pertoire idoine :</p>
<pre class="language-yaml"><code>cd /var/lib/disk-compatibility</code></pre>
<p style="text-align: justify;">Et on rep&egrave;re les fichiers <code>*_host.db</code> et <code>*_host.db.new</code> qu'il faudra &eacute;diter, par exemple dans mon cas <code>rs3621rpxs_host_v7.db</code> et <code>rs3621rpxs_host_v7.db.new</code>. Attention, tout &ccedil;a peut &eacute;voluer avec le temps et les r&eacute;visions. Avant d'&eacute;diter, je vous conseille de faire une copie de sauvegarde de l'original et de chercher les information de vos disques avec :</p>
<pre class="language-yaml"><code>sudo smartctl -i /dev/sdc</code></pre>
<p style="text-align: justify;">Qui devrait retourner quelque chose du genre !</p>
<pre class="language-yaml"><code>Model Family: Ultrastar
Device Model: WDC WUH721816ALE6L4
Serial Number: 3WJAK3BJ
LU WWN Device Id: 5 000cca 284e0faf1
Firmware Version: PCGNW232
User Capacity: 16,000,900,661,248 bytes [16.0 TB]
Sector Sizes: 512 bytes logical, 4096 bytes physical
Rotation Rate: 7200 rpm
Form Factor: 3.5 inches
Device is: In smartctl database [for details use: -P show]
ATA Version is: Unknown(0x0ffc) (unknown minor revision code: 0x009c)
SATA Version is: SATA &gt;3.2 (0x1ff), 6.0 Gb/s (current: 6.0 Gb/s)
Local Time is: Tue Oct 18 19:04:29 2022 CEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled</code></pre>
<p style="text-align: justify;">Ensuite on &eacute;dite avec VI et &ccedil;a devrait donner quelque chose de ce genre :</p>
<pre class="language-yaml"><code>{"model":"WUH721816ALE6L4","firmware":"PCGNW232","rec_intvl&rdquo;:[1]},</code></pre>
<p style="text-align: justify;">Et si on est pas sur, le mieux est d'aller lire, si on en dispose, ces informations dans un fichier pour un autre NAS ou le disque est indiqu&eacute; compatible <em>(notamment la derni&egrave;re information en fin de ligne)</em>.</p>
<p style="text-align: justify;"><strong>Seconde option, ne pas v&eacute;rifier la compatibilit&eacute;</strong></p>
<p style="text-align: justify;"><span style="background-color: #fbeeb8;"><strong>Attention :</strong> Il y a de grandes chances que cette manipulation saute lors des mises &agrave; jour. Il faut donc la refaire &agrave; chaque fois, et toujours en partant du fichier original qui contient d'autres informations qui peuvent &eacute;voluer.<em><span style="background-color: #ffffff;"> (Je viens d'en faire les frais lors de l'application de 7.1.1-42962 Update 4, mais c'est probablement le cas de chaque mise &agrave; jour).</span></em></span></p>
<p style="text-align: justify;">J'aurais tendance &agrave; pr&eacute;f&eacute;rer cette option bien plus simple. Mais &ccedil;a sous entend que nos disque soient test&eacute;s et non incompatibles. On passe toujours par SSH et on va &eacute;diter ce fichier :</p>
<pre class="language-yaml"><code>/etc.defaults/synoinfo.conf</code></pre>
<p style="text-align: justify;">Et dans ce fichier on va passer cette ligne de <code>yes</code> &agrave; <code>no</code>.</p>
<pre class="language-yaml"><code>support_disk_compatibility="no"</code></pre>
<p style="text-align: justify;">On peut bien sur &eacute;diter le fichier directement avec <a href="https://www.atmos.albany.edu/daes/atmclasses/atm350/vi_cheat_sheet.pdf" target="_blank" rel="noopener">VI</a>, mais pour ceux qui ne seraient pas &agrave; l'aise avec ce dinosaure, je conseille de commencer par faire une copie de sauvegarde de ce fichier dans un partage, de sauvegarder cette copie ailleurs et ensuite de l'&eacute;diter avec son &eacute;diteur pr&eacute;f&eacute;r&eacute;, puis d'aller remplacer le fichier original :</p>
<pre class="language-yaml"><code>sudo cp /etc.defaults/synoinfo.conf /volume2/Backups/</code></pre>
<p style="text-align: justify;">On &eacute;dite, et :</p>
<pre class="language-yaml"><code>sudo cp /volume2/Backups/synoinfo.conf /etc.defaults</code></pre>
<p style="text-align: justify;">On sauvegarde et on red&eacute;marre le NAS et nos disques ne devrait plus s'afficher en rouge. Cependant &ccedil;a ne joue pas sur les unit&eacute;s d'extension.</p>
<h3 style="text-align: justify;">Conclusion</h3>
<p style="text-align: justify;">Synology nous enfume mais ils font de bons produits et je n'ai pas envie de vous dire qu'il va falloir changer de cr&egrave;merie. D'autant plus que d'autres fabricants seront surement tent&eacute;s de faire de m&ecirc;me. Pour autant je me poserait la question lors de mes prochains investissement ou conseils.</p>
<p style="text-align: justify;">Dans l'absolu que ces avertissements soient pr&eacute;sents, pour de louables raisons, est une bonne chose. Il serait par contre raisonnable que l'utilisateur inform&eacute; puisse les supprimer, notamment quand un disque est largement reconnue par la communaut&eacute;. Mais il y a &eacute;galement les mauvaises raisons, comme pour les extensions m&eacute;moire ou une barrette Crucial &agrave; 100 &euro; fonctionnera parfaitement l&agrave; ou Synology nous en demande pr&egrave;s de 400 ! On pourrait &eacute;galement parler de <a href="https://www.synology.com/fr-fr/company/legal/Services_Data_Collection_Disclosure" target="_blank" rel="noopener">la collecte de donn&eacute;es</a>, pas pire que d'autres...</p>
<p style="text-align: justify;">Une alternative consistera &agrave; int&eacute;grer du logiciel Open Source (FreeNAS, TrueNAS, etc.) dans des serveurs recycl&eacute;s disposant d'un bon support disque (HPE par exemple) que l'on trouve &agrave; des tarifs int&eacute;ressant sur le march&eacute; du reconditionn&eacute;. Ca fait du NAS d&eacute;di&eacute; stockage pas cher et fiable. Je pr&eacute;cise stockage, car contrairement &agrave; ce que veulent nous faire croire les fabricants, il faut, &agrave; mon sens, oublier l'id&eacute;e d'installer tout et n'importe quoi sur un NAS, mais c'est l&agrave; un autre d&eacute;bat....</p>
<h3 style="text-align: justify;">Sources</h3>
<ul>
<li style="text-align: justify;"><a href="https://www.reddit.com/r/StorageReview/comments/sqs7yd/video_that_highlights_the_synology_unverified/" target="_blank" rel="noopener">https://www.reddit.com/r/StorageReview/comments/sqs7yd/video_that_highlights_the_synology_unverified/</a></li>
<li style="text-align: justify;"><a href="https://kb.synology.com/fr-fr/DSM/help/DSM/StorageManager/storage_pool_what_is_raid?version=7" target="_blank" rel="noopener">https://kb.synology.com/fr-fr/DSM/help/DSM/StorageManager/storage_pool_what_is_raid?version=7</a></li>
<li style="text-align: justify;"><a href="https://www.reddit.com/r/synology/comments/lq2f9p/dsm_7_and_disk_compatibility_list_is_synology/" target="_blank" rel="noopener">https://www.reddit.com/r/synology/comments/lq2f9p/dsm_7_and_disk_compatibility_list_is_synology/</a></li>
<li style="text-align: justify;"><a href="https://www.reddit.com/r/synology/comments/r6oa6i/howto_bypass_whitelist_drives_in_new_fsrsxs_nas/" target="_blank" rel="noopener">https://www.reddit.com/r/synology/comments/r6oa6i/howto_bypass_whitelist_drives_in_new_fsrsxs_nas/</a></li>
<li style="text-align: justify;"><a href="https://linustechtips.com/topic/1371655-synology-dsm-7-drive-lock-bypass/" target="_blank" rel="noopener">https://linustechtips.com/topic/1371655-synology-dsm-7-drive-lock-bypass/</a></li>
<li style="text-align: justify;"><a href="https://github.com/Livedeath2k/Synology-Compatibility-Hack" target="_blank" rel="noopener">https://github.com/Livedeath2k/Synology-Compatibility-Hack</a></li>
<li style="text-align: justify;"><a href="https://www.synoforum.com/threads/synology-drive-compatibility-list-vendor-lock-hack.9351/" target="_blank" rel="noopener">https://www.synoforum.com/threads/synology-drive-compatibility-list-vendor-lock-hack.9351/</a></li>
<li style="text-align: justify;"><a href="https://linustechtips.com/topic/1371655-synology-dsm-7-drive-lock-bypass/page/2/" target="_blank" rel="noopener">https://linustechtips.com/topic/1371655-synology-dsm-7-drive-lock-bypass/page/2/</a></li>
<li style="text-align: justify;"><a href="https://www.synoforum.com/threads/brand-new-drives-marked-as-failing.8944/" target="_blank" rel="noopener">https://www.synoforum.com/threads/brand-new-drives-marked-as-failing.8944/</a></li>
<li style="text-align: justify;"><a href="https://www.synoforum.com/threads/synologys-incompatibility-list-yikes.6777/page-5" target="_blank" rel="noopener">https://www.synoforum.com/threads/synologys-incompatibility-list-yikes.6777/page-5</a></li>
<li style="text-align: justify;"><a href="https://nascompares.com/guide/synology-2022-3rd-party-hard-drives-can-you-still-use-them/" target="_blank" rel="noopener">https://nascompares.com/guide/synology-2022-3rd-party-hard-drives-can-you-still-use-them/</a></li>
</ul>
<p style="text-align: justify;">&nbsp;</p>";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"link";a:1:{i:0;a:5:{s:4:"data";s:43:"http://canaletto.fr/post/synology-mon-amour";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:51:"http://canaletto.fr/post/synology-mon-amour#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"guid";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=3cced9ca-281d-43c3-8346-c2d8aa92bf3b";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:7:"pubDate";a:1:{i:0;a:5:{s:4:"data";s:33:"sam., 22 oct. 2022 17:39:00 +0200";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:8:"category";a:1:{i:0;a:5:{s:4:"data";s:2:"IT";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:34:"https://blogengine.io/schemas/tags";a:1:{s:3:"tag";a:4:{i:0;a:5:{s:4:"data";s:8:"synology";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:1;a:5:{s:4:"data";s:3:"HDD";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:2;a:5:{s:4:"data";s:3:"SSD";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}i:3;a:5:{s:4:"data";s:4:"Hack";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:1:{s:9:"publisher";a:1:{i:0;a:5:{s:4:"data";s:5:"Admin";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:52:"http://madskills.com/public/xml/rss/module/pingback/";a:2:{s:6:"server";a:1:{i:0;a:5:{s:4:"data";s:32:"http://canaletto.fr/pingback.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:6:"target";a:1:{i:0;a:5:{s:4:"data";s:69:"http://canaletto.fr/post.aspx?id=3cced9ca-281d-43c3-8346-c2d8aa92bf3b";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:38:"http://purl.org/rss/1.0/modules/slash/";a:1:{s:8:"comments";a:1:{i:0;a:5:{s:4:"data";s:1:"0";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:53:"http://madskills.com/public/xml/rss/module/trackback/";a:1:{s:4:"ping";a:1:{i:0;a:5:{s:4:"data";s:73:"http://canaletto.fr/trackback.axd?id=3cced9ca-281d-43c3-8346-c2d8aa92bf3b";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:36:"http://wellformedweb.org/CommentAPI/";a:2:{s:7:"comment";a:1:{i:0;a:5:{s:4:"data";s:51:"http://canaletto.fr/post/synology-mon-amour#comment";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:10:"commentRss";a:1:{i:0;a:5:{s:4:"data";s:77:"http://canaletto.fr/syndication.axd?post=3cced9ca-281d-43c3-8346-c2d8aa92bf3b";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}s:45:"http://backend.userland.com/blogChannelModule";a:2:{s:8:"blogRoll";a:1:{i:0;a:5:{s:4:"data";s:28:"http://canaletto.fr/opml.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:5:"blink";a:1:{i:0;a:5:{s:4:"data";s:36:"https://canaletto.fr/syndication.axd";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:32:"http://purl.org/dc/elements/1.1/";a:2:{s:7:"creator";a:1:{i:0;a:5:{s:4:"data";s:7:"My name";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:5:"title";a:1:{i:0;a:5:{s:4:"data";s:12:"My Canaletto";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}s:40:"http://www.w3.org/2003/01/geo/wgs84_pos#";a:2:{s:3:"lat";a:1:{i:0;a:5:{s:4:"data";s:8:"0.000000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}s:4:"long";a:1:{i:0;a:5:{s:4:"data";s:8:"0.000000";s:7:"attribs";a:0:{}s:8:"xml_base";s:0:"";s:17:"xml_base_explicit";b:0;s:8:"xml_lang";s:0:"";}}}}}}}}}}}}s:4:"type";i:128;s:7:"headers";a:14:{s:4:"date";s:29:"Sat, 17 Jun 2023 08:37:41 GMT";s:12:"content-type";s:19:"application/rss+xml";s:14:"content-length";s:6:"171162";s:13:"cache-control";s:6:"public";s:13:"last-modified";s:29:"Wed, 07 Jun 2023 18:39:36 GMT";s:4:"etag";s:20:""638217671760000000"";s:19:"content-disposition";s:24:"inline; filename=rss.xml";s:12:"x-powered-by";s:7:"ASP.NET";s:15:"cf-cache-status";s:7:"DYNAMIC";s:9:"report-to";s:237:"{endpoints:[{url:https:\/\/a.nel.cloudflare.com\/report\/v3?s=7wdr%2BUtFW%2FNQ0GYT8TWOkYeIAPr0u%2BarnwHjdIEfN6vekwGlBrQ4tSy6geKjEUgai%2F02Pu9jApMOKiUcq14xjG7XFnuUGCobnaFU4B9yBvDAu%2FQsNFsEXV6cK%2FH%2FCBU%3D}],group:cf-nel,max_age:604800}";s:3:"nel";s:52:"{success_fraction:0,report_to:cf-nel,max_age:604800}";s:6:"server";s:10:"cloudflare";s:6:"cf-ray";s:20:"7d89f8d78df81680-MRS";s:7:"alt-svc";s:17:"h3=:443; ma=86400";}s:5:"build";s:14:"20230304122624";s:5:"mtime";i:1686991062;s:3:"md5";s:32:"09b72eac93af0ff558a00843c88d9c69";}