Vous allez me demander pourquoi gérer les onduleurs sur Home Assistant ? Simplement pour être avertit en cas de coupure électrique via une notification (si on est en déplacement il peut être intéressant d'envoyer une personne de confiance réarmer en cas d'une défaillance locale, histoire de ne pas perdre le contenu du congélateur (vécu)), ensuite exécuter des actions sur ce qui est secouru et en dernier ressort éteindre le serveur. Les informations ainsi remontées donneront également des indication sur l'état des batteries afin de les changer préventivement.
J'ai souvent des coupures à la campagne, j'ai deux gros onduleurs réseau de marque APC et je me suis dès mes débuts intéressé à eux avec ce que j'ai alors trouvé de plus simple.
APC UPS Daemon
ApcUpsd s'installe sous la forme d'un addon et la suite est intégrée à Home Assistant.
On ajoute aux addons ce repository : https://github.com/korylprince/hassio-apcupsd et on installe la version IP ou USB qui nous convient. Et on configure.
name: APC UPS
cable: ether
type: snmp
device: 192.168.210.6
Ensuite on ajoute ça dans configuration.yaml
:
apcupsd:
Ainsi que quelques sensors :
- platform: apcupsd
resources:
- apc
- date
- hostname
- version
- upsname
- cable
- driver
- upsmode
- starttime
- model
- status
- linev
- loadpct
- bcharge
- timeleft
- mbattchg
- mintimel
- maxtime
- maxlinev
- minlinev
- outputv
Et on termine avec un binary :
- platform: apcupsd
name: UPS
Les paquets sont marqués obsolètes, mais pour l'instant j'utilisait ça depuis un an et ça fonctionne très bien.
SNMP
Si on dispose d'un onduleur réseau, ici APC, voici un "package" (mode pakage de HA) pour le faire en SNMP. Le gros avantage c'est qu'il n'y a absolument rien à installer, SNMP étant supporté de base dans Home Assistant. Attention c'est un peu long...
sensor:
- platform: snmp
name: ups_smart_750_capacity
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.2.2.1.0
accept_errors: true
unit_of_measurement: '%'
- platform: snmp
name: ups_smart_750_runtime_remaining
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.2.2.3.0
accept_errors: true
value_template: >-
{% set time = (value | int) / 100 | int %}
{% set minutes = ((time % 3600) / 60) | int %}
{% set hours = ((time % 86400) / 3600) | int %}
{% set days = (time / 86400) | int %}
{%- if time < 60 -%}
Less than a minute
{%- else -%}
{%- if days > 0 -%}
{{ days }}d
{%- endif -%}
{%- if hours > 0 -%}
{%- if days > 0 -%}
{{ ' ' }}
{%- endif -%}
{{ hours }}h
{%- endif -%}
{%- if minutes > 0 -%}
{%- if days > 0 or hours > 0 -%}
{{ ' ' }}
{%- endif -%}
{{ minutes }}m
{%- endif -%}
{%- endif -%}
- platform: snmp
name: ups_smart_750_load_percentage
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.4.2.3.0
accept_errors: true
unit_of_measurement: '%'
- platform: snmp
name: ups_smart_750_battery_temperature
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.2.2.2.0
accept_errors: true
unit_of_measurement: '°C'
- platform: snmp
name: ups_smart_750_battery_status
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.2.2.4.0
accept_errors: true
value_template: >-
{%if value == '1' %}
Good
{% elif value == '2' %}
Failed
{% endif %}
- platform: snmp
name: ups_smart_750_type
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.1.1.1.0
accept_errors: true
- platform: snmp
name: ups_smart_750_input_voltage
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.3.2.1.0
accept_errors: true
unit_of_measurement: 'V'
- platform: snmp
name: ups_smart_750_last_transfer_reason
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.3.2.5.0
accept_errors: true
value_template: >-
{%if value == '1' %}
No events
{% elif value == '2' %}
High line voltage
{% elif value == '3' %}
Brownout
{% elif value == '4' %}
Loss of mains power
{% elif value == '5' %}
Small temporary power drop
{% elif value == '6' %}
Large temporary power drop
{% elif value == '7' %}
Small spike
{% elif value == '8' %}
Large spike
{% elif value == '9' %}
UPS self test
{% elif value == '10' %}
Excessive input voltage fluctuation
{% endif %}
- platform: snmp
name: ups_smart_750_output_load
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.4.2.3.0
accept_errors: true
unit_of_measurement: '%'
- platform: snmp
name: ups_smart_750_output_current
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.4.2.4.0
accept_errors: true
unit_of_measurement: 'A'
- platform: snmp
name: ups_smart_750_last_self_test_result
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.7.2.3.0
accept_errors: true
value_template: >-
{%if value == '1' %}
OK
{% elif value == '2' %}
Failed
{% elif value == '3' %}
Invalid Test
{% elif value == '4' %}
Test In Progress
{% endif %}
- platform: snmp
name: ups_smart_750_last_self_test_date
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.7.2.4.0
accept_errors: true
- platform: snmp
name: ups_smart_750_communication_status
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.8.1.0
accept_errors: true
value_template: >-
{%if value == '1' %}
on
{% elif value == '2' %}
off
{% endif %}
- platform: snmp
name: ups_smart_750_status
host: 192.168.210.7
baseoid: 1.3.6.1.4.1.318.1.1.1.4.1.1.0
accept_errors: true
value_template: >-
{%if value == '1' %}
Unknown
{% elif value == '2' %}
On Line
{% elif value == '3' %}
On Battery
{% elif value == '4' %}
On Smart Boost
{% elif value == '5' %}
Timed Sleeping
{% elif value == '6' %}
Software Bypass
{% elif value == '7' %}
Off
{% elif value == '8' %}
Rebooting
{% elif value == '9' %}
Switched Bypass
{% elif value == '10' %}
Hardware Failure Bypass
{% elif value == '11' %}
Sleeping Until Power Returns
{% elif value == '12' %}
On Smart Trim
{% endif %}
homeassistant:
customize:
sensor.ups_smart_750_status:
device_class: connectivity
friendly_name: Smart-UPS status
sensor.ups_smart_750_capacity:
device_class: battery
NUT
Enfin on peut aussi utiliser NUT (Network UPS Tools) que beaucoup ici connaissent et qui est une légende dans le monde des UPS.
Pour ça il faut installer le serveur NUT que l'on trouvera dans les addons et qui communiquera avec vos onduleurs. Voici deux configurations à adapter selon que l'onduleur soit connecté en USB ou en IP. La documentation de NUT est une véritable bible des UPS et vous y trouverez ce qui vous manque.
USB
users:
- username: nut
password: MyPassword
instcmds:
- all
actions: []
devices:
- name: apc
driver: usbhid-ups
port: auto
config:
- desc = "APC Back-UPS 600VA"
- vendorid = 051d
mode: netserver
shutdown_host: 'false'
IP
users:
- username: nut
password: MyPassword
instcmds:
- all
actions: []
devices:
- name: apc_1400
driver: snmp-ups
port: 192.168.210.6
community: public
snmp_version: v1
pollfreq: 15
config:
- desc = "APC Smart-UPS 1400VA"
- name: apc_750
driver: snmp-ups
port: 192.168.210.7
community: public
snmp_version: v1
pollfreq: 15
config:
- desc = "APC Smart-UPS 750VA"
mode: netserver
shutdown_host: 'false'
A partir de là il faut aller dans les intégrations, ajouter l'intégration NUT, la configurer avec ces informations :
- Host : a0d7b954-nut
- Port : 3493
- Username : nut
- Password : MyPassword
Et ensuite choisir les seniors que l'on souhaite créer, utiliser et superviser.
Automations
Une fois que l'on dispose des sensors il sera possible d'effectuer des actions selon le comportement de ceux ci. Libre à vous d'imaginer, ou par exemple utiliser l'intégration Alert pour recevoir des notifications répétées.
ups_1:
name: UPS APC 1
entity_id: binary_sensor.ups
state: 'off' # Optional, 'on' is the default value
repeat:
- 10
- 30
- 60
- 300
can_acknowledge: true # Optional, default is true
skip_first: true # Optional, false is the default
message: "{{ states.sensor.date_time.state}} > A L A R M U P S | Coupure EDF"
done_message: "{{ states.sensor.date_time.state}} > A L A R M U P S | Rétablissement EDF"
notifiers:
- slack_hass_canaletto
- Free_Mobile
Voilà, un peu soporifique, je suis d'accord, mais le sujet n'est pas rigolo !