From b2586a7eaff655c4a0310d77a0fefb9b968aa2de Mon Sep 17 00:00:00 2001 From: Pierrick Brossin Date: Mon, 2 Jul 2018 20:57:05 +0200 Subject: [PATCH] Add energy and power field and device id tag to fibaro input (#4343) --- plugins/inputs/fibaro/README.md | 28 ++++++++++++++++------------ plugins/inputs/fibaro/fibaro.go | 23 +++++++++++++++++++---- plugins/inputs/fibaro/fibaro_test.go | 14 ++++++++------ 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/plugins/inputs/fibaro/README.md b/plugins/inputs/fibaro/README.md index e81acad86..68fda0586 100644 --- a/plugins/inputs/fibaro/README.md +++ b/plugins/inputs/fibaro/README.md @@ -24,11 +24,14 @@ Those values could be true (1) or false (0) for switches, percentage for dimmers - fibaro - tags: + - deviceId (device id) - section (section name) - room (room name) - name (device name) - type (device type) - fields: + - energy (float, when available from device) + - power (float, when available from device) - value (float) - value2 (float, when available from device) @@ -36,16 +39,17 @@ Those values could be true (1) or false (0) for switches, percentage for dimmers ### Example Output: ``` -fibaro,host=vm1,name=Escaliers,room=Dégagement,section=Pièces\ communes,type=com.fibaro.binarySwitch value=0 1523351010000000000 -fibaro,host=vm1,name=Porte\ fenêtre,room=Salon,section=Pièces\ communes,type=com.fibaro.FGRM222 value=99,value2=99 1523351010000000000 -fibaro,host=vm1,name=LED\ îlot\ central,room=Cuisine,section=Cuisine,type=com.fibaro.binarySwitch value=0 1523351010000000000 -fibaro,host=vm1,name=Détérioration,room=Entrée,section=Pièces\ communes,type=com.fibaro.heatDetector value=0 1523351010000000000 -fibaro,host=vm1,name=Température,room=Cave,section=Cave,type=com.fibaro.temperatureSensor value=17.87 1523351010000000000 -fibaro,host=vm1,name=Présence,room=Garde-manger,section=Cuisine,type=com.fibaro.FGMS001 value=1 1523351010000000000 -fibaro,host=vm1,name=Luminosité,room=Garde-manger,section=Cuisine,type=com.fibaro.lightSensor value=92 1523351010000000000 -fibaro,host=vm1,name=Etat,room=Garage,section=Extérieur,type=com.fibaro.doorSensor value=0 1523351010000000000 -fibaro,host=vm1,name=CO2\ (ppm),room=Salon,section=Pièces\ communes,type=com.fibaro.multilevelSensor value=880 1523351010000000000 -fibaro,host=vm1,name=Humidité\ (%),room=Salon,section=Pièces\ communes,type=com.fibaro.humiditySensor value=53 1523351010000000000 -fibaro,host=vm1,name=Pression\ (mb),room=Salon,section=Pièces\ communes,type=com.fibaro.multilevelSensor value=1006.9 1523351010000000000 -fibaro,host=vm1,name=Bruit\ (db),room=Salon,section=Pièces\ communes,type=com.fibaro.multilevelSensor value=58 1523351010000000000 +fibaro,deviceId=9,host=vm1,name=Fenêtre\ haute,room=Cuisine,section=Cuisine,type=com.fibaro.FGRM222 energy=2.04,power=0.7,value=99,value2=99 1529996807000000000 +fibaro,deviceId=10,host=vm1,name=Escaliers,room=Dégagement,section=Pièces\ communes,type=com.fibaro.binarySwitch value=0 1529996807000000000 +fibaro,deviceId=13,host=vm1,name=Porte\ fenêtre,room=Salon,section=Pièces\ communes,type=com.fibaro.FGRM222 energy=4.33,power=0.7,value=99,value2=99 1529996807000000000 +fibaro,deviceId=21,host=vm1,name=LED\ îlot\ central,room=Cuisine,section=Cuisine,type=com.fibaro.binarySwitch value=0 1529996807000000000 +fibaro,deviceId=90,host=vm1,name=Détérioration,room=Entrée,section=Pièces\ communes,type=com.fibaro.heatDetector value=0 1529996807000000000 +fibaro,deviceId=163,host=vm1,name=Température,room=Cave,section=Cave,type=com.fibaro.temperatureSensor value=21.62 1529996807000000000 +fibaro,deviceId=191,host=vm1,name=Présence,room=Garde-manger,section=Cuisine,type=com.fibaro.FGMS001 value=1 1529996807000000000 +fibaro,deviceId=193,host=vm1,name=Luminosité,room=Garde-manger,section=Cuisine,type=com.fibaro.lightSensor value=195 1529996807000000000 +fibaro,deviceId=200,host=vm1,name=Etat,room=Garage,section=Extérieur,type=com.fibaro.doorSensor value=0 1529996807000000000 +fibaro,deviceId=220,host=vm1,name=CO2\ (ppm),room=Salon,section=Pièces\ communes,type=com.fibaro.multilevelSensor value=536 1529996807000000000 +fibaro,deviceId=221,host=vm1,name=Humidité\ (%),room=Salon,section=Pièces\ communes,type=com.fibaro.humiditySensor value=61 1529996807000000000 +fibaro,deviceId=222,host=vm1,name=Pression\ (mb),room=Salon,section=Pièces\ communes,type=com.fibaro.multilevelSensor value=1013.7 1529996807000000000 +fibaro,deviceId=223,host=vm1,name=Bruit\ (db),room=Salon,section=Pièces\ communes,type=com.fibaro.multilevelSensor value=44 1529996807000000000 ``` diff --git a/plugins/inputs/fibaro/fibaro.go b/plugins/inputs/fibaro/fibaro.go index d532c454e..6eacb3ee6 100644 --- a/plugins/inputs/fibaro/fibaro.go +++ b/plugins/inputs/fibaro/fibaro.go @@ -67,6 +67,8 @@ type Devices struct { Enabled bool `json:"enabled"` Properties struct { Dead interface{} `json:"dead"` + Energy interface{} `json:"energy"` + Power interface{} `json:"power"` Value interface{} `json:"value"` Value2 interface{} `json:"value2"` } `json:"properties"` @@ -162,13 +164,26 @@ func (f *Fibaro) Gather(acc telegraf.Accumulator) error { } tags := map[string]string{ - "section": sections[rooms[device.RoomID].SectionID], - "room": rooms[device.RoomID].Name, - "name": device.Name, - "type": device.Type, + "deviceId": strconv.FormatUint(uint64(device.ID), 10), + "section": sections[rooms[device.RoomID].SectionID], + "room": rooms[device.RoomID].Name, + "name": device.Name, + "type": device.Type, } fields := make(map[string]interface{}) + if device.Properties.Energy != nil { + if fValue, err := strconv.ParseFloat(device.Properties.Energy.(string), 64); err == nil { + fields["energy"] = fValue + } + } + + if device.Properties.Power != nil { + if fValue, err := strconv.ParseFloat(device.Properties.Power.(string), 64); err == nil { + fields["power"] = fValue + } + } + if device.Properties.Value != nil { value := device.Properties.Value switch value { diff --git a/plugins/inputs/fibaro/fibaro_test.go b/plugins/inputs/fibaro/fibaro_test.go index 111f4c872..a58ad7c31 100644 --- a/plugins/inputs/fibaro/fibaro_test.go +++ b/plugins/inputs/fibaro/fibaro_test.go @@ -119,6 +119,8 @@ const devicesJSON = ` "type": "com.fibaro.FGRM222", "enabled": true, "properties": { + "energy": "4.33", + "power": "0.7", "dead": "false", "value": "50", "value2": "75" @@ -178,27 +180,27 @@ func TestJSONSuccess(t *testing.T) { assert.Equal(t, uint64(5), acc.NMetrics()) // Ensure fields / values are correct - Device 1 - tags := map[string]string{"section": "Section 1", "room": "Room 1", "name": "Device 1", "type": "com.fibaro.binarySwitch"} + tags := map[string]string{"deviceId": "1", "section": "Section 1", "room": "Room 1", "name": "Device 1", "type": "com.fibaro.binarySwitch"} fields := map[string]interface{}{"value": float64(0)} acc.AssertContainsTaggedFields(t, "fibaro", fields, tags) // Ensure fields / values are correct - Device 2 - tags = map[string]string{"section": "Section 2", "room": "Room 2", "name": "Device 2", "type": "com.fibaro.binarySwitch"} + tags = map[string]string{"deviceId": "2", "section": "Section 2", "room": "Room 2", "name": "Device 2", "type": "com.fibaro.binarySwitch"} fields = map[string]interface{}{"value": float64(1)} acc.AssertContainsTaggedFields(t, "fibaro", fields, tags) // Ensure fields / values are correct - Device 3 - tags = map[string]string{"section": "Section 3", "room": "Room 3", "name": "Device 3", "type": "com.fibaro.multilevelSwitch"} + tags = map[string]string{"deviceId": "3", "section": "Section 3", "room": "Room 3", "name": "Device 3", "type": "com.fibaro.multilevelSwitch"} fields = map[string]interface{}{"value": float64(67)} acc.AssertContainsTaggedFields(t, "fibaro", fields, tags) // Ensure fields / values are correct - Device 4 - tags = map[string]string{"section": "Section 3", "room": "Room 4", "name": "Device 4", "type": "com.fibaro.temperatureSensor"} + tags = map[string]string{"deviceId": "4", "section": "Section 3", "room": "Room 4", "name": "Device 4", "type": "com.fibaro.temperatureSensor"} fields = map[string]interface{}{"value": float64(22.8)} acc.AssertContainsTaggedFields(t, "fibaro", fields, tags) // Ensure fields / values are correct - Device 5 - tags = map[string]string{"section": "Section 3", "room": "Room 4", "name": "Device 5", "type": "com.fibaro.FGRM222"} - fields = map[string]interface{}{"value": float64(50), "value2": float64(75)} + tags = map[string]string{"deviceId": "5", "section": "Section 3", "room": "Room 4", "name": "Device 5", "type": "com.fibaro.FGRM222"} + fields = map[string]interface{}{"energy": float64(4.33), "power": float64(0.7), "value": float64(50), "value2": float64(75)} acc.AssertContainsTaggedFields(t, "fibaro", fields, tags) }