From ca39617aaf034fbaae882ddd083bb2da90ac659c Mon Sep 17 00:00:00 2001 From: Ivan Pavlina Date: Sun, 5 Apr 2020 23:15:53 +0200 Subject: [PATCH] Update docs and comments --- README.md | 13 ++++++++++++- .../mikrotik_router/mikrotikapi.py | 2 +- docs/assets/images/ui/accounting_sensor.jpg | Bin 0 -> 15030 bytes 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 docs/assets/images/ui/accounting_sensor.jpg diff --git a/README.md b/README.md index a2ccf8c..af9edfc 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Features: * System sensors (CPU, Memory, HDD) * Firmware update binary sensor * Switches to run scripts - * RX/TX traffic sensors per hosts from Mikrotik Accounting + * RX/TX WAN/LAN traffic sensors per hosts from Mikrotik Accounting feature # Integration preview ![Tracker and sensors](https://raw.githubusercontent.com/tomaae/homeassistant-mikrotik_router/master/docs/assets/images/ui/device_tracker.png) @@ -32,6 +32,8 @@ Features: ![NAT switch](https://raw.githubusercontent.com/tomaae/homeassistant-mikrotik_router/master/docs/assets/images/ui/nat.png) ![Queue switch](https://raw.githubusercontent.com/tomaae/homeassistant-mikrotik_router/master/docs/assets/images/ui/queue_switch.png) +![Accounting sensor](https://raw.githubusercontent.com/tomaae/homeassistant-mikrotik_router/master/docs/assets/images/ui/accounting_sensor.png) + # Setup integration Setup this integration for your Mikrotik device in Home Assistant via `Configuration -> Integrations -> Add -> Mikrotik Router`. You can add this integration several times for different devices. @@ -50,3 +52,12 @@ You can add this integration several times for different devices. ## List of detected devices ![Integration options](https://raw.githubusercontent.com/tomaae/homeassistant-mikrotik_router/master/docs/assets/images/ui/integration_devices.png) + +## Accounting +For per-IP throughput tracking Mikrotik's accounting feature is used. + +[Mikrotik support page](https://wiki.mikrotik.com/wiki/Manual:IP/Accounting) + +Before setting up integration in HA, go in Winbox IP-Accounting and setup the feature. Make sure that threshold is set to resonable value to store all connections between user defined scan interval. Max value is 8192 so for piece of mind i recommend setting that value. Web Access is not needed, integration is using API access. + +Integration will scan DHCP Lease table and ARP table to generate all known hosts and create two sensors for WAN traffic (mikrotik-XXX-wan-rx and mikrotik-XXX-wan-tx). If the parameter *account-local-traffic* is set in Mikrotik's accounting configuration it will also create two sensors for LAN traffic (mikrotik-XXX-lan-rx and mikrotik-XXX-lan-tx). \ No newline at end of file diff --git a/custom_components/mikrotik_router/mikrotikapi.py b/custom_components/mikrotik_router/mikrotikapi.py index dd69141..bcf1c83 100644 --- a/custom_components/mikrotik_router/mikrotikapi.py +++ b/custom_components/mikrotik_router/mikrotikapi.py @@ -514,7 +514,7 @@ class MikrotikAPI: # --------------------------- # take_accounting_snapshot - # Returns float -> seconds period between last run and current run + # Returns float -> period in seconds between last and current run # --------------------------- def take_accounting_snapshot(self) -> float: """Get accounting data""" diff --git a/docs/assets/images/ui/accounting_sensor.jpg b/docs/assets/images/ui/accounting_sensor.jpg new file mode 100644 index 0000000000000000000000000000000000000000..10583ed1646ce7f3cb101663e922aaba1193668e GIT binary patch literal 15030 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 literal 0 HcmV?d00001