Monitorowanie czasu pracy urządzeń podłączonych do sieci w Raspberry Pi i Domoticzu.

Mój domowy system oparty na Domoticzu sukcesywnie się rozbudowuje. Coraz więcej urządzeń wysyła i odbiera dane. Z każdym tygodniem wzrasta ilość podłączonych do sieci czujników i przekaźników. W poniższym wpisie pokaże w jaki sposób monitorować, jak długo dane urządzenie jest aktywne. Może się to przydać np. do określenia jak długo dzieci oglądały TV lub grały na Playstation czy ile czasu było włączone oświetlenie zewnętrzne.

Wykorzystamy do tego prosty skrypt w języku LUA. Na początku dodajemy nowy sprzęt System Alive Checker i konfigurujemy ustawienia. Sprawdza on po prostu, przy pomocy pinga czy urządzenie jest aktywne w sieci.

Screenshot_20170108_160031.png

Screenshot_20170119_214236.png

Następnie dodajemy wirtualny czujnik, który będzie odpowiedzialny za wizualizacje danych.

Screenshot_20170108_160437.png

Ustawiamy typ czujnika na „licznik przyrostowy”

Screenshot_20170108_160735.png

Sprawdzamy jakie idx zostało przydzielone dla nowego czujnika. Przechodzimy do katalogu domoticz/scripts/lua i tworzymy nowy skrypt

local timer_device_ID = 52

commandArray = {}
commandArray['UpdateDevice'] = timer_device_ID .. '|0|0'

local TotalMinutesOn = otherdevices_svalues['Licznik']
if otherdevices['OSMC'] == 'On' then
TotalMinutesOn = TotalMinutesOn + 1
end
commandArray['UpdateDevice'] = timer_device_ID .. '|0|' .. tostring(TotalMinutesOn)

return commandArray

gdzie:

XX – idx czujnika, Media center timer – nazwa licznika, Czas pracy media center – nazwa urządzenia

W zakładce Urządzenia pojawi się nasz licznik. Uzupełniamy pola jak poniżej.

Screenshot_20170108_161540.png

Efekt końcowy wygląda jak poniżej. Oczywiście pamiętamy o restarcie systemu.

Miłego szpiegowania 🙂

61 komentarzy do “Monitorowanie czasu pracy urządzeń podłączonych do sieci w Raspberry Pi i Domoticzu.

    • Dziękuje bardzo za ostrzeżenie. Sprawdziłem i na razie pokazuje prawidłowe dane. Może przy większej ilości monitorowanych urządzeń pojawią się problemy. Będę czujny i w razie błędów opiszę w poście.
      Pozdrawiam i dziękuje za komentarz.

      Polubienie

  1. Witam,
    Przepraszam, że zadaje zapewne takie błahe pytania ale jestem początkującym.
    proszę o wyjaśnienie tej kwestii, jak to po kolei zrobić:

    „Sprawdzamy jakie idx zostało przydzielone dla nowego czujnika (to wiem jak zrobić ;)). ale chodzi mi o to dalej – Przechodzimy do katalogu domoticz/scripts/lua i tworzymy nowy skrypt

    local timer_device_ID = XX

    commandArray = {}

    local TotalMinutesOn = otherdevices_svalues[‚Media center timer’]
    if otherdevices[‚Czas pracy media center’] == ‚On’ then
    TotalMinutesOn = TotalMinutesOn + 1
    end
    commandArray[‚UpdateDevice’] = timer_device_ID .. ‚|0|’ .. tostring(TotalMinutesOn)

    return commandArray

    gdzie:

    XX – idx czujnika, Media center timer – nazwa licznika, Czas pracy media center – nazwa urządzenia”

    jak utworzyć skrypt, jak go nazwać co on ma dokładnie zawierać.
    Z góry dziękuję za pomoc

    Polubienie

    • Witam.

      Po kolei. Logujemy się do Domoticza z konsoli.

      ssh pi@192.168.1.xxx ( adres raspberry pi w sieci )

      Przechodzimy do katalogu /lua

      cd domoticz/scripts/lua

      Uruchamiamy edytor nano i tworzymy plik ( u mnie np. script_time_playstation_update.lua )

      sudo nano script_time_playstation_update.lua

      Otworzy nam się pusty plik. Kopiujemy skrypt CTRL+C z postu i wklejamy do konsoli ( prawy klik ). Naciskamy CTRL+X i zapisujemy Y.

      I już. Restartujemy system i działa 🙂

      PS. Jeżeli używasz Raspbiana w trybie graficznym robisz wszystko w trybie okienkowym. W Windows używasz PUTTY do połączenia ssh. Można też użyć FileZilla.

      Mam nadzieję, że pomogłem. W razie problemów służę radą. Pozdrawiam.

      Polubione przez 1 osoba

      • Ten moment „script_time_playstation_update.lua” (swoją drogą warto zmienić w stosunku do przykładu 😉 ) jest ważny i wart dopisania w głównym tekście – faktem jest, że nazwa pliku nie jest sugerowana, a bez jej poprawnej składni skrypt nie zostanie uruchomiony.

        Skrypty uruchamiane czasowo muszą mieć początek nazwy script_time_XXX.lua. Inaczej nie będą regularnie wyzwalane przez demona Domoticz.

        Polubione przez 1 osoba

      • Witam. Bardzo dziękuję za uwagi. Bardzo istotny komentarz. Uzupełnienie w tekście. Nie wiedziałem dokładnie jak działają skrypty lua. Teraz jest to zdecydowanie jaśniejsze.
        Pozdrawiam.

        Polubienie

  2. Dziękuję za szybką odpowiedź.
    Jeszcze dwa pytania do tematu.
    1.
    Screenshot_20170108_171656.png – na stronie nie widze tego obrazka, co tam sie kryje?
    2.
    wklejamy to wszystko?
    <<<<>>>

    Polubienie

  3. Przepraszam nie wkleiło.
    to wszystko nalezy wkleic do tworzonego skryptu?

    local timer_device_ID = XX

    commandArray = {}

    local TotalMinutesOn = otherdevices_svalues[‚Media center timer’]
    if otherdevices[‚Czas pracy media center’] == ‚On’ then
    TotalMinutesOn = TotalMinutesOn + 1
    end
    commandArray[‚UpdateDevice’] = timer_device_ID .. ‚|0|’ .. tostring(TotalMinutesOn)

    return commandArray

    Polubienie

    • Tak. W linii – local timer_device_ID = XX zamieniamy XX na numer idx wirtualnego czujnika. Z użyciem edytora nano powinno wkleić. Koniecznie przez prawy klik myszy i wklei ( CTRL + V nie działa ). W ostateczności proponuje przepisać uważając na literówki.

      Dla pewności można jeszcze nadać prawa do wykonywania:

      sudo chmod 777 script_time_playstation_update.lua

      U nie nie było takiej potrzeby.

      Polubienie

  4. Witam

    pojawił się u mnie następujący błąd

    Error: EventSystem: in /home/pi/domoticz/scripts/lua/script_time_czas.lua: /home/pi/domoticz/scripts/lua/script_time_czas.lua:5: unexpected symbol near char(226)

    z czego może on wynikać?

    Polubienie

    • Witam.

      „unexpected symbol near char(226)” oznacza, że jest użyty nierozpoznawany znak. Pewnie znowu WordPress coś źle wyświetla. Popatrzę na skrypt. Na maila wyślę mój działający skrypt. Proszę o informacje czy zadziałał. Sukcesywnie będę umieszczał skrypty w załącznikach, pdf-ach lub na Dropboxie, ponieważ widzę, że WordPress faktycznie nie nadaje się do publikacji kodu. Proszę o cierpliwość.

      Polubienie

  5. Nie działa. Log poprawny – co minutę „2017-01-21 22:13:00.293 EventSystem: Script event triggered: /home/pi/domoticz/scripts/lua/script_time_osmc_timer.lua”; IDX prawidłowy – a mimo to czas nie zostaje naliczony i czujnik cały czas pokazuje wartość 0. Proszę o sugestie.

    Polubienie

  6. Te błędy to znak , – trzeba ręcznie je skasować i dawać znak apostrofu z klawiatury. Ok – mój problem rozwiązałem – skrypt działa w końcu (trzeba dokładnie powpisywać nazwy urządzenia i czujnika). Ale ten „System Alive Checker” jest jakiś niedopracowany – on wykrywa urządzenie w stanie „on” ale ma problem z wykryciem w stanie „off” – raz działa, raz nie działa; czasami zmienia to losowo mimo faktu, iż urządzenie jest wyłączone. nie mogę sobie z tym poradzić…

    Polubienie

    • Postaram się to dzisiaj ogarnąć. Będzie ciężko, bo po wczorajszym wybiciu bezpieczników w domu musiałem system na malinie stawiać od nowa 😉

      Zrobiłem to na podstawie monitorowania adresów MAC urządzeń. To rozwiązanie było na forum Domoticz – http://www.domoticz.com/forum/viewtopic.php?f=23&t=5256.

      Jest trochę trudniejsze. Wymaga zastosowania zmiennej użytkownika oraz arping. Do tego baza Domoticz się rozrasta, ale to akurat nie jest żadnym problemem.

      Polubienie

    • Ok zmieniłem skrypt się wykonuje ale licznik nie liczy muszę jeszcze sprawdzić nazwy i numery ale z tym to chyba sobie poradzę dzięki za pomoc

      Polubienie

  7. Cały czas pokazuje 0 min choć skrypt wykonuje się co 1 min i urządzenie jest aktywne, próbowałem już wszystkich możliwości z nazwami i nr. Proszę o radę z tymi nazwami
    local TotalMinutesOn = otherdevices_svalues[‚Media center timer’]
    tu nazwa licznika przyrostowego w opisanym przypadku „Media center timer” ?
    if otherdevices[‚Czas pracy media center’] == ‚On’ then
    czyli nazwa utworzonego sprzętu System Alive Checker o opisanym przypadku „Czas pracy TV ” ?
    a nr idx to nr wirtualnego licznika z zakładki urządzenia czy może sprzęt ?

    Polubienie

    • Nie wygląda na zbyt skomplikowane. Oczywiście przetestuje w wolnej chwili. Dziękuje za podrzucenie pomysłu.

      Moim zdaniem ten skrypt sprawdza tylko czy urządzenie jest w sieci i na tej podstawie zmienia stan przełącznika. Nic nie zlicza. Podobnie działa u mnie przełącznik KODI. Nie tylko sprawdza czy Kodi jest uruchomione ( zapisuje stany ) ale pozwala również sterować odtwarzaczem. Można to wykorzystać ( po zmianie typu przełącznika ) do monitorowania innych urządzeń.

      Polubienie

  8. @Up – tak masz rację, ale przecież o to nam chodzi – ten skrypt ma zastąpić niedziałający poprawnie „System Alive Checker”. A skrypt zliczający to osobna sprawa i może być ten co zaproponowałeś (jest na forum Domoticz również).

    Druga sprawa – jest ciekawy skrypt tutaj:

    https://www.domoticz.com/forum/viewtopic.php?f=38&t=11985&start=20#p99409

    T jeden skrypt, który ma działąć dla wielu urządzeń, których stan chcemy zliczać. Z tym, że jest problem – pomimo prawidłowych ustawień zlicza tylko ostatnie urządzenie. Ale warto by się nad tym pochylić – możesz zerknąć?

    Polubienie

  9. U mnie w logach taki problem
    EventSystem: in /home/pi/domoticz/scripts/lua/script_time_update.lua: /home/pi/domoticz/scripts/lua/script_time_update.lua:4: attempt to concatenate global ‚timer_device_ID’ (a nil value) i nie mogę sobie z tym poradzić

    Polubienie

  10. Nie mogę znaleźć przyczyny. Pogrzebałem w goolach ale ten problem może dotyczyć wielu rzeczy. Generalnie chyba jest błąd składni w skrypcie. Może jest jakaś literówka. Poniżej mój skrypt. Może pomoże.

    local timer_device_ID = 41

    commandArray = {}
    commandArray[‚UpdateDevice’] = timer_device_ID .. ‚|0|0’

    local TotalMinutesOn = otherdevices_svalues[‚Media center timer’]
    if otherdevices[‚Czas pracy TV’] == ‚On’ then
    TotalMinutesOn = TotalMinutesOn + 1
    end
    commandArray[‚UpdateDevice’] = timer_device_ID .. ‚|0|’ .. tostring(TotalMinutesOn)

    return commandArray

    Polubienie

  11. Cześć
    Nie działa mi Twój skrypt. W logach pojawia się komunikat EventSystem: Script event triggered: /home/pi/domoticz/scripts/lua/script_time_macmini.lua i nie za bardzo wiem o co chodzi 😦

    Polubienie

  12. Witam,
    Przerabiam (zmieniając wpisy nazw i urządzeń) ten prosty skrypt i ciągle się nie kompiluje.
    Powstawiałem Twoje nazwy i również nic. Dostaję comunikat:
    lua: ./lua/script_time_czas_pracy_urzadzen.lua:4: attempt to index global ‚otherdevices_svalues’ (a nil value)
    stack traceback:
    ./lua/script_time_czas_pracy_urzadzen.lua:4: in main chunk
    [C]: ?
    Może coś nie tak z ustawieniami w Domoticzu odnośnie skryptów LUA?
    Na pewno skrypt sie wykonuje bo licznik min działa.
    Pozdrawiam,

    Polubienie

  13. Witam, u mnie też nie działa. i mam kilka pytań co do tego:

    1. local timer_device_ID = xx (podajemy tu IDX mierzonego urządzenia, czy IDX utworzonego licznika?)
    2. local TotalMinutesOn = otherdevices_svalues[‚Licznik’] (nazwę czego wpisujemy w polu [‚LICZNIK’]?)
    3. if otherdevices[‚OSMC’] == ‚On’ then (nazwę czego wpisujemy w polu [‚OSMC’]?)

    W tutorialu jest to niezrozumiale opisane, i motam się z tym dłuższy czas

    Polubienie

  14. >Skrypt działa do restartu maliny, po restarcie pokazuje kosmiczne wartości. np. dzisiaj: 18446744073709551615 min.

    potwierdzam mam ten sam błąd 😦
    najciekawsze jest to ze wgrywając backup liczniki maja prawidłowe wartości natomiast seiczka robi sie jak dodam byle jakie urzadzenie czujnik itp itd wtedy jest wartosc z kosmou 18446744073709551615 min.

    Polubienie

  15. Mam tak samo – jakieś kosmiczne wartości. Ale ja muszę uruchamiać przez crontab. Nie działa mi script_time_Presence.lua
    Mój script_time_Presence.lua
    CODE: SELECT ALL

    function splitString(str, delim, maxNb)
    — Eliminate bad cases…
    if string.find(str, delim) == nil then
    return { str }
    end
    if maxNb == nil or maxNb < 1 then
    maxNb = 0 — No limit
    end
    local result = {}
    local pat = "(.-)" .. delim .. "()"
    local nb = 0
    local lastPos
    for part, pos in string.gmatch(str, pat) do
    nb = nb + 1
    result[nb] = part
    lastPos = pos
    if nb == maxNb then break end
    end
    — Handle the last field
    if nb ~= maxNb then
    result[nb + 1] = string.sub(str, lastPos)
    end
    return result
    end

    commandArray = {}
    maclist= uservariables['PRESENCE_LIST']
    Lines=splitString(maclist,"|")

    for i,line in pairs(Lines) do
    –print (i.." "..line)
    macs=splitString(line,";")
    print ("MAC Address to Poll: "..macs[1].." On IDX:"..macs[2])
    execcommand="sudo /home/domoticz/domoticz/scripts/Check_MAC.sh "..macs[1].." "..macs[2].." &"
    os.execute(execcommand)
    end

    Domoticz Log

    2019-12-07 16:04:00.300 Status: LUA: MAC Address to Poll: 90:2c:34:1f:12:4b On IDX:37
    2019-12-07 16:04:00.316 Status: LUA: MAC Address to Poll: d0:f8:8c:10:3b:eb On IDX:41
    2019-12-07 16:04:00.334 Status: LUA: MAC Address to Poll: d0:f8:6b:8c:57:bf On IDX:42
    2019-12-07 16:04:00.359 Status: LUA: MAC Address to Poll: 90:10:34:1a:b5:03 On IDX:39
    2019-12-07 16:05:00.296 Status: LUA: MAC Address to Poll: 4c:2b:34:1f:bb:4b On IDX:35

    jak uruchomię ręcznie lub z crontab
    sudo /home/domoticz/domoticz/scripts/Check_MAC.sh d0:f8:6b:8c:57:bf 42

    Domoticz log jest:

    2019-12-07 16:33:25.577 (Czasy) Light/Switch (Ania telefon czas)
    2019-12-07 16:33:25.570 Status: User: Admin initiated a switch command (42/Ania telefon czas/Off)
    jakby był jakiś problem z komendą LUA os.execute(execcommand)

    Używam Orange PI One z Armbian_19.11.3_Orangepione_buster_current_5.3.9

    Polubienie

  16. Po aktualizacji Domoticza do wersji 2020.1 skrypt całkiem oszalał (w poprzedniej wersji domotiza miałem podobnie – przy restarcie Domoticza pokazywało kosmiczne wartości, ale radziłem sobie z tym edytując bazę Domoticza (co prawda w nowej wersji 2020.1 jest problem z importem bazy, bo po imporcie muszę restartować Domoticza – nie widzi starych ustawień :(), ale teraz skrypt nie działa tak jak powinien (dodaje ilość minut bez względu na to czy urządzenie jest włączone czy nie i to po kilkadziesiąt jednostek na raz!.
    Czy mozna prosić o „naprawienie” skryptu, a może ktoś do „przetłumaczy” do na dzVents.

    Polubienie

Dodaj odpowiedź do raspberrywpraktyce Anuluj pisanie odpowiedzi