Skrypt odejmujący p...
 
Powiadomienia
Wyczyść wszystko

Skrypt odejmujący pomiary z dwóch wodomierzy

4 Wpisów
2 Użytkownicy
0 Reactions
92 Wyświetleń
(@maciek90)
Wpisów: 54
Kontrybutor
Autor tematu
 

Mam w domu dwa wodomierze; jeden główny na cały dom i ogród, a drugi osobny tylko na ogród. Chodzi mi o wyliczenie różnicy między wskazaniami wodomierza głównego i tego na ogród. Próbowałem coś naskrobać przy pomocy ChatGPT, ale nie do końca udało mi się osiągnąć mój cel. Każdy skrypt który wypluł mi wspomniany ChatGPT po każdym uruchomieniu dodaje wyliczoną różnicę dwóch liczników do wyliczonej w poprzednim uruchomieniu wartości zapisanej w liczniku woda i ściek co powoduje, że wartość tego licznika rośnie w nieskończoność. Poniżej skrypt, który działa właśnie tak jak wyżej opisałem. Czy mógłby ktoś rzucić na niego okiem i powiedzieć co z nim jest nie tak?

 

return {
on = {
timer = {
'every 1 minutes' -- Uruchamia skrypt co jedną minutę
}
},
execute = function(domoticz)
local counter1 = domoticz.devices('NazwaLicznika1') -- Zastąp 'NazwaLicznika1' nazwą pierwszego licznika
local counter2 = domoticz.devices('NazwaLicznika2') -- Zastąp 'NazwaLicznika2' nazwą drugiego licznika
local resultCounter = domoticz.devices('woda i ściek') -- Zastąp 'woda i ściek' nazwą licznika, do którego zapisywana jest różnica

local count1 = counter1.counter -- Pobiera wartość licznika 1
local count2 = counter2.counter -- Pobiera wartość licznika 2

local difference = count1 - count2 -- Oblicza różnicę

resultCounter.updateCounter(difference) -- Aktualizuje wartość trzeciego licznika o obliczoną różnicę
end
}
 
Dodane : 05/07/2024 4:07 am
isom
 isom
(@isom)
Wpisów: 5109
Szef wszystkich szefów Moderator Zasłużony dla Forum, Donator 2K19, Donator 2K20
 

Dodane przez: @maciek90

co z nim jest nie tak?

Użycie licznika do wskazywania różnicy jest nie tak 🙂 Użyj do tych wskazań Custom Sensor wtedy przy każdej aktualizacji u Ciebie co minutę stara wartość zostanie nadpisana nową.

Urządzenie typu Licznik ma za zadanie dodawać  do poprzedniej wartości nową bo mierzy coś w interwale czasowym, np co godzinę, więc jeśli w pierwszej godzinie zużyto 2 a w drugiej 4, to licznik ma to zsumować a nie podmienić 2 na 4.

Jak poświęcisz trochę więcej czasu niż ślepe przepisanie tego co zasugerował ChatGPT i prześledzisz to forum, to znajdziesz prawie gotowe przykłady z użyciem CustomSensor zamiast Counter. 

 
Dodane : 05/07/2024 7:31 am
(@maciek90)
Wpisów: 54
Kontrybutor
Autor tematu
 

Twoja podpowiedź jak zwykle okazała się przełomowa. Chciałbym jednak dokonać jeszcze pewnej korekty wyświetlania wartości. Obecnie wygląda to u mnie tak:

obraz

Jak widać matematycznie wygląda to tak: Woda = Woda ogólny - Woda ogród. W Custom sensor Woda widać wyliczoną jedynie różnicę ogólną liczników. Czy da się zrobić, żeby w Custom sensor (lub też innym urządzeniu) wyliczana była również różnica dobowego zużycia wody?

 
Dodane : 06/07/2024 1:56 am
(@maciek90)
Wpisów: 54
Kontrybutor
Autor tematu
 

Dodałem jeszcze oprócz Custom sensora urządzenie Licznik. Różnica ogólna zliczana jest prawidłowo, zarówno w Custom Sensorze jak i w Liczniku, ale nie aktualizuje się różnica dobowa, cały czas widnieje 0.

obraz

Skrypt jak poniżej. Czy jakaś dobra dusza podpowie co należy dopisać aby również dobowa różnica była obliczana?

return {
    active = true,
    on = {
        devices = { 'Woda ogólny', 'Woda ogród' }
    },
    logging = {
        level = domoticz.LOG_DEBUG,
        marker = "Counter Difference Script"
    },
    execute = function(domoticz, device)
        domoticz.log('Skrypt uruchomiony z powodu zmiany stanu urządzenia: ' .. device.name, domoticz.LOG_DEBUG)
        
        local count1 = domoticz.devices('Woda ogólny').counter
        local count2 = domoticz.devices('Woda ogród').counter
        local resultCounter = domoticz.devices('licznik woda test')
        
        domoticz.log('Woda ogólny: ' .. tostring(count1), domoticz.LOG_DEBUG)
        domoticz.log('Woda ogród: ' .. tostring(count2), domoticz.LOG_DEBUG)
        
        if count1 ~= nil and count2 ~= nil then
            local difference = count1 - count2
            domoticz.log('Różnica: ' .. tostring(difference), domoticz.LOG_DEBUG)
            resultCounter.updateCounter(difference)
        else
            domoticz.log('Jedno z urządzeń ma wartość nil', domoticz.LOG_ERROR)
        end
    end
}
 
Dodane : 06/07/2024 7:33 pm
Udostępnij: