Commit ad6e8558 authored by Micha Mueller's avatar Micha Mueller
Browse files

Adapt BACnet plugin to sensorgroupsV2 architecture

parent 4dc51146
......@@ -17,7 +17,7 @@ CXXFLAGS = -std=c++11 -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG -DBOOST_NETWORK_EN
LIBS = -L../deps/mosquitto_build/lib -L$(DCDBDEPLOYPATH)/lib/ -ldl -lmosquitto -lboost_system -lboost_thread -lboost_log_setup -lboost_log -lpthread -lcrypto -lssl -lcppnetlib-server-parsers -lcppnetlib-uri -rdynamic
OBJS = src/dcdbpusher.o src/Configuration.o src/MQTTPusher.o src/HttpsServer.o
PLUGINS_BASE = libdcdbplugin_pdu libdcdbplugin_sysfs libdcdbplugin_ipmi libdcdbplugin_bacnet libdcdbplugin_snmp libdcdbplugin_opa
PLUGINS_BASE = libdcdbplugin_sysfs libdcdbplugin_snmp libdcdbplugin_pdu libdcdbplugin_ipmi libdcdbplugin_bacnet#libdcdbplugin_opa
ifeq ($(OS),Darwin)
BACNET_PORT = bsd
......@@ -72,23 +72,23 @@ src/SensorGroup.o: CXXFLAGS+= $(PLUGINFLAGS)
src/sensors/%.o: CXXFLAGS+= $(PLUGINFLAGS) -I$(DCDBDEPSPATH)/bacnet-stack-$(BACNET-STACK_VERSION)/include -I$(DCDBDEPSPATH)/bacnet-stack-$(BACNET-STACK_VERSION)/ports/$(BACNET_PORT)
#src/sensors/*/%.o: %.cpp
libdcdbplugin_sysfs.$(LIBEXT): src/sensors/sysfs/SysfsSingleSensor.o src/sensors/sysfs/SysfsConfigurator.o
libdcdbplugin_sysfs.$(LIBEXT): src/sensors/sysfs/SysfsSensorGroup.o src/sensors/sysfs/SysfsConfigurator.o
$(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lboost_log -lboost_system
libdcdbplugin_perfevent.$(LIBEXT): src/sensors/perfevent/PerfSingleSensor.o src/sensors/perfevent/PerfeventConfigurator.o src/sensors/perfevent/PerfSensorGroup.o
libdcdbplugin_perfevent.$(LIBEXT): src/sensors/perfevent/PerfSensorGroup.o src/sensors/perfevent/PerfeventConfigurator.o
$(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lboost_log -lboost_system
libdcdbplugin_ipmi.$(LIBEXT): src/sensors/ipmi/IPMISingleSensor.o src/sensors/ipmi/IPMIHost.o src/sensors/ipmi/IPMIConfigurator.o
libdcdbplugin_ipmi.$(LIBEXT): src/sensors/ipmi/IPMISensorGroup.o src/sensors/ipmi/IPMIHost.o src/sensors/ipmi/IPMIConfigurator.o
$(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lboost_log -lboost_system -lfreeipmi -lboost_regex
libdcdbplugin_pdu.$(LIBEXT): src/sensors/pdu/PDUSingleSensor.o src/sensors/pdu/PDUUnit.o src/sensors/pdu/PDUConfigurator.o
libdcdbplugin_pdu.$(LIBEXT): src/sensors/pdu/PDUSensorGroup.o src/sensors/pdu/PDUUnit.o src/sensors/pdu/PDUConfigurator.o
$(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lcrypto -lssl -lboost_log -lboost_system
libdcdbplugin_bacnet.$(LIBEXT): src/sensors/bacnet/BACnetSingleSensor.o src/sensors/bacnet/BACnetClient.o src/sensors/bacnet/BACnetConfigurator.o
libdcdbplugin_bacnet.$(LIBEXT): src/sensors/bacnet/BACnetSensorGroup.o src/sensors/bacnet/BACnetClient.o src/sensors/bacnet/BACnetConfigurator.o
$(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lboost_log -lboost_system -lbacnet
libdcdbplugin_snmp.$(LIBEXT): src/sensors/snmp/SNMPSingleSensor.o src/sensors/snmp/SNMPConnection.o src/sensors/snmp/SNMPConfigurator.o
libdcdbplugin_snmp.$(LIBEXT): src/sensors/snmp/SNMPSensorGroup.o src/sensors/snmp/SNMPConnection.o src/sensors/snmp/SNMPConfigurator.o
$(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lboost_log -lboost_system -lnetsnmp -lnetsnmpagent
libdcdbplugin_opa.$(LIBEXT): src/sensors/opa/OpaSingleSensor.o src/sensors/opa/OpaConfigurator.o src/sensors/opa/OpaSensorGroup.o
$(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lboost_log -lboost_system -lopamgt -libverbs -libumad -lssl
#libdcdbplugin_opa.$(LIBEXT): src/sensors/opa/OpaSensorGroup.o src/sensors/opa/OpaConfigurator.o
# $(CXX) $(LIBFLAGS)$@ -o $@ $^ -L$(DCDBDEPLOYPATH)/lib/ -lboost_log -lboost_system -lopamgt -libverbs -libumad -lssl
......@@ -9,65 +9,41 @@ global {
cacheInterval 90
}
sensorTemplates {
sensor def0 {
factor 100
id 85
interval 1000
template_group def0 {
interval 1000
minValues 3
}
}
mqttPart FFFF
devices {
device asdf {
instance 1234
mqttPart FF
object o1 {
type 8
instance 1234
mqttPart FF
property test1 {
factor 10
default def0
mqttsuffix 0000
}
property smth {
id 75
mqttsuffix 0001
}
}
; object o2 {
; type 1
; instance 2
; mqttPart FF
; property propName {
; default def0
; minValues 1
; mqttsuffix 0002
; }
; property propName2 {
; id 80
; minValues 1
; mqttsuffix 0003
; }
; }
property test1 {
factor 10
id 85
deviceInstance 1234
objectInstance 1234
objectType 8
mqttsuffix 0000
}
}
group g1 {
default def0
device jklo {
instance 2222
mqttPart FF
object o {
type 8
instance 1234
mqttPart FF
property prop {
id 75
mqttsuffix 0004
}
}
property smth {
id 80
deviceInstance 1234
objectInstance 1234
objectType 8
mqttsuffix 0001
}
}
group g2 {
mqttPart FFFF
property prop {
deviceInstance 2222
objectInstance 1234
objectType 8
id 75
mqttsuffix 0004
}
}
......@@ -63,11 +63,11 @@ public:
private:
/* Handler to process incoming BACnet data */
static void unrecognizedServiceHandler(uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_DATA * service_data);
static void unrecognizedServiceHandler(uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_DATA * service_data);
/**
* Handler for a ReadProperty ACK.
* Doesn't actually do anything, except, for debugging, to print out the ACK data of a matching request.
* Here the actual processing of a valid response takes place
*
* @param service_request The contents of the service request.
* @param service_len The length of the service_request.
......@@ -75,12 +75,11 @@ private:
* @param service_data The BACNET_CONFIRMED_SERVICE_DATA information decoded from the APDU header of this message.
*/
static void readPropertyAckHandler(uint8_t * service_request, uint16_t service_len, BACNET_ADDRESS * src, BACNET_CONFIRMED_SERVICE_ACK_DATA * service_data);
static void errorHandler(BACNET_ADDRESS * src, uint8_t invokeId, BACNET_ERROR_CLASS error_class, BACNET_ERROR_CODE error_code);
static void abortHandler(BACNET_ADDRESS * src, uint8_t invokeId, uint8_t abort_reason, bool server);
static void rejectHandler(BACNET_ADDRESS * src, uint8_t invokeId, uint8_t reject_reason);
uint8_t _invokeId; //store as member variable to enable access in handler methods
uint8_t _invokeId;
unsigned _timeout;
// static because of handler functions
static double _presentValue;
......
......@@ -11,7 +11,10 @@
#include <iostream>
BACnetConfigurator::BACnetConfigurator() {
_bacClient = NULL;
_bacClient = nullptr;
_groupName = "group";
_baseName = "property";
}
BACnetConfigurator::~BACnetConfigurator() {
......@@ -20,32 +23,50 @@ BACnetConfigurator::~BACnetConfigurator() {
}
}
bool BACnetConfigurator::derivedReadConfig(boost::property_tree::iptree& cfg) {
void BACnetConfigurator::sensorBase(BACnetSensorBase& s, CFG_VAL config) {
ADD {
ATTRIBUTE("deviceInstance", setDeviceInstance);
ATTRIBUTE("objectInstance", setObjectInstance);
ATTRIBUTE("objectType", setObjectType);
ATTRIBUTE("id", setPropertyId);
ATTRIBUTE("factor", setFactor);
}
}
void BACnetConfigurator::sensorGroup(BACnetSensorGroup& s, CFG_VAL config) {
ADD {
//no group attributes currently
}
s.setBACnetClient(_bacClient);
}
void BACnetConfigurator::global(CFG_VAL config) {
if(_bacClient) {
delete _bacClient;
}
_bacClient = new BACnetClient();
std::string interface, address_cache, mqttPartDevice, mqttPartObject;
std::string address_cache, interface;
unsigned port = 47808, timeout = 1000, apdu_timeout = 200, apdu_retries = 0;
unsigned deviceInstance = 0, objInstance = 0;
BACNET_OBJECT_TYPE objType = OBJECT_DEVICE; /* = 8 */
//read global variables (if present overwrite those from global.conf)
BOOST_FOREACH(boost::property_tree::iptree::value_type &global, cfg.get_child("global")) {
if (STRCMP(global, "address_cache")) {
address_cache = global.second.data();
ADD {
SETTING("address_cache") {
address_cache = val.second.data();
LOG(debug) << " Address Cache: " << address_cache;
} else if (STRCMP(global, "interface")) {
interface = global.second.data();
} SETTING("interface") {
interface = val.second.data();
LOG(debug) << " Interface " << interface;
} else if (STRCMP(global, "port")) {
port = stoul(global.second.data());
} SETTING("port") {
port = stoul(val.second.data());
LOG(debug) << " Port " << port;
} else if (STRCMP(global, "timeout")) {
timeout = stoul(global.second.data());
} SETTING("timeout") {
timeout = stoul(val.second.data());
LOG(debug) << " Timeout " << timeout;
} else if (STRCMP(global, "apdu_timeout")) {
apdu_timeout = stoul(global.second.data());
} SETTING("apdu_timeout") {
apdu_timeout = stoul(val.second.data());
LOG(debug) << " apdu_timeout " << apdu_timeout;
} else if (STRCMP(global, "apdu_retries")) {
apdu_retries = stoul(global.second.data());
} SETTING("apdu_retries") {
apdu_retries = stoul(val.second.data());
LOG(debug) << " apdu_retries " << apdu_retries;
}
}
......@@ -54,100 +75,8 @@ bool BACnetConfigurator::derivedReadConfig(boost::property_tree::iptree& cfg) {
_bacClient->init(interface, address_cache, port, timeout, apdu_timeout, apdu_retries);
} catch (const std::exception& e) {
LOG(error) << "Could not initialize BACnetClient: " << e.what();
return false;
}
BOOST_FOREACH(boost::property_tree::iptree::value_type &device, cfg.get_child("devices")) {
if (STRCMP(device, "device")) {
LOG(debug) << "Device " << device.second.data();
if (!device.second.empty()) {
BOOST_FOREACH(boost::property_tree::iptree::value_type &d, device.second) {
if (STRCMP(d, "instance")) {
deviceInstance = stoul(d.second.data());
} else if (STRCMP(d, "mqttPart")) {
mqttPartDevice = d.second.data();
if (mqttPartDevice[mqttPartDevice.length()-1] != '/') {
mqttPartDevice.append("/");
}
} else if (STRCMP(d, "object")) {
LOG(debug) << "Object \"" << d.second.data() << "\"";
if (!d.second.empty()) {
BOOST_FOREACH(boost::property_tree::iptree::value_type &object, d.second) {
if (STRCMP(object, "type")) {
objType = static_cast<BACNET_OBJECT_TYPE>(stoul(object.second.data()));
} else if (STRCMP(object, "instance")) {
objInstance = stoul(object.second.data());
} else if (STRCMP(object, "mqttPart")) {
mqttPartObject = object.second.data();
if (mqttPartObject[mqttPartObject.length()-1] != '/') {
mqttPartObject.append("/");
}
} else if (STRCMP(object, "property")) {
LOG(debug) << "Property \"" << object.second.data() << "\"";
if (!object.second.empty()) {
std::string name = device.second.data() + "_" + d.second.data() + "_" + object.second.data();
BACnetSingleSensor * bacSensor = new BACnetSingleSensor(name);
//first check if default sensor is given
boost::optional<boost::property_tree::iptree&> defaultC = object.second.get_child_optional("default");
if(defaultC) {
LOG(debug) << " Using \"" << defaultC.get().data() << "\" as default.";
sensorMap_t::iterator it = _templateSensors.find(defaultC.get().data());
if(it != _templateSensors.end()) {
*bacSensor = it->second;
bacSensor->setName(name);
} else {
LOG(warning) << " Template sensor \"" << defaultC.get().data() << "\" not found! Using standard values.";
}
}
//set object and device related data as well as BACnetClient instance
//assume property aka sensors are read at last
bacSensor->setDeviceInstance(deviceInstance);
bacSensor->setObjectInstance(objInstance);
bacSensor->setObjectType(objType);
bacSensor->setBACnetClient(_bacClient);
bacSensor->setMqtt(_mqttPrefix + mqttPartDevice + mqttPartObject);
//read remaining values
if(readSensorBase(*bacSensor, object.second)) {
_sensors.push_back(bacSensor);
} else {
LOG(warning) << " Sensor \"" << object.second.data() << "\" has bad values! Ignoring..." << std::endl;
}
}
}
}
}
}
}
}
}
}
return true;
}
void BACnetConfigurator::derivedReReadConfig() {
delete _bacClient;
_bacClient = NULL;
}
bool BACnetConfigurator::derivedReadSensorBase(BACnetSensorBase& sensor, boost::property_tree::iptree& config) {
BOOST_FOREACH(boost::property_tree::iptree::value_type &val, config) {
if (STRCMP(val, "mqttsuffix")) {
sensor.setMqtt(sensor.getMqtt() + val.second.data());
} else if (STRCMP(val, "factor")) {
sensor.setFactor(std::stod(val.second.data()));
} else if (STRCMP(val, "id")) {
sensor.setPropertyId(static_cast<BACNET_PROPERTY_ID>(stoul(val.second.data())));
}
delete _bacClient;
_bacClient = nullptr;
return;
}
LOG(debug) << " MQTT : " << sensor.getMqtt();
LOG(debug) << " factor : " << sensor.getFactor();
LOG(debug) << " instance : " << sensor.getDeviceInstance();
LOG(debug) << " objInst : " << sensor.getObjectInstance();
LOG(debug) << " objType : " << sensor.getObjectType();
LOG(debug) << " Property : " << sensor.getPropertyId();
return true;
}
......@@ -9,21 +9,22 @@
#define BACNETCONFIGURATOR_H_
#include "../../includes/ConfiguratorTemplate.h"
#include "BACnetClient.h"
#include "BACnetSingleSensor.h"
#include "BACnetClient.h"
#include "BACnetSensorGroup.h"
class BACnetConfigurator: public ConfiguratorTemplate<BACnetSensorBase, BACnetSingleSensor> {
class BACnetConfigurator: public ConfiguratorTemplate<BACnetSensorBase, BACnetSensorGroup> {
public:
BACnetConfigurator();
virtual ~BACnetConfigurator();
protected:
bool derivedReadConfig(boost::property_tree::iptree& cfg) override;
void derivedReReadConfig() override;
void derivedSetGlobalSettings(const pluginSettings_t& pluginSettings) override {/*nothing to overwrite*/}
bool derivedReadSensorBase(BACnetSensorBase& sensor, boost::property_tree::iptree& config) override;
/* Overwritten from ConfiguratorTemplate */
void sensorBase(BACnetSensorBase& s, CFG_VAL config) override;
void sensorGroup(BACnetSensorGroup& s, CFG_VAL config) override;
void global(CFG_VAL config) override;
private:
BACnetClient* _bacClient;
......
......@@ -24,7 +24,6 @@ public:
_objectType = OBJECT_DEVICE;
_propertyId = PROP_PRESENT_VALUE;
_objectIndex = BACNET_ARRAY_ALL;
_bacClient = NULL;
}
virtual ~BACnetSensorBase() {}
......@@ -35,15 +34,13 @@ public:
BACNET_OBJECT_TYPE getObjectType() const { return _objectType; }
BACNET_PROPERTY_ID getPropertyId() const { return _propertyId; }
int32_t getObjectIndex() const { return _objectIndex; }
BACnetClient* getBACnetClient() const { return _bacClient; }
void setFactor(double factor) { _factor = factor; }
void setDeviceInstance(uint32_t deviceInstance) { _deviceInstance = deviceInstance; }
void setObjectInstance(uint32_t objectInstance) { _objectInstance = objectInstance; }
void setObjectType(BACNET_OBJECT_TYPE objectType) { _objectType = objectType; }
void setPropertyId(BACNET_PROPERTY_ID property) { _propertyId = property; }
void setObjectIndex(int32_t objectIndex) { _objectIndex = objectIndex; }
void setBACnetClient(BACnetClient* bacClient) { _bacClient = bacClient; }
void setFactor(const std::string& factor) { _factor = std::stod(factor); }
void setDeviceInstance(const std::string& deviceInstance) { _deviceInstance = stoul(deviceInstance); }
void setObjectInstance(const std::string& objectInstance) { _objectInstance = stoul(objectInstance); }
void setObjectType(const std::string& objectType) { _objectType = static_cast<BACNET_OBJECT_TYPE>(stoul(objectType)); }
void setPropertyId(const std::string& property) { _propertyId = static_cast<BACNET_PROPERTY_ID>(stoul(property)); }
void setObjectIndex(int32_t objectIndex) { _objectIndex = objectIndex; }
protected:
double _factor;
......@@ -52,8 +49,6 @@ protected:
BACNET_OBJECT_TYPE _objectType;
BACNET_PROPERTY_ID _propertyId;
int32_t _objectIndex;
BACnetClient* _bacClient;
};
#endif /* SRC_SENSORS_BACNET_BACNETSENSORBASE_H_ */
/*
* BACnetSingleSensor.cpp
* BACnetSensorGroup.cpp
*
* Created on: 14.04.2018
* Author: Micha Mueller
*/
#include "BACnetSingleSensor.h"
#include "timestamp.h"
#include "BACnetSensorGroup.h"
#include <functional>
BACnetSingleSensor::BACnetSingleSensor(const std::string& name) :
SensorBase(name), BACnetSensorBase(name), SingleSensor(name) {}
BACnetSensorGroup::BACnetSensorGroup(const std::string& name) :
SensorGroupTemplate(name) {
_bacClient = nullptr;
}
BACnetSingleSensor::~BACnetSingleSensor() {}
BACnetSensorGroup::~BACnetSensorGroup() {}
void BACnetSingleSensor::init(boost::asio::io_service& io) {
void BACnetSensorGroup::init(boost::asio::io_service& io) {
SensorGroupTemplate::init(io);
if(_bacClient) {
_bacClient->initializeStrand(io);
} else {
LOG(error) << "No BACnetClient set for sensor " << _name << "! Cannot initialize sensor.";
LOG(error) << "No BACnetClient set for sensor " << _groupName << "! Cannot initialize sensor.";
}
SingleSensor::init(io);
}
void BACnetSingleSensor::start() {
void BACnetSensorGroup::start() {
if (_keepRunning) {
//we have been started already
LOG(info) << "Sensor " << _name << " already running.";
LOG(info) << "Sensorgroup " << _groupName << " already running.";
return;
}
if (_bacClient) {
_keepRunning = 1;
_pendingTasks++;
_timer->async_wait(_bacClient->getStrand()->wrap(std::bind(&BACnetSingleSensor::readAsync, this)));
LOG(info) << "Sensor " << _name << " started.";
_timer->async_wait(_bacClient->getStrand()->wrap(std::bind(&BACnetSensorGroup::readAsync, this)));
LOG(info) << "Sensorgroup " << _groupName << " started.";
} else {
LOG(error) << "No BACnetClient set for sensor " << _name << "! Cannot start polling.";
LOG(error) << "No BACnetClient set for sensorgroup " << _groupName << "! Cannot start polling.";
}
}
void BACnetSingleSensor::stop() {
void BACnetSensorGroup::stop() {
_keepRunning = 0;
//cancel any outstanding readAsync()
_timer->cancel();
LOG(info) << "Sensor " << _name << " stopped.";
LOG(info) << "Sensorgroup " << _groupName << " stopped.";
}
void BACnetSingleSensor::read() {
void BACnetSensorGroup::read() {
reading_t reading;
reading.timestamp = getTimestamp();
try {
reading.value = _bacClient->readProperty(_deviceInstance, _objectInstance, _objectType, _propertyId) * _factor;
storeReading(reading, _cacheIndex);
_cacheIndex = (_cacheIndex + 1) % _cacheSize;
for(auto s : _sensors) {
try {
reading.value = _bacClient->readProperty(s->getDeviceInstance(), s->getObjectInstance(), s->getObjectType(), s->getPropertyId()) * s->getFactor();
} catch (const std::exception& e) {
LOG(error) << _groupName << "::" << s->getName() << " could not read value: " << e.what();
//dummy value
reading.value = 0;
}
#ifdef DEBUG
LOG(debug) << _name << ": \"" << reading.value << "\"";
LOG(debug) << _groupName << "::" << s->getName() << ": \"" << reading.value << "\"";
#endif
} catch (const std::exception& e) {
LOG(error) << _name << " could not read value: " << e.what();
//to keep the _cacheIndex uniform for all sensors store value in every case
s->storeReading(reading, _cacheIndex);
}
_cacheIndex = (_cacheIndex + 1) % _cacheSize;
}
void BACnetSingleSensor::readAsync() {
void BACnetSensorGroup::readAsync() {
uint64_t now = getTimestamp();
read();
if (_timer && _keepRunning) {
uint64_t next = now + MS_TO_NS(_interval);
_timer->expires_at(timestamp2ptime(next));
_pendingTasks++;
_timer->async_wait(_bacClient->getStrand()->wrap(std::bind(&BACnetSingleSensor::readAsync, this)));
_timer->async_wait(_bacClient->getStrand()->wrap(std::bind(&BACnetSensorGroup::readAsync, this)));
}
_pendingTasks--;
}
/*
* BACnetSingleSensor.h
* BACnetSensorGroup.h
*
* Created on: 14.04.2018
* Author: Micha Mueller
*/
#ifndef BACNETSINGLESENSOR_H_
#define BACNETSINGLESENSOR_H_
#ifndef BACNETSENSORGROUP_H_
#define BACNETSENSORGROUP_H_
#include "BACnetSensorBase.h"
#include "../../includes/SingleSensor.h"
#include "../../includes/SensorGroupTemplate.h"
class BACnetSingleSensor: public BACnetSensorBase, public SingleSensor {
class BACnetSensorGroup: public SensorGroupTemplate<BACnetSensorBase> {
public:
BACnetSingleSensor(const std::string& name);
virtual ~BACnetSingleSensor();
BACnetSensorGroup(const std::string& name);
virtual ~BACnetSensorGroup();
void init(boost::asio::io_service& io) override;
void start() override;
void stop() override;
void setBACnetClient(BACnetClient* bacClient) { _bacClient = bacClient; }
BACnetClient* const getBACnetClient() const { return _bacClient; }
private:
void read() override;
void readAsync() override;
BACnetClient* _bacClient;
};
#endif /* BACNETSINGLESENSOR_H_ */
#endif /* BACNETSENSORGROUP_H_ */
......@@ -21,7 +21,6 @@ IPMIConfigurator::IPMIConfigurator() {
IPMIConfigurator::~IPMIConfigurator() {}
/* Overwritten from ConfiguratorTemplate */
void IPMIConfigurator::sensorBase(IPMISensorBase& s, CFG_VAL config) {
ADD {
ATTRIBUTE("cmd", setRawCmd);
......
......@@ -48,7 +48,7 @@ void IPMISensorGroup::start() {
_timer->async_wait(_host->getStrand()->wrap(boost::bind(&IPMISensorGroup::readAsync, this)));
LOG(info) << "Sensorgroup " << _groupName << " started.";
} else {
LOG(error) << "No host set for sensor " << _groupName << "! Cannot start polling.";
LOG(error) << "No host set for sensorgroup " << _groupName << "! Cannot start polling.";
return;
}
}
......
......@@ -11,8 +11,6 @@
#include "IPMISensorBase.h"
#include "../../includes/SensorGroupTemplate.h"