ocupancy sensor now uses libnl to collect connected devices

fixed regulator saving values as int instead of double
This commit is contained in:
2020-02-13 19:22:14 +01:00
parent 772d21a982
commit b0b4a985e9
15 changed files with 93 additions and 44 deletions

View File

@ -6,11 +6,15 @@
QT += core gui widgets network QT += core gui widgets network
QT += serialport QT += serialport
TARGET = SHinterface TARGET = SHinterface
TEMPLATE = app TEMPLATE = app
INCLUDEPATH += /usr/include/libnl3/
LIBS += -lnl-3 -lnl-genl-3
# The following define makes your compiler emit warnings if you use # The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings # any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the # depend on your compiler). Please consult the documentation of the
@ -29,6 +33,7 @@ SOURCES += \
src/ui/itemcreationdialog.cpp \ src/ui/itemcreationdialog.cpp \
src/ui/itemsettingswidgets/messageitemsettingswidget.cpp \ src/ui/itemsettingswidgets/messageitemsettingswidget.cpp \
src/mainobject.cpp \ src/mainobject.cpp \
src/apgetconnected.cpp \
src/ui/actorwidgets/polynomalactorwidget.cpp \ src/ui/actorwidgets/polynomalactorwidget.cpp \
src/ui/actorwidgets/sensoractorwidget.cpp \ src/ui/actorwidgets/sensoractorwidget.cpp \
src/ui/actorwidgets/alarmwidget.cpp \ src/ui/actorwidgets/alarmwidget.cpp \
@ -81,6 +86,7 @@ HEADERS += \
src/ui/itemcreationdialog.h \ src/ui/itemcreationdialog.h \
src/ui/itemsettingswidgets/messageitemsettingswidget.h \ src/ui/itemsettingswidgets/messageitemsettingswidget.h \
src/mainobject.h \ src/mainobject.h \
src/apgetconnected.h \
src/ui/actorwidgets/alarmwidget.h \ src/ui/actorwidgets/alarmwidget.h \
src/ui/actorwidgets/polynomalactorwidget.h \ src/ui/actorwidgets/polynomalactorwidget.h \
src/ui/actorwidgets/sensoractorwidget.h \ src/ui/actorwidgets/sensoractorwidget.h \

View File

@ -65,8 +65,8 @@ void Regulator::store(QJsonObject& json)
void Regulator::load(const QJsonObject& json, bool preserve) void Regulator::load(const QJsonObject& json, bool preserve)
{ {
Actor::load(json, preserve); Actor::load(json, preserve);
band_ = json["Band"].toInt(1); band_ = json["Band"].toDouble(1);
setPoint_ = json["SetPoint"].toInt(22); setPoint_ = json["SetPoint"].toDouble(22);
sensor_.type = json["SensorType"].toInt(0); sensor_.type = json["SensorType"].toInt(0);
sensor_.id = json["SensorId"].toInt(0); sensor_.id = json["SensorId"].toInt(0);
sensor_.field = json["SensorField"].toInt(0); sensor_.field = json["SensorField"].toInt(0);

View File

@ -94,6 +94,11 @@ void BroadCast::decode()
} }
} }
void BroadCast::sendMessage(const QString &title, const QString &body)
{
write(QByteArray("MESG ") + title.toLatin1() + " BODY " + body.toLatin1());
}
void BroadCast::readyRead() void BroadCast::readyRead()
{ {
buffer_.append(iodevice_->readAll()); buffer_.append(iodevice_->readAll());

View File

@ -45,6 +45,7 @@ public:
BroadCast(QIODevice* const iodevice = nullptr, bool master = true); BroadCast(QIODevice* const iodevice = nullptr, bool master = true);
void sendJson(const QJsonObject& json); void sendJson(const QJsonObject& json);
void sendMessage(const QString& title, const QString& body);
}; };

View File

@ -15,7 +15,6 @@ void ItemStore::addItem(std::shared_ptr<Item> item)
{ {
items_.push_back(std::shared_ptr<Item>(item)); items_.push_back(std::shared_ptr<Item>(item));
itemAdded(std::weak_ptr<Item>(items_.back())); itemAdded(std::weak_ptr<Item>(items_.back()));
qDebug()<<"item added";
} }
} }
@ -75,7 +74,6 @@ void ItemStore::itemStateChanged(const ItemData& item)
{ {
if(items_[i]->operator==(item)) if(items_[i]->operator==(item))
{ {
qDebug()<<"is item "<<i<<" with ids: "<<item.id()<<" "<<items_[i]->id()<<"\nHas state: "<<items_[i]->getValue()<<" wants state: "<<item.getValue();
if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue()); if(items_[i]->getValue() != item.getValue())items_[i]->informValue(item.getValue());
} }
@ -95,7 +93,7 @@ void ItemStore::store(QJsonObject& json)
json["Items"] = itemsArray; json["Items"] = itemsArray;
} }
void ItemStore::load(const QJsonObject& json, Microcontroller * const micro) void ItemStore::load(const QJsonObject& json)
{ {
const QJsonArray itemsArray(json["Items"].toArray(QJsonArray())); const QJsonArray itemsArray(json["Items"].toArray(QJsonArray()));
for(int i = 0; i < itemsArray.size(); ++i) for(int i = 0; i < itemsArray.size(); ++i)
@ -106,7 +104,7 @@ void ItemStore::load(const QJsonObject& json, Microcontroller * const micro)
std::shared_ptr<Item> newItem; std::shared_ptr<Item> newItem;
if(itemObject["Type"].toString("") == "Relay") if(itemObject["Type"].toString("") == "Relay")
{ {
newItem = std::shared_ptr<Relay>(new Relay(micro)); newItem = std::shared_ptr<Relay>(new Relay());
} }
else if(itemObject["Type"].toString("") == "Message") else if(itemObject["Type"].toString("") == "Message")
{ {

View File

@ -3,7 +3,6 @@
#include <memory> #include <memory>
#include "item.h" #include "item.h"
#include "../sensors/sensor.h" #include "../sensors/sensor.h"
#include "../microcontroller.h"
#include <QJsonObject> #include <QJsonObject>
@ -21,7 +20,7 @@ public:
inline std::vector< std::shared_ptr<Item> >* getItems(){ return &items_; } inline std::vector< std::shared_ptr<Item> >* getItems(){ return &items_; }
void store(QJsonObject &json); void store(QJsonObject &json);
void load(const QJsonObject &json, Microcontroller * const micro); void load(const QJsonObject &json);
void clear(); void clear();

View File

@ -2,6 +2,8 @@
#include <QTimer> #include <QTimer>
BroadCast* MessageItem::broadCast_ = nullptr;
MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent): MessageItem::MessageItem(uint32_t itemIdIn, QString name, uint8_t value, QObject *parent):
Item(itemIdIn, name, value, parent) Item(itemIdIn, name, value, parent)
{ {
@ -28,6 +30,8 @@ void MessageItem::setValue(uint8_t value)
messageBox_->setModal(false); messageBox_->setModal(false);
connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox); connect(messageBox_, &QMessageBox::finished, this, &MessageItem::closeMessageBox);
messageBox_->show(); messageBox_->show();
if(broadCast_) broadCast_->sendMessage(name_, message_);
//QTimer::singleShot(600000, this, &MessageItem::closeMessageBox); //QTimer::singleShot(600000, this, &MessageItem::closeMessageBox);
} }
else if(!value && messageBox_) else if(!value && messageBox_)

View File

@ -4,6 +4,7 @@
#include <QMessageBox> #include <QMessageBox>
#include "item.h" #include "item.h"
#include "../broadcast.h"
class MessageItem : public Item class MessageItem : public Item
{ {
@ -13,6 +14,8 @@ private:
QString message_; QString message_;
QMessageBox* messageBox_ = nullptr; QMessageBox* messageBox_ = nullptr;
static BroadCast* broadCast_;
private slots: private slots:
void closeMessageBox(); void closeMessageBox();

View File

@ -3,7 +3,9 @@
//Relay //Relay
Relay::Relay(Microcontroller* micro, uint8_t id, QString name, uint16_t address, bool state, QObject* parent): Item(0, name, state, parent), micro_(micro), id_(id), address_(address) Microcontroller* Relay::micro_ = nullptr;
Relay::Relay(uint8_t id, QString name, uint16_t address, bool state, QObject* parent): Item(0, name, state, parent), id_(id), address_(address)
{ {
itemId_ = address | ((uint32_t)id << 16); itemId_ = address | ((uint32_t)id << 16);
} }
@ -11,8 +13,11 @@ Relay::Relay(Microcontroller* micro, uint8_t id, QString name, uint16_t address,
void Relay::setValue(uint8_t value) void Relay::setValue(uint8_t value)
{ {
Item::setValue(value); Item::setValue(value);
if(micro_)
{
if(value)micro_->relayOn(id_); if(value)micro_->relayOn(id_);
else micro_->relayOff(id_); else micro_->relayOff(id_);
}
} }
void Relay::on() void Relay::on()

View File

@ -13,7 +13,7 @@ class Relay : public Item
{ {
Q_OBJECT Q_OBJECT
private: private:
Microcontroller* micro_; static Microcontroller* micro_;
uint8_t id_; uint8_t id_;
uint16_t address_; uint16_t address_;
@ -26,12 +26,14 @@ public slots:
void toggle(); void toggle();
public: public:
Relay(Microcontroller* micro, uint8_t id = 0, QString name = "", uint16_t address = 0, bool state = false, QObject* parent = nullptr); Relay(uint8_t id = 0, QString name = "", uint16_t address = 0, bool state = false, QObject* parent = nullptr);
uint16_t getAddress() const; uint16_t getAddress() const;
uint8_t getId() const; uint8_t getId() const;
void setId(uint8_t id); void setId(uint8_t id);
inline static void setMicrocontroller(Microcontroller* micro){ micro_ = micro; }
virtual void store(QJsonObject& json); virtual void store(QJsonObject& json);
virtual void load(const QJsonObject& json, const bool preserve = false); virtual void load(const QJsonObject& json, const bool preserve = false);
}; };

View File

@ -59,8 +59,6 @@ int main(int argc, char *argv[])
parser.addOption(settingsPathOption); parser.addOption(settingsPathOption);
QCommandLineOption secondaryOption(QStringList() << "e" << "secondary", QCoreApplication::translate("main", "Set if instance is not main instance")); QCommandLineOption secondaryOption(QStringList() << "e" << "secondary", QCoreApplication::translate("main", "Set if instance is not main instance"));
parser.addOption(secondaryOption); parser.addOption(secondaryOption);
QCommandLineOption qsettingsOption(QStringList() << "q" << "qsettigns", QCoreApplication::translate("main", "Set if jsettings file format should be used."));
parser.addOption(secondaryOption);
parser.process(a); parser.process(a);
#endif #endif

View File

@ -1,4 +1,4 @@
#include "mainobject.h" #include "mainobject.h"
MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent) : MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const bool masterIn, QObject *parent) :
QObject(parent), QObject(parent),
@ -20,6 +20,8 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const
QObject::connect(&globalSensors, &SensorStore::sensorChangedState, &ocupancySensor, &OcupancySensorSource::sensorEvent); QObject::connect(&globalSensors, &SensorStore::sensorChangedState, &ocupancySensor, &OcupancySensorSource::sensorEvent);
QObject::connect(&ocupancySensor, &OcupancySensorSource::stateChanged, &globalSensors, &SensorStore::sensorGotState); QObject::connect(&ocupancySensor, &OcupancySensorSource::stateChanged, &globalSensors, &SensorStore::sensorGotState);
sunSensorSource.run();
//connect item store //connect item store
QObject::connect(&micro, &Microcontroller::gotRelayList, &items, &ItemStore::addItems); QObject::connect(&micro, &Microcontroller::gotRelayList, &items, &ItemStore::addItems);
QObject::connect(&micro, &Microcontroller::itemChanged, &items, &ItemStore::itemStateChanged); QObject::connect(&micro, &Microcontroller::itemChanged, &items, &ItemStore::itemStateChanged);
@ -30,6 +32,8 @@ MainObject::MainObject(QIODevice* ioDevice, const QString& settingsPathIn, const
items.addItem(rgbItem); items.addItem(rgbItem);
items.addItem(auxItem); items.addItem(auxItem);
Relay::setMicrocontroller(&micro);
connect(&broadCast, &BroadCast::gotJson, this, &MainObject::recivedJson); connect(&broadCast, &BroadCast::gotJson, this, &MainObject::recivedJson);
QObject::connect(&broadCast, &BroadCast::gotSensorState, &globalSensors, &SensorStore::sensorGotState); QObject::connect(&broadCast, &BroadCast::gotSensorState, &globalSensors, &SensorStore::sensorGotState);
if(master)connect(&broadCast, &BroadCast::jsonRequested, this, &MainObject::sendJson); if(master)connect(&broadCast, &BroadCast::jsonRequested, this, &MainObject::sendJson);
@ -60,6 +64,9 @@ void MainObject::store(QJsonObject &json)
items.store(json); items.store(json);
QJsonObject powerObject; QJsonObject powerObject;
powerItem.store(powerObject); powerItem.store(powerObject);
QJsonObject ocupancyObject;
ocupancySensor.store(ocupancyObject);
json.insert("Ocupancy", ocupancyObject);
json.insert("Power", powerObject); json.insert("Power", powerObject);
} }
@ -71,8 +78,9 @@ void MainObject::load(const QJsonObject& json)
powerItem.removeAllActors(); powerItem.removeAllActors();
items.addItem(rgbItem); items.addItem(rgbItem);
items.addItem(auxItem); items.addItem(auxItem);
items.load(json, &micro); items.load(json);
powerItem.load(json["Power"].toObject()); powerItem.load(json["Power"].toObject());
ocupancySensor.load(json["Ocupancy"].toObject());
qDebug()<<"aray size: "<<json.isEmpty(); qDebug()<<"aray size: "<<json.isEmpty();
if(json["Items"].toArray().size() >= 2) if(json["Items"].toArray().size() >= 2)
{ {
@ -84,7 +92,7 @@ void MainObject::load(const QJsonObject& json)
void MainObject::recivedJson(const QJsonObject json) void MainObject::recivedJson(const QJsonObject json)
{ {
if(master)storeJsonObjectToDisk(json, settingsPath); if(master && !noSave)storeJsonObjectToDisk(json, settingsPath);
load(json); load(json);
} }

View File

@ -131,7 +131,7 @@ std::shared_ptr<Relay> Microcontroller::processRelayLine(const QString& buffer)
if(name.size() > 1)name.remove(name.size()-1, 1); if(name.size() > 1)name.remove(name.size()-1, 1);
else name = "Relay " + QString::number(bufferList[1].toInt(nullptr, 2)); else name = "Relay " + QString::number(bufferList[1].toInt(nullptr, 2));
qDebug()<<"Relay "<<bufferList[2].toInt()<<"Name "<<name<<" id "<<bufferList[4].toInt(nullptr, 2)<<" state "<<bufferList[6].toInt(); qDebug()<<"Relay "<<bufferList[2].toInt()<<"Name "<<name<<" id "<<bufferList[4].toInt(nullptr, 2)<<" state "<<bufferList[6].toInt();
return std::shared_ptr<Relay>( new Relay(this, bufferList[2].toInt(), name, bufferList[4].toInt(nullptr, 2), bufferList[6].toInt())); return std::shared_ptr<Relay>( new Relay(bufferList[2].toInt(), name, bufferList[4].toInt(nullptr, 2), bufferList[6].toInt()));
} }
return nullptr; return nullptr;
} }

View File

@ -2,41 +2,57 @@
#include <QTimer> #include <QTimer>
#include <QDebug> #include <QDebug>
#include "../apgetconnected.h"
OcupancySensorSource::OcupancySensorSource(QObject *parent): QObject (parent)
OcupancySensorSource::OcupancySensorSource(QObject *parent, const QString& device, const QString& deviceMac): QObject (parent), deviceMac_(deviceMac), device_(device)
{ {
connect(&ping, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(pingExit(int, QProcess::ExitStatus)));
Timeout();
} }
void OcupancySensorSource::sensorEvent(Sensor sensor) void OcupancySensorSource::sensorEvent(Sensor sensor)
{ {
if(sensor.type == Sensor::TYPE_DOOR && sensor.id == 1 && sensor.field != 0.0f) if(sensor.type == Sensor::TYPE_DOOR && sensor.id == 1 && sensor.field != 0.0f)
{ {
QTimer::singleShot(240000, this, &OcupancySensorSource::Timeout); if(occupied == false) stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 1, "Occupancy"));
qDebug()<<"starting timer"; QTimer::singleShot(600000, this, &OcupancySensorSource::Timeout);
} }
} }
void OcupancySensorSource::Timeout() void OcupancySensorSource::Timeout()
{ {
qDebug()<<"starting ping"; int error = 0;
ping.start("ping 192.168.0.104 -c 1 -W 1"); std::vector<uint64_t> devices = ap::connectedDevices(device_.toLatin1().toStdString(), error);
} if(error == 0)
void OcupancySensorSource::pingExit(int exitCode, QProcess::ExitStatus exitStatus)
{
qDebug()<<"ping finished";
if(exitStatus == QProcess::ExitStatus::NormalExit)
{ {
qDebug()<<"Exit Code "<<exitCode; bool found = false;
if(exitCode == 0) for(size_t i = 0; i < devices.size(); ++i)
{ {
stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 1, "Occupancy")); std::string mac = ap::macAddrToString(devices[i]);
if(mac.find(deviceMac_.toLatin1().toStdString()) != std::string::npos)
{
found = true;
break;
}
}
occupied = found;
} }
else else
{ {
stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, 0, "Occupancy")); stateChanged(Sensor(Sensor::TYPE_OCUPANCY, 0, true, "Occupancy"));
} qDebug()<<"occupancy sensor error";
} }
} }
void OcupancySensorSource::store(QJsonObject &json)
{
json["Device"] = device_;
json["MacAddres"] = deviceMac_;
}
void OcupancySensorSource::load(const QJsonObject &json)
{
device_ = json["Device"].toString("wlan0");
deviceMac_ = json["MacAddres"].toString("60:BE:B5:25:8C:E0");
QTimer::singleShot(600000, this, &OcupancySensorSource::Timeout);
}

View File

@ -1,7 +1,7 @@
#pragma once #pragma once
#include <QObject> #include <QObject>
#include <QProcess> #include <QJsonObject>
#include "sensor.h" #include "sensor.h"
class OcupancySensorSource : public QObject class OcupancySensorSource : public QObject
@ -9,10 +9,15 @@ class OcupancySensorSource : public QObject
Q_OBJECT Q_OBJECT
private: private:
QProcess ping; QString deviceMac_;
QString device_;
bool occupied = true;
public: public:
explicit OcupancySensorSource(QObject *parent = nullptr); explicit OcupancySensorSource(QObject *parent = nullptr, const QString& device = "wlan0", const QString& deviceMac = "60:BE:B5:25:8C:E0");
void store(QJsonObject& json);
void load(const QJsonObject& json);
public slots: public slots:
void sensorEvent(Sensor sensor); void sensorEvent(Sensor sensor);
@ -20,7 +25,6 @@ public slots:
private slots: private slots:
void Timeout(); void Timeout();
void pingExit(int exitCode, QProcess::ExitStatus exitStatus);
signals: signals:
void stateChanged(Sensor sensor); void stateChanged(Sensor sensor);