Sinds ik de bedrijfsstatus van de warmtepomp volg, zijn mijn 1-wire DS18B20 thermische sensoren een klein beetje instabiel. Gemiddeld 1x per week geeft Domoticz voor alle 9 sensoren nulwaarden. Meestal keren de juiste waarden na 1 tot 10 minuten weer terug. Ik zag dat de “w1_slave” bestanden er op dat moment ook niet waren. Ik vermoed dat dit veroorzaakt werd door RF-interferentie van de relaiscontacten voor het schakelen van de circulatiepomp van de warmtepomp. In de logs zie ik dat die relais een aantal keer stuiteren bij het aan en uit-gaan. Ik heb het probleem opgelost door de voeding van de sensoren schakelbaar te maken. In plaats van continue voeding van de 3.3V pin komt de benodigde spanning nu van gpio-poort 17. Poort 17 heb ik bovendien een inschakelvertraging van 3 seconden gegeven in Domoticz.
Onderstaand lua-script wordt geïnitieerd door een device change. Als de voeding aan is en één van de sensoren nul geeft dan wordt de voeding uit- en weer ingeschakeld. Door de inschakelvertraging is dit voldoende om de sensoren te resetten.
-- -- Resetten sensoren als 0 of lang niet gezien -- -- commandArray = {} logging = false d = otherdevices device = "" for i, v in pairs(devicechanged) do if (#device == 0 or #i < #device) then device = i end end if (logging) then print("Triggered by " .. device .. " now " .. d[device]) end -- script moet niet zichzelf aanroepen, maar in principe alleen als 'Aanvoer T' verandert of als aanvoer T al lang niet meer aangepast, of de Voeding timer loopt af if (device == "Aanvoer T") or (uservariables['duur-aanvoer-T-niet-gezien'] - 60 > 0) or devicechanged['Voeding timer'] == "Off" then if ((otherdevices['Aanvoer T'] - 0.1 < 0 ) or (uservariables['duur-aanvoer-T-niet-gezien'] - 60 > 0)) and (otherdevices['Voeding temperatuursensors'] == "On") and (otherdevices['Voeding timer'] == "Off") then commandArray['SendEmail'] ="Aanvoer T 0#Aanvoer T "..otherdevices['Aanvoer T'].. " Duur aanvoer T niet gezien " .. uservariables['duur-aanvoer-T-niet-gezien'] .. "#youraccount@yourdomain.xyz" commandArray['Voeding temperatuursensors'] = "Off" commandArray['Voeding timer'] = "On" elseif (otherdevices['Voeding temperatuursensors'] == "Off") and (devicechanged['Voeding timer'] == "Off") then commandArray['Voeding timer'] = "On" commandArray['Voeding temperatuursensors'] = "On" end elseif (devicechanged['Voeding temperatuursensors']=="Off") then commandArray={['Voeding temperatuursensors']="On AFTER 3"} end return commandArray |
De Voeding timer is nodig om te zorgen dat de sensoren wel even de tijd krijgen om waarden door te geven voordat de voeding weer wordt uitgeschakeld. Ik heb nog een timer gebaseerd script lopen dat in de gaten houdt of 1 van de sensoren langere tijd niet wordt bijgewerkt.
-- --Zet duur uservariabele duur-aanvoer-T-niet-gezien s = otherdevices_lastupdate['Aanvoer T'] -- returns a date time like 2013-07-11 17:23:12 year = string.sub(s, 1, 4) month = string.sub(s, 6, 7) day = string.sub(s, 9, 10) hour = string.sub(s, 12, 13) minutes = string.sub(s, 15, 16) seconds = string.sub(s, 18, 19) commandArray = {} t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds} difference = (os.difftime (os.time(), t2)) --os.execute("sudo su pi --session-command '/bin/echo " .. os.time() .. " " .. t2 .. " " .. difference .. " s " .. s ..">>/home/pi/log/diftime '" ) commandArray['Variable:duur-aanvoer-T-niet-gezien']= tostring(difference) |