1773 lines
180 KiB
Plaintext
Executable File
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 & 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 à quelques demandes, même si ça n'a pas une grande valeur ajoutée. Pour l'instant ça ne prends pas en compte les valeurs remonté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 à goute. Ca reste très expérimental... Coté inté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ées par les Plant Sensor ( <a href="https://amzn.to/3oOfyMR" target="_blank" rel="noopener">1</a> | 2 ) ne me semblent pas toujours très ré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')}} > 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')}} > 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: '#### <center> Heure de début'
|
|
- type: markdown
|
|
content: '#### <center> Arrosage'
|
|
- type: markdown
|
|
content: '#### <center> Heure de Fin'
|
|
- type: horizontal-stack
|
|
cards:
|
|
- entity: input_datetime.watering_start
|
|
type: custom:time-picker-card
|
|
name: Dé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é du sol
|
|
- entity: sensor.plant_01_temperature
|
|
name: Tempé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é et tempé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 & 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é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é un mécanisme de sécurité intégré qui les passent OFF en cas de surtension ou de surcharge. Et dans la pratique ça arrive parfois et on constate plus tard que le lave linge ou le lave vaisselle s'est arrêté, ou pire dans le cas d'un congé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 à cet inconvénient on va créer une automation qui va réarmer la prise après quelques minutes en OFF. Jusque là c'est simple, mais il se peut également que le problème soit plus grave et qu'il ne faille pas forcer indéfiniment ce réarmement automatique. Etant donné qu'on ne dispose généralement pas d'information sur la cause de ce passage en sécurité on va considérer qu'au bout de "n" tentatives sur un temps donné on ne réarme plus. Pour ça on va utiliser des compteurs (à créer avec un minimum à 0 et un maximum à 10) et on fera un reset de ceux-ci toutes les nuits...</p>
|
|
<p style="text-align: justify;">J'ai fixé ici arbitrairement à 5 le nombre de ré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 œuvre de cette solution est à vos risques (et périls). Je me dégage ainsi de toute responsabilité.</span></p>
|
|
<p style="text-align: justify;">On va faire ça avec une seule automation que j'ai voulue la plus concise et qui servira également à notifier :</p>
|
|
<pre class="language-yaml"><code>automation:
|
|
- id: '2bd0ertyyf-2687-45f98f-aed0-to-off'
|
|
alias: "Notify Plug Off"
|
|
description: "Notification mise en sécurité 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 < 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')}} > Réarmement n°{{ states('counter.plug_bw_1')}} du {{ trigger.id }}"
|
|
|
|
- conditions: "{{ trigger.id in ['Lave Linge'] and states('counter.plug_bw_2') | int < 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')}} > Réarmement n°{{ states('counter.plug_bw_2')}} du {{ trigger.id }}"
|
|
|
|
- conditions: "{{ trigger.id in ['Seche Linge'] and states('counter.plug_bw_3') | int < 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')}} > Réarmement n°{{ states('counter.plug_bw_3')}} du {{ trigger.id }}"
|
|
|
|
- conditions: "{{ trigger.id in ['Congelateur'] and states('counter.plug_bw_4') | int < 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')}} > Réarmement n°{{ states('counter.plug_bw_4')}} du {{ trigger.id }}"
|
|
|
|
- conditions:
|
|
- condition: or
|
|
conditions:
|
|
- "{{ trigger.id in ['Lave Vaisselle'] and states('counter.plug_bw_1') | int >= 5 }}"
|
|
- "{{ trigger.id in ['Lave Linge'] and states('counter.plug_bw_2') | int >= 5 }}"
|
|
- "{{ trigger.id in ['Seche Linge'] and states('counter.plug_bw_3') | int >= 5 }}"
|
|
- "{{ trigger.id in ['Congelateur'] and states('counter.plug_bw_4') | int >= 5 }}"
|
|
sequence:
|
|
- service: notify.slack_hass_mondon
|
|
data:
|
|
message: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} > Problème avec le {{ trigger.id }}. On ne réarme plus, une vé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é de Zerotier que j'utilise au quotidien, mais qui dans sa version gratuite comporte quelques limitations en terme de contrôle d'accès dans un environnement mixant du site-to-site et des clients isolé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é relativement similaire reposant sur Wireguard. Tous deux offrent des fonctionnalités gratuites et payantes. Si payer ne doit pas être un problème dans un environnement de production, c'est un peu différent en mode home lab.... d'autant plus que certaines fonctionnalités de la version gratuite ne se retrouvent que dans la <a href="https://tailscale.com/pricing/" target="_blank" rel="noopener">version Premium</a> à $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ôt généreuse, elle propose 100 nodes et 3 utilisateurs (à condition de disposer d'un "custom domain" (je vais utiliser des comptes Microsoft 365, mais plusieurs autres possibilité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ême domaine. Je parle de comptes car nativement (et normalement) le contrôle d'accès se fait sur l'utilisateur. Manque de chance j'ai besoin de gérer 4 utilisateurs, et je ne suis pas prêt à payer 4 x $18, ce qui me ferait plus de $ 800 par an !</p>
|
|
<p style="text-align: justify;">J'ai donc cherché à contourner et je vais finalement gérer mes autorisations à partir des machines Tailscale que j'ai approuvées (mode NFS pour ceux qui se souviennent). Dans cet usage je ne cherche pas faire communiquer les clients Tailscale entre eux mais à leur permettre d'accéder à des ressources situées sur différents subnets sur lesquels je souhaite restreindre les possibilité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ère que le réseaux Tailscale est configuré avec les nodes qui servent à joindre les subnets.</p>
|
|
<p style="text-align: justify;">Je vais cré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 également le mien va également me permettre de configurer et approuver les machines clientes.</p>
|
|
<p style="text-align: justify;">Le second servira à connecter mes utilisateurs et je pourrais approuver leurs machines. Ce compte étant protégé en MFA, il nécessitera une validation de ma part. Une fois la machine connectée, je désactive l'expiration de la clé et on passe au contrôle s'accè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é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 à tout voir.</li>
|
|
<li>Ensuite j'autorise les machines <code>azura</code> et <code>lydia</code> à accéder uniquement aux hosts que j'aurais défini avec une restriction sur certains ports. C'est possible en définissant les hosts plus loin ou en se servant directement des adresses IP. L'ICMP (ping) est ouvert automatiquement vers les destinations autorisées.</li>
|
|
<li>Je défini les clients et serveurs.</li>
|
|
</ol>
|
|
<p>Voilà. Je n'ai pas creusé toutes les possibilité offertes par le contrôle d'accès proposé par Tailscale, la liste est longue et le <a href="https://tailscale.com/kb/" target="_blank" rel="noopener">documentation</a> plutôt bien faire. Idé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 & 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é d'alarme ici, de télécommandes, de claviers et de sirènes. Je pense cette fois être parvenu à quelque chose de fonctionnel et je vais vous en parler. Pour faire face aux différentes contraintes, notamment la gestion bizarre des télécommandes sous ZHA, il va falloir un peu ruser. Avant que vous me demandiez pourquoi je m'obstine sous ZHA alors que ces mêmes télécommandes sont bien gérées sous Z2M, je vous répondrait que mon objectif est la simplification et donc d'éviter le plus possible les adons qui complexifient une installation, pas forcément pour moi ou je dispose de toutes les passerelles possibles, mais sur des installations que je gère à 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> on parle ici d'un système de sécurité DIY, donc non agrée par les assurances et autres... Ca ne veut pas dire que ça ne fonctionne pas, juste que ça ne répond pas aux normes NF en vigueur dans ce domaine</span></p>
|
|
<p style="text-align: justify;">Afin de gé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érer :</strong></p>
|
|
<ul style="text-align: justify;">
|
|
<li>Un mode absent (away) (avec une variable pour simuler un peu de présence).</li>
|
|
<li>Un mode présent/nuit armé (home) (plus ou moins utile mais mais ça fait partie de tout système d'alarme face au home jacking.</li>
|
|
<li>Un mode alerte (emergency) qui va permettre de déclencher une action d'urgence en appuyant sur un bouton de télécommande ou médaillon (je pense à mes vieux jours).</li>
|
|
</ul>
|
|
<p style="text-align: justify;"><strong>De l'armement / désarmement vont également découler :</strong></p>
|
|
<ul style="text-align: justify;">
|
|
<li>La fermeture complète ou partielle des volets roulants, leur réouverture cohérente avec la programmation en cours et éventuellement le passage en manuel des volets des chambres des enfants / invités s'ils sont présents.</li>
|
|
<li>La gestion du climatiseur et des convecteurs avec passage en mode éco ou absent en fonction du type d'armement).</li>
|
|
<li>La gestion du chauffe eau en cas d'absence de longue durée.</li>
|
|
<li>La gestion des éclairages et la mise en veille des écrans et ordinateurs.</li>
|
|
<li>...</li>
|
|
</ul>
|
|
<p style="text-align: justify;">Etant donné que j'ai deux systèmes d'alarme qui fonctionnent en parallèle (Alarmo et Visonic), j'ai commencé par créer une alarme virtuelle et je me servirait d'elle pour les diffé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ésarmement</h3>
|
|
<p style="text-align: justify;">L'armement / désarmement va pouvoir se faire de plusieurs façons :</p>
|
|
<ul style="text-align: justify;">
|
|
<li>Clavier à code</li>
|
|
<li>Télécommande dédiée</li>
|
|
<li>Application mobile</li>
|
|
<li>Tag RFID (pour désarmer dans mon cas)</li>
|
|
</ul>
|
|
<p style="text-align: justify;">J'ai volontairement écarté les télécommandes radio en 433 Mhz dont j'avais parlé 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ésarmé le système.</p>
|
|
<p style="text-align: justify;">Je vais utiliser deux automations et les découper ce dessous/</p>
|
|
<ul style="text-align: justify;">
|
|
<li>La première pour gérer les armements / désarmements</li>
|
|
<li>La seconde pour gérer le désarmement des télécommandes, claviers à code afin d'intégrer les particularités ZHA (en attendant une amélioration de la part des développeurs de Home Assistant qui pour l'instant font la sourde oreille, parfois plus concentrés sur les nouveauté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ésarmement et des boutons d'urgence</h3>
|
|
<p style="text-align: justify;"><strong>Les déclencheurs</strong> : Ici on va empiler nos déclencheurs d'armement, qu'ils soient gérés par ZHA, Z2M ou toute autre source. 3 par fonction, <code>armed_away, armed_home, triggered</code>, mais cela peut également être un bouton virtuel pour Lovelace, voire n'importe quelle télé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éclencheur de désarmement activé 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é. Chacun adaptera.</p>
|
|
<pre class="language-yaml"><code> condition:</code></pre>
|
|
<p style="text-align: justify;"><strong>Les actions</strong> : </p>
|
|
<p style="text-align: justify;">Je commence par arrêter les éventuels scripts en cours. Cela est principalement utile quand on a fermé la porte, armé le système et que l'on doit rapidement désarmer car on a oublié 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écuter les différentes actions en fonction de la source et de l'é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ène. En MQTT pour l'instant car elle aussi est très mal géré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éraillent).</li>
|
|
<li style="text-align: justify;">On arme notre panneau d'alarme virtuel qui nous servira au désarmement</li>
|
|
<li style="text-align: justify;">On arme également le clavier, ça ne change rien à l'usage mais quand on se présentera pour désarmé il apparaitra comme étant armé. Dans la pratique ça relance de fait l'automation avec la même automation, et donc ça fausse le message, j'ai donc retiré cette option pour l'instant. (D'ailleurs si vous êtes sous Z2M il le dé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énom de l'utilisateur pour plus de lisibilité.</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ène SMaBiT/set
|
|
payload: >-
|
|
{"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 à cause des dé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é
|
|
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')}} > Arm Away by : {{ trigger.id }}" </code></pre>
|
|
<p style="text-align: justify;">On fait la même chose pour le mode home. Je fais l'impasse sur Visonic, par contre j'é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é
|
|
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')}} > Arm Home by : {{ trigger.id }}" </code></pre>
|
|
<p style="text-align: justify;">Ensuite on passe au désarmement du mode absent. On remarque que l'on é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 écrira. Par contre on émet le son de désarmement sur la sirè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ène SMaBiT/set
|
|
payload: >-
|
|
{"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é (Nuit) pour ensuite pouvoir désarmer.</li>
|
|
<li style="text-align: justify;">On envoie un SMS d'Au Secours, ou toute autre action à imaginer.</li>
|
|
<li style="text-align: justify;">On é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ésarmer
|
|
target:
|
|
entity_id: alarm_control_panel.home_alarm_command
|
|
- service: notify.free_mobile_andre
|
|
data:
|
|
message: "{{ states.sensor.date_time.state}} > TEST Alerte au secours par télécommande TEST"
|
|
- service: input_text.set_value
|
|
target:
|
|
entity_id: input_text.last_arm
|
|
data:
|
|
value: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} > Triggered by : {{ trigger.id }}" </code></pre>
|
|
<p style="text-align: justify;">Enfin, on désarme cette alerte. A ce stade on peut aussi envoyer un SMS pour dire que c'é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ésarmement</h3>
|
|
<p style="text-align: justify;">Au risque de me répéter, cette partie aurait pu être intégrée à la première automation, si ZHA ne posait pas problè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élécommandes d'alarme sous ZHA on va devoir écouter un <code>event:</code>, s'en servir pour désarmer nos système d'alarme mais également pour la désarmer et désarmer ses copines ainsi que le clavier. Simple ! J'avais exploré dans <a href="http://canaletto.fr/post/home-assistant-and-remote-alarm" target="_blank" rel="noopener">un précé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èle). J'ai un peu avancé et on ne va pas les écouter dans l'automation, mais se servir de l'é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éclencheurs</strong> : Ici on va écouter des actions de désarmement, que cela provienne d'un clavier, une télé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é à distance aprè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ésarmer le panneau d'alarme virtuel, ce qui déclenchera l'action idoine dans la première automation.</li>
|
|
<li style="text-align: justify;">Désarmer les télécommandes et claviers qui sont également des panneaux d'alarme, avec cette particularité ZHA qui fait qu'il faut un code pour désarmer une télécommande...</li>
|
|
<li style="text-align: justify;">Ecrire un <code>input_text:</code> afin de savoir qui a désarmé.</li>
|
|
<li style="text-align: justify;">J'envoie un message dans Slack qui me sert de log. Ca va également m'informer à distance que quelqu'un est arrivé et a désarmé </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é', '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')}} > Disarm by : {{ trigger.id }}"
|
|
- service: notify.slack_hass_canaletto
|
|
data:
|
|
message: "{{now().strftime('%d/%m/%Y, %H:%M:%S')}} > Disarmed by : {{ trigger.id }}" </code></pre>
|
|
<p style="text-align: justify;">On peut également faire une place à une fonctionnalité détournée du clavier. En effet au delà de l'amenée Home, Away et Emergency, on peut également lui faire avaler n'importe quel code et effectuer une action pré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éfaut, comme éteindre les sirènes au cas ou... (ça sent le debug...).</p>
|
|
<pre class="language-yaml"><code> - service: mqtt.publish
|
|
data:
|
|
topic: zigbee2mqtt/Sirène SMaBiT/set
|
|
payload: >-
|
|
{"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élai</span> car ces télécommandes ont la fâcheuse idée d'envoyer 3 ou 4 <code>event:</code> identique pour chaque appui. Donc combiné au <code>mode: single</code> de cette automation, on va en capturer qu'un seul. Ce délais est bien sur à ajuster plus ou moins au pif...</span> Maintenant que je passe par des <code>binary_sensor:</code> temporisés, je pense que ce dé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ésarmement</h3>
|
|
<p style="text-align: justify;">On va utiliser deux scripts qui seront exécutés par Alarmo après l'armement et après le désarmement. Chez moi ils vont servir à :</p>
|
|
<ul style="text-align: justify;">
|
|
<li style="text-align: justify;">Jouer une annonce vocale en TTS sur une enceinte extérieure pour annoncer l'état armé ou désarmé.</li>
|
|
<li style="text-align: justify;">Activer ou désactiver la vidé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érer le mode ECO/Absent du climatiseur et des convecteurs.</li>
|
|
<li style="text-align: justify;">Gérer les é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ènes</h3>
|
|
<ul style="text-align: justify;">
|
|
<li style="text-align: justify;">Notifications SMS pour l'intrusion, la détection incendie ou fuite d'eau. (notifications gérées par Alarmo).</li>
|
|
<li style="text-align: justify;">Sirènes et projecteurs en cas d'intrusion :
|
|
<ul>
|
|
<li>la législation autorise au maximum 3 minutes pour chaque lancement de sirène.</li>
|
|
<li>Pas de limite pour les projecteurs. Et éclairer comme en plein jour peut également faire fuir et permettra d'avoir des images bien nettes sur les caméras.</li>
|
|
<li>Si vous avez un système audio multi room bien puissant, vous pouvez également envoyer une bonne salve d'AC-DC, ça peu perturber... ou inciter les voisins à appeler la maréchaussée.</li>
|
|
<li>Les armes, explosifs et autres gaz toxiques sont à proscrire.</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<p style="text-align: justify;">Pour cela on va utiliser des scripts: qui seront lancé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é que j'ai des détecteurs d'ouverture sur mes volets roulants, je peux également imaginer l'éclairage extérieur avant de déclencher l'alarme si un de ces volets est touché. Il faut être prévenant et éclairer l'intrus. Cela peut se gréer dans une partition secondaire d'Alarmo, ou simple une automation. Les caméras Unifi Protect (G4) font également de la détection de personne qui remonte dans Home Assistant.</p>
|
|
<p style="text-align: justify;">Voilà, ce n'est pas exhaustif, vos idé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;"> </p>
|
|
<p style="text-align: justify;"> </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 & 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é <a href="http://canaletto.fr/post/vmware-esxi-nuc-9" target="_blank" rel="noopener">ici</a>, j'ai remplacé mon serveur ESXi HP ML350p par un Nuc 9. Depuis plus de 6 mois ça fonctionne très bien.</p>
|
|
<p style="text-align: justify;">Dans ce Nuc j'ai installé deux SSD NVMe Samsung 980 Pro. Les performance sont au top, mais voilà que plusieurs utilisateurs se plaignent que leurs SSD s'usent prématurément et finissent par passer en R/O. C'est d'autant plus fâcheux que sous ESX on ne dispose de rien pour surveiller les disques sur un NUC, celui ci ne remontant pas de données IPML comme le ferait un vrai serveur. Aprè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 à 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ès facile de mettre à jour (ou de migrer) un SSD, il suffit de lancer Samsung Magician et le tour est joué ! Sous VMWare ESXi rien de tout ça et il va falloir le faire à la mano. Heureusement pour cela Samsung fournit également les firmawares sous la forme d'une ISO, il suffit, en principe, de le griller sur une clé USB et de booter avec et de faire la mise à jour. Mais ça c'est la théorie. Dans la pratique j'ai appris à mes dépends que cette clé basée sur un vieux Linux était incapable de booter sur du matériel moderne, et quand elle boote certains disent même qu'elle ne reconnait que les claviers PS2... Allons donc !</p>
|
|
<p style="text-align: justify;">Après quelques recherches j'ai découvert qu'il existait un contournement possible mis en pratique par la communauté Linux, mais nullement supportée par Samsung qui doit considérer que ses SSD sont destinés uniquement à l'environnement Windows, tout comme VMWare qui a sa liste de hardware supporté...</p>
|
|
<p style="text-align: justify;">L'astuce consiste à 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'étant pas de toute fraicheur j'en profite pour le mettre à jour sans plus de succè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é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 à jour (<code>Samsung_SSD_980_PRO_5B2QGXA7.iso</code>) que j'ai au préalable préparée sur une autre clé USB vers le répertoire Home et je monte le volume. Ensuite toujours depuis l'interface graphique j'extrait le fichier <code>initrd</code> un répertoire (<code>/home/samsung</code> par exemple). Ensuite je vais jusqu'à <code>/home/samsung/initrd/root/fumagician</code> et je peux lancer la mise à jour de mes SSD :</p>
|
|
<pre class="language-yaml"><code>sudo ./fumagicien</code></pre>
|
|
<p style="text-align: justify;">Je fais la mise à jour de mes deux SSD et je relance le Nuc. Attention, le bon numéro de version n'apparaitra qu'âpres le prochain redémarrage. Donc même si c'est un peu fastidieux, je vous conseille de relancer le Live CD pour vérifier. De même si vous avez d'autres machines à mettre à jour, vous pouvez sauvegarder <code>fumagician</code> sur une clé pour éviter l'étape de l'extraction. </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éthode en CLI pour les barbus, elle demandera toutefois de connecter le Live CE au réseau si on veut éviter l'étape de la clé USB, mais in fine ça revient au mê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à comment occuper (perdre) un après-midi d'hiver !</p>
|
|
<p style="text-align: justify;">Attention toutefois, si vous avez créé 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> </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 & 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éjà parlé ici du système d'alarme Alarmo pour Home Assistant et notamment des commandes possibles pour armer et désarmer le système. Aujourd'hui il s'agira des sirè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èles</p>
|
|
<ul style="text-align: justify;">
|
|
<li>La plus basique est juste branchée sur une prise commandée Zigbee ondulée. Donc un <code>switch:</code> vu en tant que <code>siren:</code>.</li>
|
|
<li>Une sirène Heiman qui sous ZHA décroche régulièrement et que j'ai du appairer à ma seconde passerelle sous Z2M.
|
|
<ul>
|
|
<li>Sous ZHA elle était vue en tant que <code>siren:</code>.</li>
|
|
<li>Sous Z2M elle est vue en tant que rien du tout...</li>
|
|
</ul>
|
|
</li>
|
|
<li>Une sirène SMaBit sous Z2M également vue en rien du tout...</li>
|
|
</ul>
|
|
<p style="text-align: justify;">Pour commander une sirè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è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ène SMaBiT/set
|
|
payload: >-
|
|
{"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é et moins facile à mémoriser, mais ça fonctionne.</p>
|
|
<p style="text-align: justify;">Mon objectif a donc été de faire en sorte qu'une sirène Z2M soit vue par Home Assistant comme une sirène ZHA et ainsi pouvoir la commander par un <code>siren.turn_on</code> comme les autres... Et voici ce que ça donne :</p>
|
|
<pre class="language-yaml"><code>mqtt:
|
|
siren:
|
|
- unique_id: heiman_sirene_1s
|
|
name: Heiman Sirène 1s
|
|
state_topic: "zigbee2mqtt/Heiman Sirène 1/set"
|
|
command_topic: "zigbee2mqtt/Heiman Sirè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ème, car il y en a un, la sirène Heiman ne retourne aucun état sous Z2M. Il y a beaucoup d'articles à ce sujet, et l'intégration ne semble pas vraiment terminée. Hors dans l'activation il y a une durée, le principe étant d'activer la sirène pour x secondes. Et donc comme elle ne retourne pas son état, son commutateur restera sur ON alors que le délais d'activation est terminé et la prochaine action n'aura aucun effet... De plus certaines sirènes proposent plusieurs fonctions et tonalités (les bips de délais d'armement et désarmement par exemple).</p>
|
|
<p style="text-align: justify;">Donc contrairement à ZHA ou l'intégration <code>siren:</code> peut gérer tous les modes, chercher à gérer une sirène Z2M en tant que <code>siren:</code> n'a pas de sens... (hormis peut être de bricoler un <code>template:</code> qui en fonction de la durée d'activation repasserait le commutateur à off, on peut aussi le faire via une automation: mais là ç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> à une sirène Z2M, ce que j'ai trouvé 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ène Heiman 1 : Waraning"
|
|
command_topic: "zigbee2mqtt/Heiman Sirè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ène Heiman 1 : Stopped"
|
|
command_topic: "zigbee2mqtt/Heiman Sirè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érer les différents mode de la SMaBit :</p>
|
|
<pre class="language-yaml"><code>mqtt:
|
|
button:
|
|
- unique_id: siren_smabit_armed
|
|
name: "Sirène SMaBit : Armed"
|
|
command_topic: "zigbee2mqtt/Sirè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ène SMaBit : Disarmed"
|
|
command_topic: "zigbee2mqtt/Sirè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ène SMaBit : Warning"
|
|
command_topic: "zigbee2mqtt/Sirè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ène SMaBit : Stopped"
|
|
command_topic: "zigbee2mqtt/Sirè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 ça m'aura permis de comprendre comment cré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> </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éçu comme on le verra plus loin ! Depuis très jeune j'ai toujours été un afficionado de la marque Sony. Et si d'aucune pourraient trouver cela déplacé, il est des domaines ou je suis fidèle ! Coté TV après avoir eu quelques Trinitrons cathodiques célè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ésolu récemment à le porter à la déchetterie, le pauvre il trainait dans le garage depuis bientô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 écrans Sony que j'ai eu successivement, ni leur cout car ça me déprimerait, mais juste vous parler des déboires de mon dernier TV. Il y a un an j'ai craqué pour le A80J, un Oled ! Un TV intelligent sous Google TV, même si d'intelligence il n'a que la pub et les traqueurs que cela induit !</p>
|
|
<p style="text-align: justify;">Je considère Google TV / Android TV comme étant le meilleur choix car il me permet d'installer les application qui me sont utiles, en opposition aux écosystèmes fragmentés de la concurrence qui ne proposent que l'essentiel bien commercial ! C'est du business, on le sait et on l'accepte car ça nous apporte du confort.</p>
|
|
<p style="text-align: justify;">Autres points que les pseudo journalistes testeurs oublient souvent, c'est la télécommande et l'implémentation du CEC. Celles de Sony m'ont toujours satisfait alors que je déteste certaines d'autres marques. Mais Sony est radin, et sur le A80J la télécommande n'est pas même rétroéclairée ! Qu'à 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étro éclairée... Quant au CEC il a toujours été trè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éjà fait plus ou moins bien. Enfin, je parle de TV, mais je ne regarde même pas la télé et aucune antenne n'y est raccordée. Je rê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 à la domotique commerciale et forcé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énarios (scènes). Et on va faire simple !</p>
|
|
<ul style="text-align: justify;">
|
|
<li>Play / Pause : on éteint et on rallume progressivement les éclairages comme au cinéma.</li>
|
|
<li>On / Off : on mets sur pause la musique qui était diffusée.</li>
|
|
</ul>
|
|
<p style="text-align: justify;">Ce n'est pas sorcier et très simple à 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égration Bravia ou HomeKit. Dès lors on dispose des information idoines et ça fonctionne très bien, il suffit d'agir en fonction de l'état remonté.</p>
|
|
<p style="text-align: justify;">Mais alors il se plaint de quoi le râleur ? Et oui il y a un "mais" !</p>
|
|
<h3 style="text-align: justify;">Consommation</h3>
|
|
<p style="text-align: justify;">Pour accéder à ces fonctions il faut que le contrôle à distance ou / et HomeKit soit activé. C'est d'ailleurs le cas par défaut. Et les ingés de chez Sony, dont je ne doute pas des prouesses en audio / vidéo s'avèrent des brèles en réseau ! Pour que ces fonctions soient accessibles ils laissent simplement la partie réseau allumée quand le téléviseur est en veille. Et comme leur carte réseau doit dater du siècle dernier (elle a du mal à accrocher le réseau et est <span style="background-color: #fbeeb8;">limitée à du 10/100 en 2022</span> ou on est censé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ésactivées la veille est à 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 € / an).</li>
|
|
<li>Il est inacceptable que ces fonctionnalités soient activées par défaut et induisent cette surconsommation ! Et certainement contraire aux directives européennes en la matière. Il est en effet peu probable qu'un consommateur lambda ne pense à mesurer et désactiver ces fonctions.</li>
|
|
</ul>
|
|
<p style="text-align: justify;">En l'état il est donc inenvisageable d'utiliser ces fonctionnalités qui ajoutent un plus au téléviseur. Et il faut noter que tout pilotage par les applis standard, Chromecast, Alexa, etc pose le même problème...</p>
|
|
<p style="text-align: justify;">Le pire étant que si on désactive ces fonctions, quand on allume le téléviseur il mets bien trop longtemps pour accrocher le réseau, que ce soit en Ethernet ou en WI-FI. Je sais c'est fait pour regarder la télé avec un râ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ête et une NVidia Shield que je pilotait très bien sans que cela ne grève mon budget. Le Shield allumait le TV en CEC et tout était parfait. Je vais peut être en racheter un, encore que mon Shield de 2015 fonctionne encore très bien dans ma chambre. Un bel exemple de non obsolescence qui mérite d'être signalé !</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 ça se passe chez les autres constructeurs de TV car je ne suis pas client. On me remonte 1 à 2 W avec les options de pilotage activées chez Samsung ou Panasonic, mais je n'ai pas vérifié. Par contre j'ai un bel élevage de Sonos, et là non plus ce n'est pas très joli à voir : aucun progrès depuis le dé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 à 11 W sur un AMP ou 6 W pour une Beam !</p>
|
|
<h3 style="text-align: justify;">Moralité</h3>
|
|
<p style="text-align: justify;">La domotique n'est pas vraiment écologique, elle crée un énorme talon de consommation de part son infrastructure (caméras, nvr, switches, micro modules et autres prise connectées). Elle apporte plus de confort qu’elle ne fait réaliser des économies (les économies c’est le bobard que racontent certains à leur compagne quand c’est elle qui tiens les cordons de la bourse, car, hélas, la domotique reste un truc de mec, comme le BBQ, n’en déplaise à Sandrine).</p>
|
|
<p style="text-align: justify;">Un panneau solaire va devoir s'imposer à 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> </span></li>
|
|
</ul>
|
|
<p> </p>
|
|
<p style="text-align: justify;"> </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 & 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écédent article</a> je vous avait parlé de la partie matérielle de mes volets roulants et de leur commande via des interrupteurs et des télé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édiaire et fermeture en fonction de :</p>
|
|
<ul style="text-align: justify;">
|
|
<li>Le jour et la nuit</li>
|
|
<li>La température extérieure et intérieure et les contraintes météo (canicule, etc.)</li>
|
|
<li>La position du soleil</li>
|
|
<li>Les contraintes de vie (lever tardif, soirée, etc...)</li>
|
|
<li>Les contraintes de présence / absence plus ou moins longue (alarme et simulation de présence)</li>
|
|
<li>Le débrayage de l'automatisme afin de laisser en paix un invité 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 ç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éé un superbe moteur pour gérer tout ça, moteur que chacun pourra adapter à ses propres besoin en lui fournissant des prérequis (inputs, binary, etc..) qui permettront de gérer les différents conditions de positionnement. Vous trouverez les détails sur son blog, mais l'installation est relativement aisée, on commence par créer les entités né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 ça prends un peu de temps. Et surtout commencez par mettre sur le papier le ré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. </p>
|
|
<p style="text-align: justify;"><span style="background-color: #fbeeb8;">Avant de chercher à inté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âce à l'intégration <code>sun.sun</code>. Bon, pour faire ça on a pas besoin d'une usine, c'est pour ça que je vais vous montrer que son moteur permet bien d'autres choses.</p>
|
|
<h3 style="text-align: justify;">Température exté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é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ême adoptée et qui permet d'aller plus loin, avec différentes sources et notamment un capteur de luminosité.</p>
|
|
<h4 style="text-align: justify;">Exemple</h4>
|
|
<p style="text-align: justify;">J'utilise les Packages et je vais commencer par cré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éer 3 <code>binary_sensor:</code> avec les les valeurs basses et hautes d'azimut, ces binary passeront à ON quand le soleil tapera sur la façade concernée. Bien sur il faudra un peu tâ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éer un dernier <code>binary_sensor:</code> pour déterminer les conditions météo. Il s'appuie sur les infos de l'intégration Météo France (ou avec un capteur de luminosité 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épend de seuils définis dans des <code>input_number:</code> qui pourront s'afficher dans Lovelace. (je n'ai pas pris en compte la température inté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) >= states('input_number.vr_sun_hot') |float(0)
|
|
and states('sensor.avignon_cloud_cover')|float(0) <= states('input_number.vr_cloud_cover')|float(0) }}"
|
|
friendly_name: "Alerte haute température"
|
|
|
|
input_number:
|
|
vr_sun_hot:
|
|
name: Seuil haute température
|
|
min: "10"
|
|
max: "40"
|
|
step: "1"
|
|
unit_of_measurement: "°"
|
|
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é 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érature est hot et le soleil au sud.</li>
|
|
<li>La séquence de services à lancer :
|
|
<ol>
|
|
<li>Je positionne le volet dans un <code>input_number:</code> à partir d'un <code>input_number:</code> de préréglage.</li>
|
|
<li>A des fin de debug je note la dernière condition utilisé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é des différentes conditions est important. Il y a aussi une option par défaut si aucune des conditions n'est valide mais que l'automation est tout de même déclenché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 évident que l'on se moque de position du soleil si on est en voyage et que la maison est fermée. </span></p>
|
|
<p style="text-align: justify;">Cela n'empêchera éventuellement pas une solution de simulation de pré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égration</a>, attention à bien valider avant de partir en vacances...</p>
|
|
<h3 style="text-align: justify;">Contraintes de vie</h3>
|
|
<p style="text-align: justify;"><strong>Ré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éguliers et je suis un lève tard. J'ai donc créé un script qui se déroule quand je dis bonjour (ou bonne nuit) à Alexa ou que j'appuis simplement sur un bouton de télécommande. Ce script va entre autres choses faire un push, si je suis pré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éjour (une baie vitrée coulissante s'ouvre très facilement si elle n'est pas protégée, je vais donc é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ève
|
|
icon: mdi:human-greeting-variant
|
|
lionel_down:
|
|
name: Je me couche
|
|
icon: mdi:bed</code></pre>
|
|
<p>La condition correspondant au réveil (la position du volet est stockée dans un <code>input_number:</code> afin d'être facilement ajusté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éclarer <code>input_button:</code> dans le BluePrint correspondant au volet (en condition immé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éfaut d'ouverture dans l'automation afin qu'il ne se passe rien avant 13 heures... mais également rien si le volet est déjà 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ée</strong></p>
|
|
<p style="text-align: justify;">En soirée, surtout en été, je n'ai pas envie que les volets soient complètement fermés car c'est l'heure ou on ouvre les fenêtres pour faire entrer un air plus frais. Je vais donc définir un <code>binary-sensor:</code> correspondant à ma soiré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)) > 180 and (state_attr('sun.sun', 'elevation') | float(0.0)) < 0 and ('12:00:00' < states('sensor.time')) }}"
|
|
friendly_name: "Soirée"</code></pre>
|
|
<p style="text-align: justify;">J'aurais pu y ajouter un <code>and</code> supplémentaire afin de valider la saison en me basant sur l'intégration <strong>Season</strong>. Sauf que les saisons tout le monde sait que ça ne veut plus dire grand chose et qu'ici depuis le début du mois de mail il fait plus ou moins 30° en journée, je testerais donc un <code>input_boolean:</code> de plus pour valider cette condition (que j'aurais é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ée - {{ states('input_number.vr_global_position_soir') }} %"</code></pre>
|
|
<p>On peut aussi faire la mê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ésence / Absence et Alarme </h3>
|
|
<p style="text-align: justify;">Pour ce chapitre c'est un peu plus compliqué. J'utilise en parallèle deux système. Ma centrale Visonic indépendante mais que je pilote dans Home Assistant et l'intégration Alarmo. Lors de mes test je me suis aperçu que tester uniquement l'état "armed" pouvait conduire à des surprises. Lors de l'armement et surtout le déclenchement d'une alarme (possiblement fausse) l'état de <code>alarm_control_panel:</code> passe par des phases successives peu simple à gérer, et ça peu conduire à une ouverture des volets non souhaité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érentes possibilités pour armer ces deux systèmes (télécommande, code, tag), je vais donc me servir d'Alarmo qui permet de lancer un script selon un état pour basculer un <code>input_boolean:</code> qui me servira dans la condition immédiates du volet :</p>
|
|
<ul>
|
|
<li style="text-align: justify;">On passe tous les volets en mode automatique (certains auraient pu êtres débrayé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ée) je rebascule tous les volets en mode manuel. Une sécurité de plus afin d'empê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> à 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ésents présente je vais basculer leurs volets en manuel afin qu'ils soient gérés comme bon leur semble. Mais j'attend un peu afin que l'automatisation du volet 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'à configurer la contrainte dans l'automatisation, et surtout de la placer en priorité (la premiè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ère quand que pars quelques heures, ça laisse certains volets entrouverts afin de simuler une présence avec d'autres artifices, et la seconde pour une fermeture totale.</p>
|
|
<h3 style="text-align: justify;">Le dé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 à 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é, 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épart et d'arrivée et une automation bascule déjà 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élécommande de leur chambre.</p>
|
|
<h3 style="text-align: justify;">Suspension</h3>
|
|
<p style="text-align: justify;">Si vous êtes arrivés là et que vous avez lors de la configuration des BluePrint's la durée de suspension vous vous demandez peut être de quoi il s'agit. En fait configure là le durée pendant laquelle l'automatisme sera suspendu. Imaginons que celle ci est réglée du 60 minutes, il est 13 heures, le soleil frappe fort et vous décidez de déjeuner dans le cuisine. Vous remontez le volet avec la télécommande (ou l'application), il restera levé 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éhension de la solution que Fabien viens de mettre à disposition. Quand vous aurez parfaitement validé le fonctionnement souhaité 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 à 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érer les informations des 3 BluePrint's du premier volet dans le fichier <code>/config/automations.yaml</code>, les dupliquer à la suite en changeant les informations propres à chaque volet et les <code>ID:</code> . Si vous ne le sentez pas configurez les BluePrint's individuellement à la main.</li>
|
|
<li style="text-align: justify;">Vérifier une fois de plus que tous les <code>ID:</code> ont bien été changés. J'insiste sur ce point car ça peut être la cause de bien des dysfonctionnements. Vous trouverez <a href="https://www.uuidgenerator.net/" target="_blank" rel="noopener">ici</a> un générateur d'UUID.</li>
|
|
<li style="text-align: justify;">Redé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écessairement pour les autres.</li>
|
|
<li style="text-align: justify;">Et surtout tester toutes les conditions car il sera désagréable de voir s'ouvrir le volet de la chambre quand on dort (vécu) voir certains volets ne pas se fermer sur l'alarme enclenchée quand on part que l'on est déjà en retard (vécu avec obligation de tous les passer en mode manuel et de les baisser à 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 à l'aide de capteurs extérieurs va permettre de se passer totalement des données Météo France et d'avoir une solution autonome. Je ne l'ai pas utilisée au dé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éclaration ! J'ai longtemps été 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 à part, en imposant d'abord Exchange dans les entreprises, Microsoft telle une pieuvre avait bien préparé le terrain afin que celles-ci migrent vers Exchange Online, une des briques de la méga suite 365. Le résultat est qu'aujourd'hui la domination est quasi totale, domination que les autres acteurs ont bien du mal à concurrencer. Bien ou pas, ce n'est pas l'objet de cet article, par contre cette domination devrait imposer un devoir d'exemplarité, 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 également devenu un acteur majeur du spam. Face à cette déferlante certains acteurs moins conséquents n'ont d'autre choix que d'imposer régulièrement le blocage des adresses IP de Microsoft, une pratique certes discutable, mais également adoptée par Microsoft lui mê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&data=05%7C01%7Cemmanuel.kerhoz%40valor.pro%7C2128fb1a675844927b7208dad9f84851%7Ce7c4dbca5a8147f49bdc2e2add8f6027%7C0%7C0%7C638061958640364822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C5000%7C%7C%7C&sdata=guXtzZeWN4VfkT%2BC1tLPeM5uIHWydrI95jHpQvXN2DY%3D&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&data=05%7C01%7Cemmanuel.kerhoz%40valor.pro%7C2128fb1a675844927b7208dad9f84851%7Ce7c4dbca5a8147f49bdc2e2add8f6027%7C0%7C0%7C638061958640364822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C5000%7C%7C%7C&sdata=gd7zvN4PM1jPIJyn912kwvG77Gi03eA7Qr0RIhx7bl8%3D&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&data=05%7C01%7Cemmanuel.kerhoz%40valor.pro%7C2128fb1a675844927b7208dad9f84851%7Ce7c4dbca5a8147f49bdc2e2add8f6027%7C0%7C0%7C638061958640364822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C5000%7C%7C%7C&sdata=ltkjQTslssC%2Bi9uKY8j22IKo4WSLF%2B74zI0EQZzat%2Bc%3D&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ébloquer toute seule et alors les messages prennent du retard, ou sont simplement renvoyés à l'expéditeur via un NDR.</p>
|
|
<p style="text-align: justify;">L'un de nos collègue, <a href="https://twitter.com/marcolanie" target="_blank" rel="noopener">Marc</a>, a eu l'opportunité d’échanger avec le responsable de la messagerie chez Free et il lui a posé la question :</p>
|
|
<p style="padding-left: 40px; text-align: justify;">Pensez vous qu’il puisse être envisageable d’exploiter d’autres mécanismes permettant un filtrage avec une granularité 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 à ce jour et probablement pas dans un futur proche.</em></li>
|
|
<li style="text-align: left;"><em>Le premier problème est que la situation dans laquelle vous êtes ne concerne qu'Office365 et aucun autre hébergeur de messagerie. Il y a bien des problèmes avec Gmail mais les solutions techniques mises en place chez eux n'ont rien à voir avec celles d'Office365 et les dommages collatéraux en sont drastiquement réduits.</em></li>
|
|
<li style="text-align: left;"><em>Le second problème est que si nous devions basculer sur une réputation par domaine en nous basant sur les signatures DKIM, il nous faudrait également prendre en compte les sceaux ARC (signature de l'intermé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équent pour que ce soit toute la plateforme Office365 qui se retrouve bloquée.</em></li>
|
|
<li style="text-align: left;"><em>Le troisième problème est que nous avons pu constater ces dernières années des campagnes de spams expédiées au travers de comptes compromis. Sur certaines journées en décembre dernier, c'est plus de 1500 domaines qui participaient ainsi aux envois rien que pour Office365. Il est délicat de mettre en place une whiteliste concernant un domaine ou un compte car cela revient à retirer toutes nos protections alors que nous gé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éagit pas plus, il faut trouver un contournement qui va nous permettre de rerouter les messages destinés aux domaines qui pratiquent de tels blocages. D’aucuns diront que continuer à utiliser en 2022 un compte de messagerie chez un FAI n’est pas une bonne idée, mais peu importe, dans le cadre d’une relation commerciale on ne commence pas par expliquer la vie au client, mais à entretenir la relation avec lui et ainsi lui apporter des solution viable. <strong>On est tous d'accord, on ne devrait pas avoir à 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écisément, nous allons utiliser une règle et un connecteur pour dérouter les messages destinés au domaine <code>free.fr</code> et <code>orange.fr</code> vers un serveur SMTP externe qui va servir de relais. S’il existe bien des services de relai SMTP sur Internet, ces services nécessitent soit une authentification, soit une restriction sur une adresse IP. Problème, il n’est pas possible de s’authentifier sur un connecteur sortant, et Microsoft utilise une multitude d’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’adresses IP. Il existe toutefois un petit risque que d’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érer de multiples plages d’adresses IP sources à relayer. J’ai utilisé <a href="https://www.hmailserver.com/" target="_blank" rel="noopener">HMailServer</a> sous Windows car je le connais bien, mais on doit pouvoir faire ça sous Linux à moindre frais. Quant à la restriction au niveau des IP sources, ça peut aussi se faire au niveau du firewall.</p>
|
|
<p style="text-align: justify;">Dans HMailServer (IP Ranges) on va déclarer nos adresses IP autorisé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épète ça pour chaque plage d’IP et ensuite de la même façon on va déclarer nos relais autorisés, les mê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éclarer 107.47.0.0/17, mais ici c’est ainsi.</p>
|
|
<p style="text-align: justify;">Ensuite on s’assurera que notre serveur est correctement installé (il n’accepte rien d’autre) et est correctement déclaré et configuré (<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’assurer que l’on peut bien les joindre et que notre IP publique n'est pas elle aussi blacklistée.</p>
|
|
<p style="text-align: justify;">A ce stade on se connecte à l’administration Exchange de Microsoft 365 dans laquelle on va faire en sorte que tous les mails à destination de Free et Orange devront transiter via l’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é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écide que ce connecteur s'applique à tous les messages à 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ère qu'un seul domaine.</li>
|
|
<li style="text-align: justify;">Soit on décide que ce connecteur ne s'applique qu'au messages qui ont été redirigés par une règle. On utilisera cette option dans le cas ou on souhaite rediriger uniquement certains mails, expéditeurs ou domaines sources, qui seront le fruit d'une règle à cré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é ou pas le connecteur fonctionne tout de même....</p>
|
|
<p style="text-align: justify;">Si l'on a fait le choix 2 il va nous falloir créer une règle pour que cela fonctionne. Dans cette règle on va demander à 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éditeur</li>
|
|
<li style="text-align: justify;">Et enfin que ce trafic transite via le connecteur précédemment créé.</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érouter vers notre MTA premise uniquement les domaines sources qui y seront configurés. Ce cas est spécifique à des tenant "partagés" ou plusieurs domaines coexistent, mais cela peut é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é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&data=05%7C01%7Cemmanuel.kerhoz%40valor.pro%7C2128fb1a675844927b7208dad9f84851%7Ce7c4dbca5a8147f49bdc2e2add8f6027%7C0%7C0%7C638061958640364822%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C5000%7C%7C%7C&sdata=qCmjd7Yur5ZUVxwL%2BWqKS8Ds3Yge%2FETQAAcjpTy3BSg%3D&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 à titre professionnel depuis plus de 10 ans avec une plutôt bonne expérience. J'en ai par exemple de gros qui fonctionnent encore très bien mais par exemple un RS3411xs de 2011 mérite d'être changé préventivement...</p>
|
|
<p style="text-align: justify;">Je commande donc un RS3621RPxs et 6 disques Western Digital Ultrastar HC530, un modèle que j'avais utilisé avec succès il y a deux mois dans un RS820RP+. Disque de classe entreprise. Et là c'est le flop, dans ce dernier NAS il apparaissent comme disques non vérifié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 à la recherche d'informations, le constat est des plus simples et probablement surtout mercantile. Synology vend maintenant ses propres disques en apposant leur étiquette sur des disques Toshiba, et les disques concurrents encore présent dans les listes de compatibilité sont de plus en plus rares. Rien de bien neuf sous le soleil, HPE, Dell et d'autres ont les mêmes pratiques. Saut que Synology nous avait d'une part habitué à pouvoir utiliser n'importe quel disque, le credo des fabricants de NAS, et surtout que les disques estampillés Synology sont peu disponibles et coutent souvent jusqu'à 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égales et de responsabilité vis à vis de mon client, je ne peux pas me permettre d'utiliser ces disque en production sensible. Donc Synology à gagné, 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édié à 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 été testés par Synology et sont certifiés pour fonctionner sans limitation.</li>
|
|
<li><strong>Incompatible :</strong> les disques incompatibles sont « mis sur liste noire » par Synology et ne peuvent pas être utilisés (les disques SMR sont inclus dans ce lot). Rien que du normal.</li>
|
|
<li><strong>Non vérifié :</strong> un disque qui n'a pas été testé par Synology est défini comme un lecteur non vérifié. 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érifiés sont utilisables dans un état non pris en charge avec les contraintes suivantes :</p>
|
|
<ul style="text-align: justify;">
|
|
<li>L'état d'un disque non vérifié peut apparaître comme <em><strong>non vérifié</strong></em> dans le gestionnaire de stockage de DSM.</li>
|
|
<li>Des avertissements s'afficheront lors de la sélection de lecteurs non vérifiés pour créer un pool de stockage.</li>
|
|
<li>Il est parfois impossible de créer des volumes de type SHR avec des disques non vérifiés.</li>
|
|
<li>Les pools de stockage contenant des lecteurs non vérifiés peuvent afficher un état de danger pouvant faire peur.</li>
|
|
<li>DSM peut envoyer des notifications d'avertissement lorsque des lecteurs non vérifiés sont en cours d'utilisation.</li>
|
|
<li>Les informations sur le lecteur telles que l'état de l'allocation, le nombre de secteurs défectueux, la température, le numéro de série, 4K natif peuvent ne pas être affichées.</li>
|
|
<li>La prise en charge de Synology sera limitée si le problème de prise en charge peut être lié au lecteur non vérifié (la décision de refuser la prise en charge reste à la discrétion de Synology)</li>
|
|
<li>L'utilisation de disques non vérifiés n'a aucun effet sur la garantie matérielle de Synology</li>
|
|
</ul>
|
|
<p>Bien sur cette liste n'est pas exhaustive et malheureusement Synology est resté vague sur le fonctionnement de leur classification de disques et de SSD. Par exemple…</p>
|
|
<ul>
|
|
<li>Les disques approuvés comme <strong><em>compatibles</em></strong> pour un modèle de NAS peuvent être <em><strong>non vérifiés</strong></em> pour un autre modèle.</li>
|
|
<li>Les disques approuvés comme <em><strong>compatibles</strong></em> peuvent voir leur classification changée en <strong><em>incompatible</em></strong> ou <em><strong>non vérifié</strong></em> sans préavis par Synology.</li>
|
|
<li>La compatibilité du lecteur est liée à la version du micrologiciel du lecteur.</li>
|
|
<li>Le test des disques nouvellement sortis est souvent retardé de plusieurs mois.</li>
|
|
<li>Le résultat de ces classifications de disques est que l'achat de disques <em><strong>c</strong><strong>ompatibles</strong></em> est souvent limité à <span style="color: #ecf0f1;">des</span> disques rares dans le commerce, avec des micrologiciels obsolètes, qui sont soit indisponibles à la vente, soit en nombre insuffisant, auprès de fournisseurs non éprouvés, à des coûts non compétitifs.</li>
|
|
</ul>
|
|
<p>De manière ré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é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ées pendant quelques jours... Et si ça se passe mal on n'hésite pas à renvoyer les disques.</p>
|
|
<p style="text-align: justify;">Si ça se passe bien on peut envisager deux contournements, l'un va faire croire que le disque a été vérifié, et l'autre que l'on ne s'occupe pas de vérifications... Et rien ne dit que de futures mises à jour ne rendront pas ce contournement obsolète.</p>
|
|
<p style="text-align: justify;"><span style="background-color: #e03e2d; color: #ecf0f1;"><strong>Attention :</strong> S'agissant de modifications de fichiers système, vous savez et comprenez ce que vous faites, je décline toute forme de responsabilité, tout comme les personnes qui ont trouvé ces hacks et les ont divulgués sur les forums cités en sources (non, ce n'es pas moi qui ait trouvé !).</span></p>
|
|
<p style="text-align: justify;">Cette mise en garde étant posée, j'ai trouvé deux possibilités :</p>
|
|
<p style="text-align: justify;"><strong>Première option, ajout du disque dans la liste de compatibilité</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 élévation. Enduite on va dans le répertoire idoine :</p>
|
|
<pre class="language-yaml"><code>cd /var/lib/disk-compatibility</code></pre>
|
|
<p style="text-align: justify;">Et on repère les fichiers <code>*_host.db</code> et <code>*_host.db.new</code> qu'il faudra éditer, par exemple dans mon cas <code>rs3621rpxs_host_v7.db</code> et <code>rs3621rpxs_host_v7.db.new</code>. Attention, tout ça peut évoluer avec le temps et les révisions. Avant d'é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 >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 édite avec VI et ça devrait donner quelque chose de ce genre :</p>
|
|
<pre class="language-yaml"><code>{"model":"WUH721816ALE6L4","firmware":"PCGNW232","rec_intvl”:[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é compatible <em>(notamment la dernière information en fin de ligne)</em>.</p>
|
|
<p style="text-align: justify;"><strong>Seconde option, ne pas vérifier la compatibilité</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 à jour. Il faut donc la refaire à chaque fois, et toujours en partant du fichier original qui contient d'autres informations qui peuvent é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 à jour).</span></em></span></p>
|
|
<p style="text-align: justify;">J'aurais tendance à préférer cette option bien plus simple. Mais ça sous entend que nos disque soient testés et non incompatibles. On passe toujours par SSH et on va é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> à <code>no</code>.</p>
|
|
<pre class="language-yaml"><code>support_disk_compatibility="no"</code></pre>
|
|
<p style="text-align: justify;">On peut bien sur é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 à 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'éditer avec son éditeur préféré, 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 é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émarre le NAS et nos disques ne devrait plus s'afficher en rouge. Cependant ça ne joue pas sur les unité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èmerie. D'autant plus que d'autres fabricants seront surement tentés de faire de mê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ésents, pour de louables raisons, est une bonne chose. Il serait par contre raisonnable que l'utilisateur informé puisse les supprimer, notamment quand un disque est largement reconnue par la communauté. Mais il y a également les mauvaises raisons, comme pour les extensions mémoire ou une barrette Crucial à 100 € fonctionnera parfaitement là ou Synology nous en demande près de 400 ! On pourrait é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ées</a>, pas pire que d'autres...</p>
|
|
<p style="text-align: justify;">Une alternative consistera à intégrer du logiciel Open Source (FreeNAS, TrueNAS, etc.) dans des serveurs recyclés disposant d'un bon support disque (HPE par exemple) que l'on trouve à des tarifs intéressant sur le marché du reconditionné. Ca fait du NAS dédié stockage pas cher et fiable. Je précise stockage, car contrairement à ce que veulent nous faire croire les fabricants, il faut, à mon sens, oublier l'idée d'installer tout et n'importe quoi sur un NAS, mais c'est là un autre dé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;"> </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";} |