Mäta elförbrukning, Raspberry Pi & Domoticz.

I detta forum hör diskussioner gällande teknik i största allmänhet och hemautomation i synnerhet hemma.

Moderator: elf98

Kategoriregler
Vill du visa bilder i ditt inlägg? Använd funktionen "Ladda upp bilaga" nedanför textrutan!
Användarvisningsbild
NiclasF
Tar hemautomation på allvar
Inlägg: 160
Blev medlem: 24 sep 2011, 00:55
Ort: Stockholm

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av NiclasF » 26 mar 2014, 01:01

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

Alve
Wannabe
Inlägg: 9
Blev medlem: 06 apr 2014, 23:27
Ort: Saltsjö-boo

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av Alve » 10 apr 2014, 23:14

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

Användarvisningsbild
NiclasF
Tar hemautomation på allvar
Inlägg: 160
Blev medlem: 24 sep 2011, 00:55
Ort: Stockholm

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av NiclasF » 10 apr 2014, 23:39

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.

moffe
Wannabe
Inlägg: 20
Blev medlem: 10 mar 2014, 19:47
Ort: Sweden

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av moffe » 11 apr 2014, 10:11

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...

Alve
Wannabe
Inlägg: 9
Blev medlem: 06 apr 2014, 23:27
Ort: Saltsjö-boo

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av Alve » 12 maj 2014, 23:11

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

Användarvisningsbild
NiclasF
Tar hemautomation på allvar
Inlägg: 160
Blev medlem: 24 sep 2011, 00:55
Ort: Stockholm

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av NiclasF » 09 sep 2014, 18:25

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

G-man
Wannabe
Inlägg: 7
Blev medlem: 25 dec 2014, 20:13
Ort: lkpg

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av G-man » 27 feb 2015, 21:13

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

G-man
Wannabe
Inlägg: 7
Blev medlem: 25 dec 2014, 20:13
Ort: lkpg

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av G-man » 28 feb 2015, 14:17

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?

redina
Wannabe
Inlägg: 15
Blev medlem: 23 jul 2012, 22:00
Ort: Uppsala

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av redina » 01 maj 2015, 11:38

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

Användarvisningsbild
NiclasF
Tar hemautomation på allvar
Inlägg: 160
Blev medlem: 24 sep 2011, 00:55
Ort: Stockholm

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av NiclasF » 27 maj 2015, 09:28

G-man skrev: ...

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
The X10-protocol need to be enabled to make the WPC from foogadgets to show up as an RFXmeter.

Användarvisningsbild
NiclasF
Tar hemautomation på allvar
Inlägg: 160
Blev medlem: 24 sep 2011, 00:55
Ort: Stockholm

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av NiclasF » 27 maj 2015, 09:30

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.

Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av Niklas » 07 feb 2016, 19:52

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:
Domoticz_-_Google_Chrome_2016-02-11_11-10-36_90618641.png
Men inte här:
Domoticz_-_Google_Chrome_2016-02-11_11-09-13_96515241.png
Domoticz_-_Google_Chrome_2016-02-11_11-09-13_96515241.png (23.79 KiB) Visad 4255 gånger
Jag har inte använt 3290kWh med denna räknare. Den är helt nyinstallerad.
Nåja... ;)

Kall
Wannabe
Inlägg: 7
Blev medlem: 19 feb 2016, 16:42
Ort: Arboga

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av Kall » 19 feb 2016, 17:10

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?

Niklas
Moderator
Inlägg: 1019
Blev medlem: 22 mar 2008, 21:13
Ort: Stockholm
Kontakt:

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av Niklas » 19 feb 2016, 18:29

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.

Kall
Wannabe
Inlägg: 7
Blev medlem: 19 feb 2016, 16:42
Ort: Arboga

Re: Mäta elförbrukning, Raspberry Pi & Domoticz.

Inlägg av Kall » 19 feb 2016, 21:27

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?

Skriv svar