HC2 till InfluxDB

Post Reply
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

EDIT: Om du letar lösning så finns det flera versioner av en scen längre ner i tråden

Är det någon som lagrar HC2-information i InfluxDB ?

Hur kör ni över allt data?
Jag har testat att göra en scen som skickar över en del data men den känns lite statisk så jag funderar på andra varianter.

Finns ju lite att välja på... Göra en VD av "samma" kod, externt script eller kanske en egenknackad Telegraf-plugin eller så kan man använda pluginen exec.
Last edited by riro on 09 Nov 2017, 11:56, edited 1 time in total.
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

Berätta mer hur du gjort, har gjort några försök med node-red men då sparat till MySQL. Men inte fått till det som jag velat. Har du tänkt göra grafer med grafana också?
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

Just nu så har jag en scen som reagerar på properties från mina sensorer och så postar den helt enkelt iväg datat till InfluxDB's enkla api.
Har gjort lite enkla test-grafer med chronograf (ungefär samma lika som grafana), men har inte så mycket data ännu så det är ju inte så roligt. :)
Image


Ungefär så här ser i alla fall scenen ut nu

Code: Select all

--[[
%% properties
6 value
7 value
8 value
9 value
%% weather
%% events
%% globals
--]]

local doDebug = true
local sUrl = "http://192.168.100.10:8086/write?db=testdb"
local sMeasurement = "HomeCenter2"
-- local mySettings = json.decode( tostring( fibaro:getGlobalValue("set_IDs") ) )

msgDebug = function (color, message)
  if doDebug then
    fibaro:debug("<span style='color: " .. color .. "'>" .. tostring(message) .. "</span>")
  end
end

local startSource = fibaro:getSourceTrigger()
if (startSource['type'] ~= 'property') then
	msgDebug("Red", 'Started by trigger: ' .. startSource['type'] .. " / " .. tostring(startSource['name']) .. ", aborting!")
	fibaro:abort()
end

-- Collect data
iDeviceId = startSource["deviceID"]
iValue = fibaro:getValue(iDeviceId, "value")
sName = fibaro:getName(iDeviceId)
sDeviceType = fibaro:getType(iDeviceId)

msgDebug("Green", sName .. " (" .. tostring(iDeviceId) .. ") = " .. tostring(iValue) .. " (" .. sDeviceType .. ")" )

-- Compose API-post
sName = string.gsub(sName, " ", "\\ ")
sDeviceType = string.gsub(sDeviceType, " ", "\\ ")
local sPostData = sMeasurement .. ",Device\\ ID=" .. tostring(iDeviceId) .. ",Device\\ Type=" .. sDeviceType .. " " .. sName .. "=" .. tostring(iValue)
msgDebug("Gray", sPostData)

-- Post to API
local http = net.HTTPClient()
http:request(
	sUrl,
	{
		success = function (response)
			-- msgDebug("Green", "OK: " .. response.data)
		end,
	  error = function (err)
			msgDebug("Red", "Error: " ..err)
		end,
		options = {
			method = 'POST',
			data = sPostData
		}
	}
)
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

Tackar för att du delade med dig av din scen, detta kommer säkert bli roligt att pilla med på luncherna framöver :)
Har kommit igång lite smått nu, tur det är idol på tv :lol:
Attachments
Kaffe.PNG
Hcg.PNG
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

Lite uppdaterad scen som fixar lite mer... hanterar kWh från enheter samt att den rapporterar in vilken "unit" datat kommer i.

Är dock lite osäker på en sak, om unit inte finns är det då en binär sensor (dörr, rörelse, etc) eller finns det något annat bra sätt att veta om den är binär?
(Just nu rapporterar den in 0 eller 1 på binära sensorer)

Code: Select all

--[[
%% properties
6 value
7 value
31 power
32 power
%% weather
%% events
%% globals
--]]

local doDebug = true
local sInfluxDbAPI = "http://192.168.100.10:8086"
local sInfluxDbDB = "CasaWeRo"
local sMeasurement = "HomeCenter2"

msgDebug = function (color, message)
  if doDebug then
    fibaro:debug("<span style='color: " .. color .. "'>" .. tostring(message) .. "</span>")
  end
end

local startSource = fibaro:getSourceTrigger()
if (startSource['type'] ~= 'property') then
	msgDebug("Red", 'Started by trigger: ' .. startSource['type'] .. " / " .. tostring(startSource['name']) .. ", aborting!")
	fibaro:abort()
end

-- Collect data
iDeviceId = startSource["deviceID"]
iValue = fibaro:getValue(iDeviceId, "value")
sName = fibaro:getName(iDeviceId)
sDeviceType = fibaro:getType(iDeviceId)
iPower = fibaro:getValue(iDeviceId, "power")
if iPower ~= nil then
  iValue = iPower
  sUnit = "kWh"
else
  sUnit = fibaro:getValue(iDeviceId, "unit")
end

msgDebug("Green", sName .. " (" .. tostring(iDeviceId) .. ") = " .. tostring(iValue) .. " " .. tostring(sUnit) .. " (" .. sDeviceType .. ")" )

-- Compose API-post
sName = string.gsub(sName, " ", "\\ ")
sDeviceType = string.gsub(sDeviceType, " ", "\\ ")

sPostData = sMeasurement .. ",Device\\ ID=" .. tostring(iDeviceId) .. ",Device\\ Type=" .. sDeviceType
if sUnit ~= nil then
  sUnit = string.gsub(sUnit, " ", "\\ ")
  sPostData = sPostData .. ",Unit=" .. sUnit
end
sPostData = sPostData .. " " .. sName .. "=" .. tostring(iValue)

msgDebug("Gray", sPostData)

-- Post to API
local http = net.HTTPClient()
http:request(
	sInfluxDbAPI .. "/write?db=" .. sInfluxDbDB,
	{
		success = function (response)
			-- msgDebug("Green", "OK: " .. response.data)
		end,
	  error = function (err)
			msgDebug("Red", "Error: " ..err)
		end,
		options = {
			method = 'POST',
			data = sPostData
		}
	}
)
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

Har inte haft så mycket tid över sista dagarna, men ikväll vart det en liten stund.
Smutt med "Unit" också, dock så passade inte kWh in i mitt system då jag inte har några så energikrävande enheter. Jag böt ut det till Watt istället,

Det enda som jag kan känna saknas just nu är vilket rum enheten sitter i, går det att få in det med tror du?

Helt underbart snällt att du delar med dig av detta :)
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

sonnyboy wrote:Det enda som jag kan känna saknas just nu är vilket rum enheten sitter i, går det att få in det med tror du?
Hade inte ens tänkt på att ta med rum, men nu är både ID och namn med i koden nedanför.

Code: Select all

--[[
%% properties
6 value
7 value
31 power
32 power
%% weather
%% events
%% globals
--]]

local doDebug = true
local sInfluxDbAPI = "http://192.168.100.10:8086"
local sInfluxDbDB = "CasaWeRo"
local sMeasurement = "HomeCenter2"

msgDebug = function (color, message)
  if doDebug then
    fibaro:debug("<span style='color: " .. color .. "'>" .. tostring(message) .. "</span>")
  end
end

local startSource = fibaro:getSourceTrigger()
if (startSource['type'] ~= 'property') then
	msgDebug("Red", 'Started by trigger: ' .. startSource['type'] .. " / " .. tostring(startSource['name']) .. ", aborting!")
	fibaro:abort()
end

-- Collect data
iDeviceId = startSource["deviceID"]
iValue = fibaro:getValue(iDeviceId, "value")
sName = fibaro:getName(iDeviceId)
sDeviceType = fibaro:getType(iDeviceId)
iPower = fibaro:getValue(iDeviceId, "power")
iRoomId = fibaro:getRoomID(iDeviceId)
sRoomName = fibaro:getRoomName(iRoomId)

if iPower ~= nil then
  iValue = iPower
  sUnit = "kWh"
else
  sUnit = fibaro:getValue(iDeviceId, "unit")
end

msgDebug("Green", sName .. " (" .. tostring(iDeviceId) .. ") = " .. tostring(iValue) .. " " .. tostring(sUnit) .. " (" .. sDeviceType .. ")" )

-- Compose API-post
sName = string.gsub(sName, " ", "\\ ")
sDeviceType = string.gsub(sDeviceType, " ", "\\ ")
sRoomName = string.gsub(sRoomName, " ", "\\ ")

sPostData = sMeasurement .. ",Device\\ ID=" .. tostring(iDeviceId) .. ",Device\\ Type=" .. sDeviceType .. ",Room\\ Name=" .. sRoomName .. ",Room\\ ID=" .. tostring(iRoomId)
if sUnit ~= nil then
  sUnit = string.gsub(sUnit, " ", "\\ ")
  sPostData = sPostData .. ",Unit=" .. sUnit
end
sPostData = sPostData .. " " .. sName .. "=" .. tostring(iValue)

msgDebug("Gray", sPostData)

-- Post to API
local http = net.HTTPClient()
http:request(
	sInfluxDbAPI .. "/write?db=" .. sInfluxDbDB,
	{
		success = function (response)
			-- msgDebug("Green", "OK: " .. response.data)
		end,
	  error = function (err)
			msgDebug("Red", "Error: " ..err)
		end,
		options = {
			method = 'POST',
			data = sPostData
		}
	}
)
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

Snyggt :)
Har en fråga på dom 2 senaste scenerna, jag får inte in mina tempsensorer i någon av dom.
Är det en bugg någon stans tro?
Den skriver i debugen att den läser tempen men det kommer inte något i influx.

[DEBUG] 16:46:13: Temp_Netatmo (359) = 22.3 (com.fibaro.temperatureSensor)
[DEBUG] 16:46:13: HomeCenter2,Device\ ID=359,Device\ Type=com.fibaro.temperatureSensor,Room\ Name=Vardagsrum,Room\ ID=2,Unit= Temp_Netatmo=22.3

1510069290579030335 250 com.fibaro.FGWP101 0 1 Köket kWh
1510069292087180114 250 com.fibaro.FGWP101 7.2 1 Köket kWh
1510069440610304880 322 com.fibaro.FGWP101 23.1 1 Köket kWh
1510069444232657515 322 com.fibaro.FGWP101 23 1 Köket kWh
pi@grafana:~ $
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

sonnyboy wrote: [DEBUG] 16:46:13: Temp_Netatmo (359) = 22.3 (com.fibaro.temperatureSensor)
[DEBUG] 16:46:13: HomeCenter2,Device\ ID=359,Device\ Type=com.fibaro.temperatureSensor,Room\ Name=Vardagsrum,Room\ ID=2,Unit= Temp_Netatmo=22.3
Skulle tro att det är Unit som saknas... testa att kommentera ut den här raden:

Code: Select all

sPostData = sPostData .. ",Unit=" .. sUnit
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

... eller så skriver du om stycket så det ser ut ungefär så här:

Code: Select all

if sUnit ~= nil and sUnit ~= "" then
  sUnit = string.gsub(sUnit, " ", "\\ ")
  sPostData = sPostData .. ",Unit=" .. sUnit
end
Det är alltså bara 1a raden av de där som är ändrad mot tidigare post...
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

Det funkade direkt med ändringen :)
Tackar så mycket!
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

Nu kom jag på en till grej som vore kul om man kunde få med,
Jag har ganska många Globala variablar som uppdateras från Beyond Measure till min HC, mest så är det temperaturer och Rh men även nederbörd elmätning mm.
Är det möjligt att få in globala variablar också?
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

sonnyboy wrote:Är det möjligt att få in globala variablar också?
Borde inte vara någon raketforskning att få till... ska se om jag får lite tid över så kan jag kolla på det, har ett par variabler själv som skulle vara kul att få in.
sonnyboy wrote:Jag har ganska många Globala variablar som uppdateras från Beyond Measure till min HC
... men just i det här fallet så är det kanske smartare att posta direkt från BM till Influx-API'et...

Visste inte att BM levde fortf :)
//Tidig MSure användare
riro
Medlem
Posts: 52
Joined: 27 Mar 2017, 11:02
7
Location: Falun
Contact:

Och här kommer en version som fixar globala variabler också... :)

Code: Select all

--[[
%% properties
6 value
7 value
31 power
32 power
%% weather
%% events
%% globals
TimeOfDay
Pushover
SonosTTS
--]]

local doDebug = true
local sInfluxDbAPI = "http://192.168.100.10:8086"
local sInfluxDbDB = "CasaWeRo"
local sMeasurement = "HomeCenter2"
local sDeviceTypeGlobalVar = "GlobalVariable"

msgDebug = function (color, message)
  if doDebug then
    fibaro:debug("<span style='color: " .. color .. "'>" .. tostring(message) .. "</span>")
  end
end

local startSource = fibaro:getSourceTrigger()
if (startSource['type'] == 'property') then
  -- Collect data
  iDeviceId = startSource["deviceID"]
  iValue = fibaro:getValue(iDeviceId, "value")
  sName = fibaro:getName(iDeviceId)
  sDeviceType = fibaro:getType(iDeviceId)
  iPower = fibaro:getValue(iDeviceId, "power")
  iRoomId = fibaro:getRoomID(iDeviceId)
  sRoomName = fibaro:getRoomName(iRoomId)

  if iPower ~= nil then
    iValue = iPower
    sUnit = "kWh"
  else
    sUnit = fibaro:getValue(iDeviceId, "unit")
  end
  msgDebug("Green", sName .. " (" .. tostring(iDeviceId) .. ") = " .. tostring(iValue) .. " " .. tostring(sUnit) .. " (" .. sDeviceType .. ")" )

  -- Compose POST data
  sName = string.gsub(sName, " ", "\\ ")
  sDeviceType = string.gsub(sDeviceType, " ", "\\ ")
  sRoomName = string.gsub(sRoomName, " ", "\\ ")

  sPostData = sMeasurement .. ",Device\\ ID=" .. tostring(iDeviceId) .. ",Device\\ Type=" .. sDeviceType .. ",Room\\ Name=" .. sRoomName .. ",Room\\ ID=" .. tostring(iRoomId)
  if sUnit ~= nil and sUnit ~= "" then
    sUnit = string.gsub(sUnit, " ", "\\ ")
    sPostData = sPostData .. ",Unit=" .. sUnit
  end
  sPostData = sPostData .. " " .. sName .. "=" .. tostring(iValue)
elseif (startSource['type'] == 'global') then
  -- Collect data
  sVariableName = startSource['name']
  sVariableValue = tostring(fibaro:getGlobalValue(sVariableName))
  msgDebug("Green", "Global variable: " .. sVariableName .. " = " .. sVariableValue)

  -- Compose POST data
  sVariableName = string.gsub(sVariableName, " ", "\\ ")
  sVariableValue = string.gsub(sVariableValue, " ", "\\ ")
  sPostData = sMeasurement .. ",Variable\\ Name=" .. sVariableName .. ",Device\\ Type=" .. sDeviceTypeGlobalVar .. " " .. sVariableName .. "=" .. sVariableValue
else
	msgDebug("Red", 'Started by trigger: ' .. startSource['type'] .. " / " .. tostring(startSource['name']) .. ", aborting!")
	fibaro:abort()
end

-- Post to InfluxDB API
msgDebug("Gray", sPostData)
local http = net.HTTPClient()
http:request(
	sInfluxDbAPI .. "/write?db=" .. sInfluxDbDB,
	{
		success = function (response)
			-- msgDebug("Green", "OK: " .. response.data)
		end,
	  error = function (err)
			msgDebug("Red", "Error: " ..err)
		end,
		options = {
			method = 'POST',
			data = sPostData
		}
	}
)

-- Done!
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

Rackarns vad trevlig, nu vill man ju hem istället för att jobba :)
riro wrote:Visste inte att BM levde fortf
//Tidig MSure användare
Vi är några användare som fortfarande använder BM, det är ju så bra till allt, tyvärr så har ju Per lagt ner utvecklingen av BM så nu är det dött egentligen, men jag har ju typ 10 år i MySQL sparat och har lite svårt att byta bort detta.
Jag hoppade på Msure till en början men tyckte det var lite för komplicerat att hoppa från LogTemp till Msure, Men strax efter kom BM och då ljusnade allt :)
När jag började med Z-wave så körde jag BM som front-end till min Razberry jag hade då, då loggades alla händelser mm till MySQL och graferna gjordes och allt var frid och fröjd ;)
Elförbrukningen på huset loggas fortfarande i BM, svart är värmepumpen och rött hushållsel
klicka Här så kommer en liten graf :)
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
User avatar
sonnyboy
Proffsmedlem
Posts: 669
Joined: 26 Sep 2013, 08:05
10
Location: Västerås

@riro
Nu börjar det skapas upp lite grafer och mätare, riktigt snällt av dig att dela med dig av detta :)
Attachments
GafanaHC.PNG
Fibaro HomeCenter 2
Fw 4.600
BeyondMeasure 1.10
EventRunner
rumbLe
Ny medlem
Posts: 6
Joined: 03 Mar 2015, 13:26
9

riro wrote: 02 Nov 2017, 16:38 EDIT: Om du letar lösning så finns det flera versioner av en scen längre ner i tråden

Är det någon som lagrar HC2-information i InfluxDB ?

Hur kör ni över allt data?
Jag har testat att göra en scen som skickar över en del data men den känns lite statisk så jag funderar på andra varianter.

Finns ju lite att välja på... Göra en VD av "samma" kod, externt script eller kanske en egenknackad Telegraf-plugin eller så kan man använda pluginen exec.
Hej, nu finns det (sedan ett par månader) en färdig Telegraf plugin till Fibaro.

https://github.com/influxdata/telegraf/ ... uts/fibaro

/rumbLe
Post Reply