Code kopieren & zu File Editor
1# Synology NAS Monitoring Integration
2# Überwacht Synology DiskStation via REST API und SNMP
3
4# REST-API Basiskonfiguration
5# API muss in DSM aktiviert werden: Systemsteuerung > Terminal & SNMP > Web API aktivieren
6
7# System-Information
8sensor:
9 # Synology System Info über REST API
10 - platform: rest
11 name: "Synology System Info"
12 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
13 method: POST
14 payload: 'api=SYNO.Core.System&version=1&method=info'
15 headers:
16 Content-Type: application/x-www-form-urlencoded
17 value_template: "{{ value_json.data.model if value_json.success else 'Offline' }}"
18 json_attributes_path: "$.data"
19 json_attributes:
20 - cpu_family
21 - cpu_series
22 - model
23 - ram_size
24 - serial
25 - version
26 - version_string
27 scan_interval: 3600
28
29 # CPU Auslastung
30 - platform: rest
31 name: "Synology CPU Usage"
32 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
33 method: POST
34 payload: 'api=SYNO.Core.System.Utilization&version=1&method=get'
35 headers:
36 Content-Type: application/x-www-form-urlencoded
37 value_template: "{{ value_json.data.cpu.user_load if value_json.success else 0 }}"
38 unit_of_measurement: "%"
39 scan_interval: 60
40 icon: "mdi:cpu-64-bit"
41
42 # RAM Auslastung
43 - platform: rest
44 name: "Synology Memory Usage"
45 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
46 method: POST
47 payload: 'api=SYNO.Core.System.Utilization&version=1&method=get'
48 headers:
49 Content-Type: application/x-www-form-urlencoded
50 value_template: >
51 {% if value_json.success %}
52 {{ (value_json.data.memory.real_usage * 100 / value_json.data.memory.memory_size) | round(1) }}
53 {% else %}
54 0
55 {% endif %}
56 unit_of_measurement: "%"
57 scan_interval: 60
58 icon: "mdi:memory"
59
60 # Netzwerk-Traffic (Download)
61 - platform: rest
62 name: "Synology Network RX"
63 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
64 method: POST
65 payload: 'api=SYNO.Core.System.Utilization&version=1&method=get'
66 headers:
67 Content-Type: application/x-www-form-urlencoded
68 value_template: >
69 {% if value_json.success %}
70 {{ (value_json.data.network[0].rx / 1024 / 1024) | round(2) }}
71 {% else %}
72 0
73 {% endif %}
74 unit_of_measurement: "MB/s"
75 scan_interval: 30
76 icon: "mdi:download"
77
78 # Netzwerk-Traffic (Upload)
79 - platform: rest
80 name: "Synology Network TX"
81 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
82 method: POST
83 payload: 'api=SYNO.Core.System.Utilization&version=1&method=get'
84 headers:
85 Content-Type: application/x-www-form-urlencoded
86 value_template: >
87 {% if value_json.success %}
88 {{ (value_json.data.network[0].tx / 1024 / 1024) | round(2) }}
89 {% else %}
90 0
91 {% endif %}
92 unit_of_measurement: "MB/s"
93 scan_interval: 30
94 icon: "mdi:upload"
95
96# Storage/Volume Information
97 - platform: rest
98 name: "Synology Storage Info"
99 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
100 method: POST
101 payload: 'api=SYNO.Storage.CGI.Storage&version=1&method=load_info'
102 headers:
103 Content-Type: application/x-www-form-urlencoded
104 value_template: >
105 {% if value_json.success and value_json.data.volumes %}
106 {{ value_json.data.volumes | length }}
107 {% else %}
108 0
109 {% endif %}
110 unit_of_measurement: "Volumes"
111 json_attributes_path: "$.data.volumes[0]"
112 json_attributes:
113 - size_total
114 - size_used
115 - size_free
116 - status
117 - fs_type
118 scan_interval: 300
119
120 # Festplatten-Status
121 - platform: rest
122 name: "Synology Disk Info"
123 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
124 method: POST
125 payload: 'api=SYNO.Storage.CGI.HDD&version=1&method=list'
126 headers:
127 Content-Type: application/x-www-form-urlencoded
128 value_template: >
129 {% if value_json.success and value_json.data.disks %}
130 {{ value_json.data.disks | selectattr('status', 'equalto', 'normal') | list | length }}
131 {% else %}
132 0
133 {% endif %}
134 unit_of_measurement: "OK"
135 json_attributes_path: "$.data.disks"
136 json_attributes:
137 - id
138 - model
139 - serial
140 - status
141 - temp
142 - size_total
143 scan_interval: 600
144
145# SNMP-basierte Sensoren (Alternative/Ergänzung)
146 # System Uptime via SNMP
147 - platform: snmp
148 host: 192.168.1.200
149 community: public
150 baseoid: 1.3.6.1.2.1.1.3.0
151 name: "Synology Uptime SNMP"
152 unit_of_measurement: "Tage"
153 value_template: "{{ (value | int / 8640000) | round(1) }}"
154 scan_interval: 3600
155
156 # Temperatur via SNMP
157 - platform: snmp
158 host: 192.168.1.200
159 community: public
160 baseoid: 1.3.6.1.4.1.6574.1.2.0
161 name: "Synology Temperature SNMP"
162 unit_of_measurement: "°C"
163 scan_interval: 300
164 device_class: temperature
165
166 # Power Status via SNMP
167 - platform: snmp
168 host: 192.168.1.200
169 community: public
170 baseoid: 1.3.6.1.4.1.6574.1.3.0
171 name: "Synology Power Status SNMP"
172 scan_interval: 300
173
174# DSM Services Status
175 - platform: rest
176 name: "Synology DSM Services"
177 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
178 method: POST
179 payload: 'api=SYNO.Core.Service&version=1&method=get'
180 headers:
181 Content-Type: application/x-www-form-urlencoded
182 value_template: >
183 {% if value_json.success and value_json.data.services %}
184 {{ value_json.data.services | selectattr('enable', 'equalto', true) | selectattr('status', 'equalto', 'running') | list | length }}
185 {% else %}
186 0
187 {% endif %}
188 unit_of_measurement: "Services"
189 json_attributes_path: "$.data.services"
190 json_attributes:
191 - service
192 - display_name
193 - enable
194 - status
195 scan_interval: 300
196
197# Download Station Status (falls installiert)
198 - platform: rest
199 name: "Synology Download Station"
200 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
201 method: POST
202 payload: 'api=SYNO.DownloadStation.Info&version=1&method=getinfo'
203 headers:
204 Content-Type: application/x-www-form-urlencoded
205 value_template: >
206 {% if value_json.success %}
207 {{ value_json.data.version_string }}
208 {% else %}
209 "Nicht verfügbar"
210 {% endif %}
211 scan_interval: 3600
212
213 - platform: rest
214 name: "Synology Active Downloads"
215 resource: "http://192.168.1.200:5000/webapi/entry.cgi"
216 method: POST
217 payload: 'api=SYNO.DownloadStation.Task&version=1&method=list'
218 headers:
219 Content-Type: application/x-www-form-urlencoded
220 value_template: >
221 {% if value_json.success and value_json.data.tasks %}
222 {{ value_json.data.tasks | selectattr('status', 'equalto', 'downloading') | list | length }}
223 {% else %}
224 0
225 {% endif %}
226 unit_of_measurement: "Downloads"
227 scan_interval: 120
228
229# Template-Sensoren für benutzerfreundliche Darstellung
230 - platform: template
231 sensors:
232 synology_disk_usage_percent:
233 friendly_name: "Synology Speicher Nutzung"
234 unit_of_measurement: "%"
235 value_template: >
236 {% set total = state_attr('sensor.synology_storage_info', 'size_total') %}
237 {% set used = state_attr('sensor.synology_storage_info', 'size_used') %}
238 {% if total and used %}
239 {{ (used * 100 / total) | round(1) }}
240 {% else %}
241 0
242 {% endif %}
243 icon_template: >
244 {% set usage = states('sensor.synology_disk_usage_percent') | float %}
245 {% if usage < 70 %}mdi:harddisk
246 {% elif usage < 85 %}mdi:harddisk-plus
247 {% else %}mdi:harddisk-remove
248 {% endif %}
249
250 synology_disk_free_gb:
251 friendly_name: "Synology Freier Speicher"
252 unit_of_measurement: "GB"
253 value_template: >
254 {% set free = state_attr('sensor.synology_storage_info', 'size_free') %}
255 {% if free %}
256 {{ (free / 1024 / 1024 / 1024) | round(1) }}
257 {% else %}
258 0
259 {% endif %}
260
261 synology_system_status:
262 friendly_name: "Synology System Status"
263 value_template: >
264 {% set cpu = states('sensor.synology_cpu_usage') | float %}
265 {% set ram = states('sensor.synology_memory_usage') | float %}
266 {% set disk = states('sensor.synology_disk_usage_percent') | float %}
267 {% if cpu < 70 and ram < 80 and disk < 85 %}
268 Normal
269 {% elif cpu < 90 and ram < 95 and disk < 95 %}
270 Warnung
271 {% else %}
272 Kritisch
273 {% endif %}
274 icon_template: >
275 {% set status = states('sensor.synology_system_status') %}
276 {% if status == 'Normal' %}mdi:check-circle
277 {% elif status == 'Warnung' %}mdi:alert-circle
278 {% else %}mdi:alert-octagon
279 {% endif %}
280
281 synology_healthy_disks:
282 friendly_name: "Synology Gesunde Festplatten"
283 value_template: >
284 {% set disks = state_attr('sensor.synology_disk_info', 'id') %}
285 {% set status = state_attr('sensor.synology_disk_info', 'status') %}
286 {% if disks and status %}
287 {{ status | select('equalto', 'normal') | list | length }} / {{ disks | length }}
288 {% else %}
289 "Unbekannt"
290 {% endif %}
291 icon_template: "mdi:harddisk"
292
293# Binäre Sensoren für Alarme
294binary_sensor:
295 - platform: template
296 sensors:
297 synology_high_cpu_usage:
298 friendly_name: "Synology Hohe CPU Last"
299 value_template: "{{ states('sensor.synology_cpu_usage') | float > 80 }}"
300 device_class: problem
301 delay_on: "00:05:00"
302
303 synology_high_memory_usage:
304 friendly_name: "Synology Hoher Speicherverbrauch"
305 value_template: "{{ states('sensor.synology_memory_usage') | float > 90 }}"
306 device_class: problem
307 delay_on: "00:02:00"
308
309 synology_low_disk_space:
310 friendly_name: "Synology Wenig Speicherplatz"
311 value_template: "{{ states('sensor.synology_disk_usage_percent') | float > 85 }}"
312 device_class: problem
313 delay_on: "01:00:00"
314
315 synology_disk_failure:
316 friendly_name: "Synology Festplatten-Problem"
317 value_template: >
318 {% set status_list = state_attr('sensor.synology_disk_info', 'status') %}
319 {% if status_list %}
320 {{ 'normal' not in status_list or 'abnormal' in status_list or 'not_initialized' in status_list }}
321 {% else %}
322 false
323 {% endif %}
324 device_class: problem
325
326 synology_high_temperature:
327 friendly_name: "Synology Überhitzung"
328 value_template: "{{ states('sensor.synology_temperature_snmp') | float > 65 }}"
329 device_class: heat
330 delay_on: "00:10:00"
331
332 synology_offline:
333 friendly_name: "Synology Offline"
334 value_template: "{{ states('sensor.synology_system_info') == 'Offline' }}"
335 device_class: connectivity
336 delay_on: "00:05:00"
337
338# Automatisierungen für NAS-Monitoring
339automation:
340 - alias: "Synology Kritischer Speicher"
341 trigger:
342 platform: state
343 entity_id: binary_sensor.synology_low_disk_space
344 to: "on"
345 action:
346 - service: notify.mobile_app
347 data:
348 title: "💾 Synology Speicher knapp"
349 message: >
350 Nur noch {{ states('sensor.synology_disk_free_gb') }}GB frei
351 ({{ states('sensor.synology_disk_usage_percent') }}% belegt)
352 data:
353 tag: "nas_storage"
354 actions:
355 - action: "cleanup_nas"
356 title: "Aufräumen"
357
358 - alias: "Synology Festplatten-Alarm"
359 trigger:
360 platform: state
361 entity_id: binary_sensor.synology_disk_failure
362 to: "on"
363 action:
364 - service: notify.mobile_app
365 data:
366 title: "🚨 Synology Festplatten-Problem"
367 message: "Festplatte defekt oder nicht initialisiert!"
368 data:
369 tag: "nas_disk_failure"
370 color: "red"
371 sound: "alarm.wav"
372
373 - alias: "Synology Offline Alarm"
374 trigger:
375 platform: state
376 entity_id: binary_sensor.synology_offline
377 to: "on"
378 for: "00:05:00"
379 action:
380 - service: notify.mobile_app
381 data:
382 title: "📡 Synology nicht erreichbar"
383 message: "NAS ist offline oder nicht ansprechbar"
384 data:
385 tag: "nas_offline"
386
387 - alias: "Synology Hohe Temperatur"
388 trigger:
389 platform: state
390 entity_id: binary_sensor.synology_high_temperature
391 to: "on"
392 action:
393 - service: notify.mobile_app
394 data:
395 title: "🌡️ Synology Überhitzung"
396 message: "Temperatur: {{ states('sensor.synology_temperature_snmp') }}°C"
397
398 - alias: "Synology Download abgeschlossen"
399 trigger:
400 platform: state
401 entity_id: sensor.synology_active_downloads
402 to: "0"
403 condition:
404 condition: template
405 value_template: >
406 {{ trigger.from_state.state | int > 0 }}
407 action:
408 - service: notify.mobile_app
409 data:
410 title: "⬇️ Download abgeschlossen"
411 message: "Alle Downloads auf der Synology beendet"
412
413 - alias: "Synology Täglicher Status"
414 trigger:
415 platform: time
416 at: "08:00:00"
417 action:
418 - service: notify.mobile_app
419 data:
420 title: "📊 Synology Tagesbericht"
421 message: >
422 Status: {{ states('sensor.synology_system_status') }}
423 CPU: {{ states('sensor.synology_cpu_usage') }}%
424 RAM: {{ states('sensor.synology_memory_usage') }}%
425 Speicher: {{ states('sensor.synology_disk_usage_percent') }}%
426 ({{ states('sensor.synology_disk_free_gb') }}GB frei)
427 Festplatten: {{ states('sensor.synology_healthy_disks') }}
428
429# Scripts für NAS-Management
430script:
431 synology_cleanup:
432 alias: "Synology Aufräumen"
433 sequence:
434 - service: notify.persistent_notification
435 data:
436 title: "NAS Cleanup"
437 message: "Automatische Bereinigung wird ausgeführt..."
438 # Hier könnten weitere Aktionen wie Log-Rotation etc. stehen
439 - service: notify.mobile_app
440 data:
441 title: "🧹 Cleanup gestartet"
442 message: "Synology wird aufgeräumt"
443
444 synology_restart_services:
445 alias: "Synology Services neustarten"
446 sequence:
447 - service: notify.mobile_app
448 data:
449 title: "🔄 Services werden neugestartet"
450 message: "Synology Services werden neu gestartet"
451
452# Input Helper für Konfiguration
453input_boolean:
454 synology_monitoring_enabled:
455 name: "Synology Monitoring aktiviert"
456 initial: true
457 icon: "mdi:nas"
458
459 synology_critical_alerts:
460 name: "Kritische NAS Alarme"
461 initial: true
462 icon: "mdi:alert-octagon"
463
464input_number:
465 synology_storage_threshold:
466 name: "Speicher Alarm Schwelle"
467 min: 70
468 max: 95
469 step: 5
470 initial: 85
471 unit_of_measurement: "%"
472 icon: "mdi:harddisk"
473
474 synology_temp_threshold:
475 name: "Temperatur Alarm Schwelle"
476 min: 50
477 max: 80
478 step: 5
479 initial: 65
480 unit_of_measurement: "°C"
481 icon: "mdi:thermometer"
482
483# Utility Meter für Netzwerk-Statistiken
484utility_meter:
485 synology_network_daily:
486 source: sensor.synology_network_rx
487 cycle: daily
488 name: "Synology Traffic täglich"
489
490 synology_network_monthly:
491 source: sensor.synology_network_rx
492 cycle: monthly
493 name: "Synology Traffic monatlich"