Sida 7 av 11
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 26 mar 2014, 01:01
av NiclasF
Anledningen till att du får för få kWh per dag är troligen att de scripten du plankat inte använder sig av redundansen som jag har byggt in i protokollet. Om man saknar ett sekvensnummer så kan man titta på den sekundära sändarens (kW2 i scriptet) värde och använda det. I de allra flesta fall så räcker detta för att kunna återhämta sig från tappade paket.
Om man har perfekt miljö och inte några störningar så behövs inte detta, men i ditt fall verkar det vara nödvändigt. Du får uppdatera scripten liknande algoritmen på min blogg,
http://foogadgets.blogspot.se/2014/01/w ... meter.html
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 10 apr 2014, 23:14
av Alve
Tjena,
Jag köpte en "mätare" av Niclas och uppdaterade Domoticz scriptet lite som jag hittade här. Nu har jag testkört 5 dagar och med en förbrukning på 265kWh har jag mindre en 1kWh i avvikelse vilket jag är riktigt nöjd med. Detta trots att jag har 290st läsfel där jag "gissar" värdet. Kanske är det någon av er som har nytta mitt script.
Scriptet bygger på att ni kör på en Raspberry Pi men det funkar säger om ni läser igenom och ändar lite på sökvägarna till filerna. I filen error-counter.txt summerar den upp antalet läsfel som varit där scriptet "gissat" värdet istället.
Martin
Kod: Markera allt
commandArray = {}
-- Scriptname script_device_kwcount_ny.lua
-- Factor to calculate actual effect consumption
-- For 800 blinks per kW f=1.25, 1000 blinks per kW f=1, 10000 blinks per kW f=0.1
f=1
-- Dummy counter Idx value
kwCounterIndex = 131
local function readFile(sPath)
local file = io.open(sPath, "r")
if file then
local tLine = file:read()
file.close()
return tLine
end
return nil
end
local function writeFile(sPath, sLine)
local file = io.open(sPath, "w")
if file then
io.output(file);
io.write(sLine)
io.close()
end
end
if (devicechanged['kW1']) then
-- Läs ut värden och countervärde
kW1String = otherdevices_svalues['kW1']
new_counter_kW1 = tonumber(string.sub(kW1String,string.find(kW1String,';')+1,string.find(kW1String,';',-3)-1))
newValue=f*10*tonumber(string.sub(kW1String,1,string.find(kW1String,';',1,true)-1))
-- Läs senaste värdet på counter från fil
local aLine=readFile("/home/pi/kW1-last.txt")
if aLine then
old_from_file=tostring(aLine)
old_counter_kW1 = tonumber(string.sub(old_from_file,string.find(old_from_file,';')+1,string.find(old_from_file,';',-3)-1))
end
-- Läs in totalräknare från fil
lastValue = 0
local aLine=readFile("/home/pi/effect-counter.txt")
if aLine then
lastValue=tonumber(aLine)
end
-- Om räknare stämmer med +1 från förra skriv till filer och avsluta
if (new_counter_kW1-1 == old_counter_kW1) then
lastValue=lastValue+newValue
writeFile("/home/pi/effect-counter.txt",tostring(lastValue))
writeFile("/home/pi/kW1-last.txt", tostring(kW1String))
-- Om annat uppdatera fel med +1, uppdatera senaste lästa värde och använd senaste avläsning till totalen.
else
errorValue = 0
local aLine=readFile("/home/pi/error_counter.txt")
if aLine then
errorValue=tonumber(aLine)
end
errorValue=errorValue+1
writeFile("/home/pi/error_counter.txt",tostring(errorValue))
lastValue=lastValue+newValue+newValue
writeFile("/home/pi/effect-counter.txt",tostring(lastValue))
writeFile("/home/pi/kW1-last.txt", tostring(kW1String))
end
-- Banka ihop en sträng att uppdater med
effectString=tostring(kwCounterIndex) .. "|0|" .. tostring(newValue*(60/55)*60) .. ";" .. tostring(lastValue)
-- Uppdatera dummy
commandArray = {}
commandArray['UpdateDevice']=effectString
end
return commandArray
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 10 apr 2014, 23:39
av NiclasF
Snyggt!
En stor förbättring du kan göra är, att istället för att gissa energiförbrukning när du missat ett paket, så kan du använda datat i den sekundära sensorn som hela tiden skickar det näst sista datat. På så sätt reducerar du felfrekvensen till i princip noll i väldigt många fall.
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 11 apr 2014, 10:11
av moffe
Jag är väldigt dålig med scriptande

Försökte läsa mig på din sida NiclasF men fick inte ihop ett LUA script av detta som jag kan köra.
Så om nån fixar till detta hör gärna av er...
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 12 maj 2014, 23:11
av Alve
Hej igen,
Nu har jag haft lite tid att uppdatera scriptet så att det även tar hänsyn till kW2. Efter att ha kört någon vecka ser det riktigt bra ut med enstaka läsfel. Scriptet bygger på att du kör Domoticz på en Pi men går att ändra om ni så önskar titta på de olika sökvägarna i scriptet och ändra till vad ni vill.
Scriptet skapar 4st filer :
effect-counter.txt denna innehåller summerad energi.
error-counter.txt denna räknar antalet läsfel då scriptet "gissar" värdet
kW2-counter.txt denna räknar hur många ggr kW2 används för att kW1 inte har mottagits
kW1-last.txt håller ordning på vad kW1 var senast
Hoppas någon har nytta av detta.
PS för att scriptet skall funka måste ni ställa in Dummy värde i början av scriptet och kW1 måste vara den temperatur med hösta räknaren (luftfuktighet)
Kod: Markera allt
commandArray = {}
-- Scriptname script_device_kwcount_201405.lua
-- Factor to calculate actual effect consumption
-- For 800 blinks per kW f=1.25, 1000 blinks per kW f=1, 10000 blinks per kW f=0.1
f=1
-- Dummy counter Idx value
kwCounterIndex = 131
-- File functions used to keep track of updated total value
-- The file effect-counter is saved to /
local function readFile(sPath)
local file = io.open(sPath, "r")
if file then
local tLine = file:read()
file.close()
return tLine
end
return nil
end
local function writeFile(sPath, sLine)
local file = io.open(sPath, "w")
if file then
io.output(file);
io.write(sLine)
io.close()
end
end
-- My temperature device is kW1 and kW2. Where kW1 is the primary and kW2 is secondary
-- I do not use the secondary one (kW2) in this script.
if (devicechanged['kW1']) then
-- Läs ut värden och countervärde
kW1String = otherdevices_svalues['kW1']
kW2String = otherdevices_svalues['kW2']
new_counter_kW2 = tonumber(string.sub(kW2String,string.find(kW2String,';')+1,string.find(kW2String,';',-3)-1))
new_counter_kW1 = tonumber(string.sub(kW1String,string.find(kW1String,';')+1,string.find(kW1String,';',-3)-1))
newValue_kW1=f*10*tonumber(string.sub(kW1String,1,string.find(kW1String,';',1,true)-1))
newValue_kW2=f*10*tonumber(string.sub(kW2String,1,string.find(kW2String,';',1,true)-1))
-- Läs senaste värdet på counter från fil
local aLine=readFile("/home/pi/kW1-last.txt")
if aLine then
old_from_file=tostring(aLine)
old_counter_kW1 = tonumber(string.sub(old_from_file,string.find(old_from_file,';')+1,string.find(old_from_file,';',-3)-1))
end
-- Läs in totalräknare från fil
lastValue = 0
local aLine=readFile("/home/pi/effect-counter.txt")
if aLine then
lastValue=tonumber(aLine)
end
-- Om räknare stämmer med +1 från förra skriv till filer och avsluta eller om räknare är 0
if (new_counter_kW1-1 == old_counter_kW1 or new_counter_kW1 == 0) then
lastValue=lastValue+newValue_kW1
writeFile("/home/pi/effect-counter.txt",tostring(lastValue))
writeFile("/home/pi/kW1-last.txt", tostring(kW1String))
elseif (new_counter_kW2-1 == old_counter_kW1) then
kW2_errorValue = 0
local aLine=readFile("/home/pi/kW2-counter.txt")
if aLine then
kW2_errorValue=tonumber(aLine)
end
kW2_errorValue=kW2_errorValue+1
lastValue=lastValue+newValue_kW1+newValue_kW2
writeFile("/home/pi/effect-counter.txt",tostring(lastValue))
writeFile("/home/pi/test.txt", "kW1 " .. tostring(new_counter_kW1) .. "\n" .. "kW2 " .. tostring(new_counter_kW2) .. "\n" .. "Old counter from file " .. tostring(old_counter_kW1))
writeFile("/home/pi/kW2-counter.txt",tostring(kW2_errorValue))
writeFile("/home/pi/kW1-last.txt", tostring(kW1String))
-- Om annat uppdatera fel med +1, uppdatera senaste lästa värde och använd senaste avläsning till totalen.
else
errorValue = 0
local aLine=readFile("/home/pi/error-counter.txt")
if aLine then
errorValue=tonumber(aLine)
end
errorValue=errorValue+1
writeFile("/home/pi/error-counter.txt",tostring(errorValue))
lastValue=lastValue+newValue_kW1+newValue_kW1
writeFile("/home/pi/effect-counter.txt",tostring(lastValue))
writeFile("/home/pi/kW1-last.txt", tostring(kW1String))
end
-- Banka ihop en sträng att uppdater med
effectString=tostring(kwCounterIndex) .. "|0|" .. tostring(newValue_kW1*(60/58)*60) .. ";" .. tostring(lastValue)
-- now use this counter for our virtual effect sensor
commandArray = {}
commandArray['UpdateDevice']=effectString
end
return commandArray
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 09 sep 2014, 18:25
av NiclasF
Jag har gjort om Lua-koden ovan så att den fungerar till det nya protokollet som Wireless Pulse Counter använder.
http://foogadgets.tictail.com/product/w ... se-counter
En stor disclaimer dock: Jag ute på mycket tunn is nu. Jag har ingen egen installation av Domoticz och jag har heller aldrig kodat i Lua. Koden är bara torrsimmad, så det finns bara en liten möjlighet att det fungerar
Någon som har en WPC och som använder Domoticz får gärna prova koden.
Som default skrivs filer till /tmp/
WPC1-old-humidity.txt
WPC1-wrap-counter.txt
WPC1-old-energy-wh.txt
För att få korrekt momentan effektförbrukning så tar scriptet hänsyn till tiden mellan sändningarna.
Effektförbrukningen senaste minuten borde visas i kW och Totala Energiförbrukningen sedan start är i kWh
Kod: Markera allt
-- Scriptname script_device_wpc_1.lua
sensorName = “WPC1”
-- Dummy counter Idx value
kwCounterIndex = 131
-- Factor to calculate actual energy consumption
-- 800 blinks per kWh => 1000/800 => f=1.25
-- 1000 blinks per kWh => 1000/1000 => f=1
-- 10000 blinks per kWh => 1000/10000 => f=0.1
f = 1
-- File paths
baseDirPath = "/tmp/"
humFilePath = baseDirPath .. sensorName .. "-old-humidity.txt"
wrapFilePath = baseDirPath .. sensorName .. "-wrap-counter.txt"
energyFilePath = baseDirPath .. sensorName .. "-old-energy-wh.txt"
-- END OF CONFIGURATION PARAMETERS. CONFIGURATIONS ABOVE THIS LINE --
t1 = os.time()
s = otherdevices_lastupdate[sensorName]
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)
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
deltaT = os.difftime (t1, t2)
-- File function definitions
local function readFile(sPath)
local file = io.open(sPath, "r")
if file then
local tLine = file:read()
file.close()
return tLine
end
return nil
end
local function writeFile(sPath, sLine)
local file = io.open(sPath, "w")
if file then
io.output(file)
io.write(sLine)
io.close()
end
end
-- Wireless Pulse Counter device sensorName is WPC.
if (devicechanged[sensorName]) then
-- Read temperature and humidity value
WPCString = otherdevices_svalues[sensorName]
humidity = tonumber(string.sub(WPCString,string.find(WPCString,';')+1,string.find(WPCString,';',-3)-1))
temperature = tonumber(string.sub(WPCString,1,string.find(WPCString,';',1,true)-1))
if (temperature < 0) then
Counts = humidity*4096 - 10*temperature + 2048
else
Counts = humidity*4096 + 10*temperature
end
-- Read total amount of wrapp-arounds into "wrapCounter"
-- wrapCounter = 0
local aLine = readFile(wrapFilePath)
if aLine then
wrapCounter = tonumber(aLine)
end
if (humidity==0) then
-- Read the latest value into "oldHumidity"
oldHumidity = 0
local aLine = readFile(humFilePath)
if aLine then
oldHumidity = tonumber(aLine)
end
if (oldHumidity==100) then
wrapCounter = wrapCounter + 1
writeFile(wrapFilePath, tostring(wrapCounter))
end
end
writeFile(humFilePath, tostring(humidity))
-- Read total previous energy consumption into "oldTotalEnergyWh"
oldTotalEnergyWh = 0
local aLine = readFile(energyFilePath)
if aLine then
oldTotalEnergyWh = tonumber(aLine)
end
totalEnergyWh = f*(Counts + wrapCounter*413696)
deltaEnergy = totalEnergyWh - oldTotalEnergyWh
writeFile(energyFilePath, tostring(energyWh))
-- Concatinate a string to present ...
-- The Current Power usage in kW and the total energy consumption in kWh
outputString = tostring(kwCounterIndex) .. "|0|" .. tostring(deltaEnergy*60*(60/deltaT)/1000) .. ";" .. tostring(totalEnergyWh/1000)
-- now use this counter for our virtual effect sensor
commandArray = {}
commandArray['UpdateDevice'] = outputString
end
return commandArray
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 27 feb 2015, 21:13
av G-man
Jag kör Domoticz och denna pulsräknare, inga problem att få den att räkna men jag fattar inte hur jag ska få detta script att funka under windows...
detta tar jag emot senast
36 RFX 4400 0 El1 Temp + Humidity Viking 02035, 02038, TSS320 11.8 C, 53 % 5 100 Ta bort enhet Logg 2015-02-27 20:04:41
35 RFX 4600 0 El2 Temp + Humidity Viking 02035, 02038, TSS320 -51.6 C, 2 % 6 100 Ta bort enhet Logg 2015-02-27 20:01:47
Skriptet sparade jag ner i en Lua fil placerade den i scriptkatalogen, skapade tmp under scriptkatalogen men sen då? Ändrade sensornamnet i scriptet till El1 och Idx till 37 som den virtuella elmätaren fick.. händer inget, men uppdateringar får jag från den i form av olika temp och fuktighet!
Kod: Markera allt
-- Scriptname script_device_wpc_1.lua
sensorName = “El2”
-- Dummy counter Idx value
kwCounterIndex = 37
-- Factor to calculate actual energy consumption
-- 800 blinks per kWh => 1000/800 => f=1.25
-- 1000 blinks per kWh => 1000/1000 => f=1
-- 10000 blinks per kWh => 1000/10000 => f=0.1
f = 1
-- File paths
baseDirPath = "/tmp/"
humFilePath = baseDirPath .. sensorName .. "-old-humidity.txt"
wrapFilePath = baseDirPath .. sensorName .. "-wrap-counter.txt"
energyFilePath = baseDirPath .. sensorName .. "-old-energy-wh.txt"
-- END OF CONFIGURATION PARAMETERS. CONFIGURATIONS ABOVE THIS LINE --
t1 = os.time()
s = otherdevices_lastupdate[sensorName]
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)
t2 = os.time{year=year, month=month, day=day, hour=hour, min=minutes, sec=seconds}
deltaT = os.difftime (t1, t2)
-- File function definitions
local function readFile(sPath)
local file = io.open(sPath, "r")
if file then
local tLine = file:read()
file.close()
return tLine
end
return nil
end
local function writeFile(sPath, sLine)
local file = io.open(sPath, "w")
if file then
io.output(file)
io.write(sLine)
io.close()
end
end
-- Wireless Pulse Counter device sensorName is WPC.
if (devicechanged[sensorName]) then
-- Read temperature and humidity value
WPCString = otherdevices_svalues[sensorName]
humidity = tonumber(string.sub(WPCString,string.find(WPCString,';')+1,string.find(WPCString,';',-3)-1))
temperature = tonumber(string.sub(WPCString,1,string.find(WPCString,';',1,true)-1))
if (temperature < 0) then
Counts = humidity*4096 - 10*temperature + 2048
else
Counts = humidity*4096 + 10*temperature
end
-- Read total amount of wrapp-arounds into "wrapCounter"
-- wrapCounter = 0
local aLine = readFile(wrapFilePath)
if aLine then
wrapCounter = tonumber(aLine)
end
if (humidity==0) then
-- Read the latest value into "oldHumidity"
oldHumidity = 0
local aLine = readFile(humFilePath)
if aLine then
oldHumidity = tonumber(aLine)
end
if (oldHumidity==100) then
wrapCounter = wrapCounter + 1
writeFile(wrapFilePath, tostring(wrapCounter))
end
end
writeFile(humFilePath, tostring(humidity))
-- Read total previous energy consumption into "oldTotalEnergyWh"
oldTotalEnergyWh = 0
local aLine = readFile(energyFilePath)
if aLine then
oldTotalEnergyWh = tonumber(aLine)
end
totalEnergyWh = f*(Counts + wrapCounter*413696)
deltaEnergy = totalEnergyWh - oldTotalEnergyWh
writeFile(energyFilePath, tostring(energyWh))
-- Concatinate a string to present ...
-- The Current Power usage in kW and the total energy consumption in kWh
outputString = tostring(kwCounterIndex) .. "|0|" .. tostring(deltaEnergy*60*(60/deltaT)/1000) .. ";" .. tostring(totalEnergyWh/1000)
-- now use this counter for our virtual effect sensor
commandArray = {}
commandArray['UpdateDevice'] = outputString
end
return commandArray
Har någon en tydligare instruktion att dela med sig av?
Edit:
http://foogadgets.blogspot.se/2014/05/t ... unter.html native support as an RFXmeter in domotics... Den kom ju upp som tempmätare och fuktmätare nu iallafall
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 28 feb 2015, 14:17
av G-man
Det är inte möjligtvis någon som kör detta luna script under windows med domotics som känner för att slänga upp innehållet i sitt lunascript så man har ett exemple på hur det ser ut hos er och skriva vilka IDX dummy resp sensorerna har?
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 01 maj 2015, 11:38
av redina
Har hållit på att fixa till det skriptet för PWS. Nu kompilerar det utan fel (tror jag). Detta skript innehåller en massa print och en loggning till fil. Detta kan tas bort om man vill. Har även ändrat lite i hur det funkar när hum går runt till 0 igen, (lite säkrare om man missar en sändning vi fel tidpunkt).
Fråga hur fungerar värdena i redundanssändningen, förstår inte riktigt?
Kod: Markera allt
-- Scriptname script_device_wpc_1.lua
print("Enter Scriptname script_device_wpc_1.lua")
sensorName = "kW1"
-- Dummy counter Idx value
kwCounterIndex = 59
-- Factor to calculate actual energy consumption
-- 800 blinks per kWh => 1000/800 => f=1.25
-- 1000 blinks per kWh => 1000/1000 => f=1
-- 10000 blinks per kWh => 1000/10000 => f=0.1
f = 1
-- File paths
baseDirPath = "/tmp/"
humFilePath = baseDirPath .. sensorName .. "-old-humidity.txt"
wrapFilePath = baseDirPath .. sensorName .. "-wrap-counter.txt"
energyFilePath = baseDirPath .. sensorName .. "-old-energy-wh.txt"
lastUpdateFilePath = baseDirPath .. sensorName .. "-last-update.txt"
logFilePath = baseDirPath .. sensorName .. "-log.txt"
-- END OF CONFIGURATION PARAMETERS. CONFIGURATIONS ABOVE THIS LINE --
commandArray = {}
-- File function definitions
local function readFile(sPath)
print ("Läser fil " .. sPath)
local file = io.open(sPath, "r")
if file then
local tLine = file:read()
io.close(file)
return tLine
end
return nil
end
local function writeFile(sPath, sLine)
print ("Skriver fil " .. sPath .. " med data: " .. sLine)
local file = io.open(sPath, "w")
if file then
io.output(file)
io.write(sLine)
io.close(file)
end
end
local function appendFile(sPath, sLine)
print ("Skriver fil " .. sPath .. " med data: " .. sLine)
local file = io.open(sPath, "a")
if file then
io.output(file)
io.write(sLine)
io.close(file)
end
end
-- Wireless Pulse Counter device sensorName is WPC.
if (devicechanged[sensorName]) then
print("Sensor " .. sensorName .. " Change")
t1 = os.time()
-- Read total previous time when get sensor value
oldTime = t1 - 60 -- init if this is the first time
local aLine = readFile(lastUpdateFilePath)
if aLine then
oldTime = tonumber(aLine)
end
-- write new time
writeFile(lastUpdateFilePath, t1)
deltaT = os.difftime (t1, oldTime)
if(deltaT == 0) then
-- We don't wont div by zero
deltaT = t1 - 60
end
print("deltaT: " .. deltaT)
print("osTime: " .. t1)
print("lastUpdateTime: " .. oldTime)
-- Read temperature and humidity value
WPCString = otherdevices_svalues[sensorName]
humidity = tonumber(string.sub(WPCString,string.find(WPCString,';')+1,string.find(WPCString,';',-3)-1))
temperature = tonumber(string.sub(WPCString,1,string.find(WPCString,';',1,true)-1))
print("WPCString: " .. WPCString)
print("humidity: " .. humidity)
print("temperature: " .. temperature)
if (temperature < 0) then
Counts = humidity*4096 - 10*temperature + 2048
else
Counts = humidity*4096 + 10*temperature
end
-- Read total amount of wrap-arounds into "wrapCounter"
wrapCounter = 1
local aLine = readFile(wrapFilePath)
if aLine then
wrapCounter = tonumber(aLine)
end
local aLine = readFile(humFilePath)
if aLine then
oldHumidity = tonumber(aLine)
else
oldHumidity = 0
end
-- Check if start over in humidity counter
if (humidity < oldHumidity) then
wrapCounter = wrapCounter + 1
writeFile(wrapFilePath, tostring(wrapCounter))
end
writeFile(humFilePath, tostring(humidity))
-- Read total previous energy consumption into "oldTotalEnergyWh"
oldTotalEnergyWh = 0 -- init if this is the first time
local aLine = readFile(energyFilePath)
if aLine then
oldTotalEnergyWh = tonumber(aLine)
end
totalEnergyWh = f*(Counts + wrapCounter*413696)
deltaEnergy = totalEnergyWh - oldTotalEnergyWh
print("deltaEnergy: " .. deltaEnergy)
writeFile(energyFilePath, tostring(totalEnergyWh))
-- Concatenate a string to present ...
-- The Current Power usage in kW and the total energy consumption in kWh
outputString = tostring(kwCounterIndex) .. "|0|" .. tostring(deltaEnergy*60*(60/deltaT)/1000) .. ";" .. tostring(totalEnergyWh/1000)
print("--> wpc: " .. outputString)
-- now use this counter for our virtual effect sensor
commandArray['UpdateDevice'] = outputString
logData = tostring(os.date()) .. ":WPCString:" .. WPCString .. ":wrapCounter:" .. wrapCounter .. ":oldTotalEnergyWh:" .. oldTotalEnergyWh .. ":totalEnergyWh:" .. totalEnergyWh .. "\n"
appendFile(logFilePath, logData)
print("No errors :)")
end
return commandArray
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 27 maj 2015, 09:28
av NiclasF
The X10-protocol need to be enabled to make the WPC from foogadgets to show up as an RFXmeter.
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 27 maj 2015, 09:30
av NiclasF
redina skrev:Har hållit på att fixa till det skriptet för PWS. Nu kompilerar det utan fel (tror jag). Detta skript innehåller en massa print och en loggning till fil. Detta kan tas bort om man vill. Har även ändrat lite i hur det funkar när hum går runt till 0 igen, (lite säkrare om man missar en sändning vi fel tidpunkt).
Fråga hur fungerar värdena i redundanssändningen, förstår inte riktigt?
...
This issue was resolved by enabling the X10-protocol so that the WPC shows up as an RFXmeter.
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 07 feb 2016, 19:52
av Niklas
Dålig på det här med Lua men jag försöker att få Domoticz att visa förbrukning i watt just nu (eller så nära just nu man kan komma).
Jag har en virtuell mätare med IDX 319 som självklart visar 0.0 Watt och 0.000 kWh. Jag måste förstås uppdatera den via Lua.
Hur skulle ett sånt script se ut? Håller på att labba lite med de som finns här i tråden men det är inte riktigt same same så att säga.
Domoticz läser och visar räknaren men sen behöver jag ju processa datan lite.
Edit:
Denna funkar men det blir fel värden eftersom att det inte räknas om. Vars behöver jag peta in f = 0.1?
Kod: Markera allt
--Domoticz Script to get medium actual energy between energy counter readings and puts it on a dummy device
--First create a dummy energy meter and two user variables as numbers.
--Then enter the details below
--Name of the real energy counter
energyCounter = 'Elräknare'
--ID of the created dummy energy meter with the new actual value
dummyEnergyMeterid = 319
--The names of two user variables to keep track of previous value due to wrong values from dummy in otherdevices_lastupdate and otherdevices_svalues
userVariableTimestamp = 'LastEnergyTimestamp'
userVariableLastCount = 'LastEnergyCount'
commandArray = {}
if devicechanged[energyCounter] then
--calculate new actual value
actual = ((tonumber(otherdevices_svalues[energyCounter]) - tonumber(uservariables[userVariableLastCount])))/((os.time()-uservariables[userVariableTimestamp])/3600)
--update dummy energy meter
commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. actual .. ";" .. otherdevices_svalues[energyCounter]}
--update user variables
commandArray[2] = {['Variable:'..userVariableTimestamp] = tostring(os.time())}
commandArray[3] = {['Variable:'..userVariableLastCount] = otherdevices_svalues[energyCounter]}
print("DummyEnergy: " .. actual .. " W, " .. otherdevices_svalues[energyCounter] .. " kWh")
end
return commandArray
Edit 2
Detta verkar funka. Som jag förstår så är det Wh som domoticz förväntar sig att apparaten rapporterar?
Kan ju vara helt ute och cykla också. Jag har klippt och klistrat hejvilt.

Den uppdaterar så snart elmätaren får en uppdatering från 1-wirenätet och då läser den värdet direkt från räknaren.
Kod: Markera allt
--Domoticz Script to get medium actual energy between energy counter readings and puts it on a dummy device
--First create a dummy energy meter and two user variables as numbers.
--Then enter the details below
f=0.1
local function readFile(sPath)
local file = io.open(sPath, "r")
if file then
local tLine = file:read()
file.close()
return tLine
end
return nil
end
-- Läs in totalräknare från fil
currval = 0
local aLine=readFile("/mnt/1wire/uncached/1D.B4090D000000/counter.A")
if aLine then
currval=tonumber(aLine)
end
--Name of the real energy counter
energyCounter = 'Elmätare'
--ID of the created dummy energy meter with the new actual value
dummyEnergyMeterid = 321
dummyEnergyMeterid2 = 320
--The names of two user variables to keep track of previous value due to wrong values from dummy in otherdevices_lastupdate and otherdevices_svalues
userVariableTimestamp = 'LastEnergyTimestamp'
userVariableLastCount = 'LastEnergyCount'
commandArray = {}
if devicechanged[energyCounter] then
--calculate new actual value
actual = ((tonumber(currval) - tonumber(uservariables[userVariableLastCount])))/((os.time()-uservariables[userVariableTimestamp])/3600)
--update dummy energy meters
commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. f*actual .. ";" .. currval/10}
commandArray[2] = {['UpdateDevice'] = dummyEnergyMeterid2 .. "|0|" .. f*actual}
--update user variables
commandArray[3] = {['Variable:'..userVariableTimestamp] = tostring(os.time())}
commandArray[4] = {['Variable:'..userVariableLastCount] = tostring(currval)}
print("DummyEnergy: " .. f*actual .. " W, " .. currval/10 .. " Wh, " .. "currval: " .. currval)
end
return commandArray
Edit 3: Näe, rapporten över förbukningen i kwh stämmer inte....
Edit 4:
Nu stämmer det här när jag tagit bort delningen på 10:
Men inte här:

- Domoticz_-_Google_Chrome_2016-02-11_11-09-13_96515241.png (23.79 KiB) Visad 12725 gånger
Jag har inte använt 3290kWh med denna räknare. Den är helt nyinstallerad.
Nåja...

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 19 feb 2016, 17:10
av Kall
Hallå.
Ny på detta och försöker få till det här med script och visning av elförbrukning.
Provade det här ovan men med id 3.
--Domoticz Script to get medium actual energy between energy counter readings and puts it on a dummy device
--First create a dummy energy meter and two user variables as numbers.
--Then enter the details below
--Name of the real energy counter
energyCounter = 'Elräknare'
--ID of the created dummy energy meter with the new actual value
dummyEnergyMeterid = 3
--The names of two user variables to keep track of previous value due to wrong values from dummy in otherdevices_lastupdate and otherdevices_svalues
userVariableTimestamp = 'LastEnergyTimestamp'
userVariableLastCount = 'LastEnergyCount'
commandArray = {}
if devicechanged[energyCounter] then
--calculate new actual value
actual = ((tonumber(otherdevices_svalues[energyCounter]) - tonumber(uservariables[userVariableLastCount])))/((os.time()-uservariables[userVariableTimestamp])/3600)
--update dummy energy meter
commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. actual .. ";" .. otherdevices_svalues[energyCounter]}
--update user variables
commandArray[2] = {['Variable:'..userVariableTimestamp] = tostring(os.time())}
commandArray[3] = {['Variable:'..userVariableLastCount] = otherdevices_svalues[energyCounter]}
print("DummyEnergy: " .. actual .. " W, " .. otherdevices_svalues[energyCounter] .. " kWh")
end
return commandArray
Men får då i loggen på domoticz som ligger på en rpi.
2016-02-19 16:04:59.717 Error: EventSystem: ...e/pi/domoticz/scripts/lua/script_device_ActualEnergy.lua:18: attempt to perform arithmetic on field '?' (a nil value)
2016-02-19 16:04:59.708 (RFXtrx) RFXMeter (Elräknare)
Nån som vet vad jag ska göra?
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 19 feb 2016, 18:29
av Niklas
Heter din räknare "Elräknare"?
Jag har pillat ihop ett eget script genom att sno grejer från olika script med en massa härlig print till loggen så att man ser att det verkar stämma:
Kod: Markera allt
--Domoticz Script to get medium actual energy between energy counter readings and puts it on a dummy device etc
f=0.1
--Name of the real energy counter
energyCounter = 'Elmätare'
--ID of the created dummy energy meter with the new actual value
dummyEnergyMeterid = 344
p1smart = 342
dummyEnergyWatt = 343
--The names of two user variables to keep track of previous value due to wrong values from dummy in otherdevices_lastupdate and otherdevices_svalues
userVariableTimestamp = 'LastEnergyTimestamp'
userVariableLastCount = 'LastEnergyCount'
commandArray = {}
if devicechanged[energyCounter] then
current_counter_value=tonumber(otherdevices_svalues[energyCounter])
time_diff = ((tonumber(current_counter_value) - tonumber(uservariables[userVariableLastCount])))/((os.time()-uservariables[userVariableTimestamp])/3600)
counts_since_last_read = tonumber(current_counter_value)-tonumber(uservariables[userVariableLastCount])
use_now_watt = f*time_diff
use_now_watt_rounded = math.floor(use_now_watt+0.5)
total_wh_used=current_counter_value*f
total_wh_used_rounded= math.floor(total_wh_used+0.5)
wh_used_since_last_read=counts_since_last_read*f
wh_used_since_last_read_rounded=math.floor(wh_used_since_last_read+0.5)
total_kwh_used=total_wh_used/1000
total_kwh_used_rounded=math.floor(total_kwh_used+0.5)
kwh_used_since_last_read=wh_used_since_last_read/1000
kwh_used_since_last_read_rounded=math.floor(kwh_used_since_last_read+0.5)
initial=current_counter_value-5537396
print("current_counter_value: " .. current_counter_value)
print("counts_since_last_read: " .. counts_since_last_read)
print("use_now_watt: " .. use_now_watt .. " (" .. use_now_watt_rounded .. ") W")
print("total_wh_used: " .. total_wh_used .. " (" .. total_wh_used_rounded .. ") Wh")
print("wh_used_since_last_read: " .. wh_used_since_last_read .. " (" .. wh_used_since_last_read_rounded .. ") Wh")
print("Used kWh since start: " .. total_kwh_used .. " (" .. total_kwh_used_rounded .. ") kWh")
print("Used kWh since last read: " .. kwh_used_since_last_read .. " (" .. kwh_used_since_last_read_rounded .. ") kWh")
--calculate new actual value
--update dummy energy meters
commandArray[1] = {['UpdateDevice'] = dummyEnergyMeterid .. "|0|" .. use_now_watt .. ";" .. initial}
commandArray[2] = {['UpdateDevice'] = p1smart .. "|0|" .. current_counter_value .. ";0;0;0;" .. use_now_watt .. ";0"}
commandArray[3] = {['UpdateDevice'] = dummyEnergyWatt .. "|0|" .. use_now_watt}
--update user variables
commandArray[4] = {['Variable:'..userVariableTimestamp] = tostring(os.time())}
commandArray[5] = {['Variable:'..userVariableLastCount] = tostring(current_counter_value)}
end
return commandArray
Jag har som du ser tre stycken virtuella mätare.
Jag följer riktlinjerna i Domoticz API men det är ändå något som inte stämmer trots att jag matar med rätt information.
Därför har jag tre mätare. Den ena är en P1 Smart Meter. Den visar korrekt på daglig förbrukning och watt som jag använder just nu men helt åt skogen fel om man kollar graferna. Där har jag använt tio tusentals watt. Den andra är en general kwh-counter nånting. Den visar korrekt watt just nu och rätt daglig förbrukning men sen är det inte mycket mer som stämmer. Sen har jag en sista som enbart är "Usage" (watt, just nu). Där är både visning och grafer korrekta.
Re: Mäta elförbrukning, Raspberry Pi & Domoticz.
Postat: 19 feb 2016, 21:27
av Kall
Ja den heter Elräknare, den trådlösa som sitter och räknar blink på elmätaren.
Sen läste jag att man skulle göra 2 st user variables som heter LastEnergyTimestamp och LastEnergyCount typ integer och värde 0.
Sen gjort en dummy under hardware och virtual sensor typ electric (instant + counter) den fick idx 3 under devices. Låter det rätt eller är jag ute och cyklar?
Fick då en ruta med visning under utility fliken, och den har inte uppdaterat sig eller visat nåt.
Får försöka med det senast du la upp nu och se vad som händer. Troligtvis är det skit bakom spakarna så det kan bli vad som helst.
Så då måste jag göra 3 st virtual sensors om jag förstår det rätt, namnet på dom spelar väl ingen roll?