made RF433 GPIO selectable

removed receiving devices temporary
added elro devices
added name param for 433 devices
cleanup 433 plugins
This commit is contained in:
Simon Stürz 2015-04-01 18:13:34 +02:00 committed by Michael Zanetti
parent 1c008d0bef
commit ae1335f392
16 changed files with 343 additions and 474 deletions

View File

@ -14,6 +14,11 @@ coverage {
QMAKE_LFLAGS += -fprofile-arcs QMAKE_LFLAGS += -fprofile-arcs
} }
# Enable Radio 433 MHz for GPIO's
enable433gpio {
DEFINES += GPIO433
}
top_srcdir=$$PWD top_srcdir=$$PWD
top_builddir=$$shadowed($$PWD) top_builddir=$$shadowed($$PWD)

View File

@ -22,6 +22,14 @@ test.commands = LD_LIBRARY_PATH=$$top_builddir/libguh make check
QMAKE_EXTRA_TARGETS += licensecheck doc test QMAKE_EXTRA_TARGETS += licensecheck doc test
message("Building guh version $${GUH_VERSION_STRING}")
coverage { coverage {
message("Building coverage.") message("Building coverage.")
} }
contains(DEFINES, GPIO433){
message("Radio 433 for GPIO's enabled")
} else {
message("Radio 433 for GPIO's disabled")
}

View File

@ -37,6 +37,10 @@
The second possibility to sent data to a 433 MHz device is the \l{http://www.brennenstuhl.de/de-DE/steckdosenleisten-schaltgeraete-und-adapter/brematic-hausautomation/brematic-home-automation-gateway-gwy-433-1.html} The second possibility to sent data to a 433 MHz device is the \l{http://www.brennenstuhl.de/de-DE/steckdosenleisten-schaltgeraete-und-adapter/brematic-hausautomation/brematic-home-automation-gateway-gwy-433-1.html}
{Brennenstuhl 433 MHz LAN Gateway}. If there is a Gateway in the local network, this class will automaticaly detect {Brennenstuhl 433 MHz LAN Gateway}. If there is a Gateway in the local network, this class will automaticaly detect
it and will be used. If both transmitter are available (Gateway + GPIO), each signal will be transmitted over both sender. it and will be used. If both transmitter are available (Gateway + GPIO), each signal will be transmitted over both sender.
\note: Radio 433 on GPIO's is by default disabled. If you want to enable it, you need to compile the source with the qmake config \tt{CONFIG+=radio433gpio}
*/ */
/*! \fn void Radio433::dataReceived(QList<int> rawData) /*! \fn void Radio433::dataReceived(QList<int> rawData)
@ -50,20 +54,26 @@
Radio433::Radio433(QObject *parent) : Radio433::Radio433(QObject *parent) :
QObject(parent) QObject(parent)
{ {
#ifdef GPIO433
m_receiver = new Radio433Receiver(this,27); m_receiver = new Radio433Receiver(this,27);
m_transmitter = new Radio433Trasmitter(this,22); m_transmitter = new Radio433Trasmitter(this,22);
m_brennenstuhlTransmitter = new Radio433BrennenstuhlGateway(this);
connect(m_receiver, &Radio433Receiver::readingChanged, this, &Radio433::readingChanged); connect(m_receiver, &Radio433Receiver::readingChanged, this, &Radio433::readingChanged);
connect(m_receiver, &Radio433Receiver::dataReceived, this, &Radio433::dataReceived); connect(m_receiver, &Radio433Receiver::dataReceived, this, &Radio433::dataReceived);
#endif
m_brennenstuhlTransmitter = new Radio433BrennenstuhlGateway(this);
connect(m_brennenstuhlTransmitter, &Radio433BrennenstuhlGateway::availableChanged, this, &Radio433::brennenstuhlAvailableChanged); connect(m_brennenstuhlTransmitter, &Radio433BrennenstuhlGateway::availableChanged, this, &Radio433::brennenstuhlAvailableChanged);
} }
/*! Destroys the hardware resource Radio433 object. */ /*! Destroys the hardware resource Radio433 object. */
Radio433::~Radio433() Radio433::~Radio433()
{ {
#ifdef GPIO433
m_receiver->quit(); m_receiver->quit();
m_transmitter->quit(); m_transmitter->quit();
#endif
} }
/*! Enables GPIO transmitter and receiver and the Brennenstuhl Lan Gateway. /*! Enables GPIO transmitter and receiver and the Brennenstuhl Lan Gateway.
@ -72,6 +82,7 @@ bool Radio433::enable()
{ {
m_brennenstuhlTransmitter->enable(); m_brennenstuhlTransmitter->enable();
#ifdef GPIO433
// check if GPIOs are available // check if GPIOs are available
QFileInfo gpioFile("/sys/class/gpio/export"); QFileInfo gpioFile("/sys/class/gpio/export");
if (gpioFile.exists()) { if (gpioFile.exists()) {
@ -91,6 +102,8 @@ bool Radio433::enable()
} }
} }
qDebug() << "--> Radio 433 MHz GPIO's enabled."; qDebug() << "--> Radio 433 MHz GPIO's enabled.";
#endif
return true; return true;
} }
@ -98,19 +111,14 @@ bool Radio433::enable()
bool Radio433::disabel() bool Radio433::disabel()
{ {
m_brennenstuhlTransmitter->disable(); m_brennenstuhlTransmitter->disable();
#ifdef GPIO433
if (m_receiver->stopReceiver()) { if (m_receiver->stopReceiver()) {
return true; return true;
} }
return false; return false;
} #endif
return true;
void Radio433::readingChanged(bool reading)
{
if (reading) {
m_transmitter->allowSending(false);
} else {
m_transmitter->allowSending(true);
}
} }
void Radio433::brennenstuhlAvailableChanged(const bool &available) void Radio433::brennenstuhlAvailableChanged(const bool &available)
@ -132,10 +140,12 @@ bool Radio433::sendData(int delay, QList<int> rawData, int repetitions)
sendBrennenstuhl = m_brennenstuhlTransmitter->sendData(delay, rawData, repetitions); sendBrennenstuhl = m_brennenstuhlTransmitter->sendData(delay, rawData, repetitions);
} }
#ifdef GPIO433
if (m_transmitter->available()) { if (m_transmitter->available()) {
m_transmitter->sendData(delay, rawData, repetitions); m_transmitter->sendData(delay, rawData, repetitions);
sendGpio = true; sendGpio = true;
} }
#endif
return (sendGpio || sendBrennenstuhl); return (sendGpio || sendBrennenstuhl);
} }

View File

@ -21,8 +21,11 @@
#include <QObject> #include <QObject>
#ifdef GPIO433
#include "radio433receiver.h" #include "radio433receiver.h"
#include "radio433transmitter.h" #include "radio433transmitter.h"
#endif
#include "radio433brennenstuhlgateway.h" #include "radio433brennenstuhlgateway.h"
class Radio433 : public QObject class Radio433 : public QObject
@ -36,15 +39,17 @@ public:
bool disabel(); bool disabel();
private: private:
#ifdef GPIO433
Radio433Receiver *m_receiver; Radio433Receiver *m_receiver;
Radio433Trasmitter *m_transmitter; Radio433Trasmitter *m_transmitter;
#endif
Radio433BrennenstuhlGateway *m_brennenstuhlTransmitter; Radio433BrennenstuhlGateway *m_brennenstuhlTransmitter;
signals: signals:
void dataReceived(QList<int> rawData); void dataReceived(QList<int> rawData);
private slots: private slots:
void readingChanged(bool reading);
void brennenstuhlAvailableChanged(const bool &available); void brennenstuhlAvailableChanged(const bool &available);
public slots: public slots:

View File

@ -30,13 +30,13 @@ Radio433BrennenstuhlGateway::Radio433BrennenstuhlGateway(QObject *parent) :
// Timer for discovery of the Gateway // Timer for discovery of the Gateway
m_discoverTimer = new QTimer(this); m_discoverTimer = new QTimer(this);
m_discoverTimer->setInterval(2000); m_discoverTimer->setInterval(5000);
connect(m_discoverTimer, &QTimer::timeout, this, &Radio433BrennenstuhlGateway::discover); connect(m_discoverTimer, &QTimer::timeout, this, &Radio433BrennenstuhlGateway::discover);
// Timer to detect discovery timeout // Timer to detect discovery timeout
m_timeout = new QTimer(this); m_timeout = new QTimer(this);
m_timeout->setSingleShot(true); m_timeout->setSingleShot(true);
m_timeout->setInterval(1500); m_timeout->setInterval(3000);
connect(m_timeout, &QTimer::timeout, this, &Radio433BrennenstuhlGateway::timeout); connect(m_timeout, &QTimer::timeout, this, &Radio433BrennenstuhlGateway::timeout);
} }

View File

@ -60,11 +60,6 @@ DeviceManager::HardwareResources DevicePluginConrad::requiredHardware() const
DeviceManager::DeviceSetupStatus DevicePluginConrad::setupDevice(Device *device) DeviceManager::DeviceSetupStatus DevicePluginConrad::setupDevice(Device *device)
{ {
if (device->deviceClassId() == conradRemoteDeviceClassId) {
device->setName(device->paramValue("name").toString() + " (Conrad Remote)");
return DeviceManager::DeviceSetupStatusSuccess;
}
if (device->deviceClassId() == conradShutterDeviceClassId) { if (device->deviceClassId() == conradShutterDeviceClassId) {
device->setName(device->paramValue("name").toString() + " (Conrad shutter RSM900R)"); device->setName(device->paramValue("name").toString() + " (Conrad shutter RSM900R)");
return DeviceManager::DeviceSetupStatusSuccess; return DeviceManager::DeviceSetupStatusSuccess;
@ -186,15 +181,4 @@ void DevicePluginConrad::radioData(const QList<int> &rawData)
} }
qDebug() << "CONRAD: " << binCode.left(binCode.length() - 24) << " ID = " << binCode.right(24); qDebug() << "CONRAD: " << binCode.left(binCode.length() - 24) << " ID = " << binCode.right(24);
// // FIXME: find a better way to get to the remote DeviceClass
// DeviceClass deviceClass = supportedDevices().first();
// foreach (const EventType &eventType, deviceClass.events()) {
// if (eventType.name() == buttonCode) {
// qDebug() << "emit event " << pluginName() << familyCode << eventType.name() << power;
// Event event = Event(eventType.id(), device->id(), params);
// emit emitEvent(event);
// return;
// }
// }
} }

View File

@ -6,40 +6,6 @@
"name": "Conrad Electronic SE", "name": "Conrad Electronic SE",
"id": "986cf06f-3ef1-4271-b2a3-2cc277ebecb6", "id": "986cf06f-3ef1-4271-b2a3-2cc277ebecb6",
"deviceClasses": [ "deviceClasses": [
{
"deviceClassId": "17cd2492-28ab-4827-ba6e-5ef35be23f1b",
"name": "Conrad Remote",
"idName": "conradRemote",
"createMethods": ["user"],
"paramTypes": [
{
"name": "name",
"type": "QString",
"inputType": "TextLine"
}
],
"eventTypes": [
{
"id": "1f4050f5-4c90-4799-8d6d-e4069f3a2519",
"name": "Button pressed",
"idName": "remoteButtonPressed",
"paramTypes": [
{
"name": "button",
"type": "int"
},
{
"name": "group",
"type": "int"
},
{
"name": "power",
"type": "bool"
}
]
}
]
},
{ {
"deviceClassId": "2bb14180-aa5d-4999-992d-e6d464cff486", "deviceClassId": "2bb14180-aa5d-4999-992d-e6d464cff486",
"name": "Conrad shutter RSM900R", "name": "Conrad shutter RSM900R",

View File

@ -57,73 +57,78 @@ DeviceManager::HardwareResources DevicePluginElro::requiredHardware() const
DeviceManager::DeviceError DevicePluginElro::executeAction(Device *device, const Action &action) DeviceManager::DeviceError DevicePluginElro::executeAction(Device *device, const Action &action)
{ {
if (action.actionTypeId() != powerOnActionTypeId && action.actionTypeId() != powerOffActionTypeId) {
return DeviceManager::DeviceErrorActionTypeNotFound;
}
QList<int> rawData; QList<int> rawData;
QByteArray binCode; QByteArray binCode;
// =======================================
// create the bincode // create the bincode
// channels // channels
if(device->paramValue("channel 1").toBool()){ if (device->paramValue("channel 1").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
if(device->paramValue("channel 2").toBool()){ if (device->paramValue("channel 2").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
if(device->paramValue("channel 3").toBool()){ if (device->paramValue("channel 3").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ }else{
binCode.append("01"); binCode.append("01");
} }
if(device->paramValue("channel 4").toBool()){ if(device->paramValue("channel 4").toBool()){
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
if(device->paramValue("channel 5").toBool()){ if (device->paramValue("channel 5").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
// =======================================
// Buttons // Buttons
if(device->paramValue("A").toBool()){ if (device->paramValue("A").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
if(device->paramValue("B").toBool()){ if (device->paramValue("B").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
if(device->paramValue("C").toBool()){ if (device->paramValue("C").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
if(device->paramValue("D").toBool()){ if (device->paramValue("D").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
if(device->paramValue("E").toBool()){ if (device->paramValue("E").toBool()) {
binCode.append("00"); binCode.append("00");
}else{ } else {
binCode.append("01"); binCode.append("01");
} }
// Power
if(action.param("power").value().toBool()){
binCode.append("0001");
}else{
binCode.append("0100");
}
// ======================================= // Power
if (action.actionTypeId() == powerOnActionTypeId) {
binCode.append("0001");
} else if (action.actionTypeId() == powerOffActionTypeId) {
binCode.append("0100");
} else {
return DeviceManager::DeviceErrorActionTypeNotFound;
}
//create rawData timings list //create rawData timings list
int delay = 350; int delay = 350;
@ -133,21 +138,20 @@ DeviceManager::DeviceError DevicePluginElro::executeAction(Device *device, const
// add the code // add the code
foreach (QChar c, binCode) { foreach (QChar c, binCode) {
if(c == '0'){ if (c == '0') {
rawData.append(1); rawData.append(1);
rawData.append(3); rawData.append(3);
}else{ } else {
rawData.append(3); rawData.append(3);
rawData.append(1); rawData.append(1);
} }
} }
// =======================================
// send data to hardware resource // send data to hardware resource
if(transmitData(delay, rawData)){ if (transmitData(delay, rawData)) {
qDebug() << "transmitted" << pluginName() << device->name() << "power: " << action.param("power").value().toBool(); qDebug() << "transmitted" << pluginName() << device->name() << "power: " << action.param("power").value().toBool();
return DeviceManager::DeviceErrorNoError; return DeviceManager::DeviceErrorNoError;
}else{ } else {
qDebug() << "could not transmitt" << pluginName() << device->name() << "power: " << action.param("power").value().toBool(); qDebug() << "could not transmitt" << pluginName() << device->name() << "power: " << action.param("power").value().toBool();
return DeviceManager::DeviceErrorHardwareNotAvailable; return DeviceManager::DeviceErrorHardwareNotAvailable;
} }
@ -156,7 +160,7 @@ DeviceManager::DeviceError DevicePluginElro::executeAction(Device *device, const
void DevicePluginElro::radioData(const QList<int> &rawData) void DevicePluginElro::radioData(const QList<int> &rawData)
{ {
// filter right here a wrong signal length // filter right here a wrong signal length
if(rawData.length() != 49){ if (rawData.length() != 49) {
return; return;
} }
@ -164,61 +168,60 @@ void DevicePluginElro::radioData(const QList<int> &rawData)
QByteArray binCode; QByteArray binCode;
// average 314 // average 314
if(delay > 290 && delay < 400){ if (delay > 290 && delay < 400) {
// go trough all 48 timings (without sync signal) // go trough all 48 timings (without sync signal)
for(int i = 1; i <= 48; i+=2 ){ for (int i = 1; i <= 48; i+=2 ) {
int div; int div;
int divNext; int divNext;
// if short // if short
if(rawData.at(i) <= 700){ if (rawData.at(i) <= 700) {
div = 1; div = 1;
}else{ } else {
div = 3; div = 3;
} }
// if long // if long
if(rawData.at(i+1) < 700){ if (rawData.at(i+1) < 700) {
divNext = 1; divNext = 1;
}else{ } else {
divNext = 3; divNext = 3;
} }
/* // _
* _ // | |___ = 0 -> in 4 delays => 1000
* | |___ = 0 -> in 4 delays => 1000 // _
* _ // ___| | = 1 -> in 4 delays => 0001
* ___| | = 1 -> in 4 delays => 0001
*/
if(div == 1 && divNext == 3){ if (div == 1 && divNext == 3) {
binCode.append('0'); binCode.append('0');
}else if(div == 3 && divNext == 1){ } else if(div == 3 && divNext == 1) {
binCode.append('1'); binCode.append('1');
}else{ } else {
return; return;
} }
} }
}else{ } else {
return; return;
} }
//qDebug() << "ELRO understands this protocol: " << binCode;
if(binCode.left(20) == "00000100000000000001"){ qDebug() << "ELRO understands this protocol: " << binCode;
if(binCode.right(4) == "0100"){
if (binCode.left(20) == "00000100000000000001") {
if (binCode.right(4) == "0100") {
qDebug() << "Motion Detector OFF"; qDebug() << "Motion Detector OFF";
}else{ } else {
qDebug() << "Motion Detector ON"; qDebug() << "Motion Detector ON";
} }
} }
// get the channel of the remote signal (5 channels, true=1, false=0) // get the channel of the remote signal (5 channels, true=1, false=0)
QList<bool> group; QList<bool> group;
for(int i = 1; i < 10; i+=2){ for (int i = 1; i < 10; i+=2) {
if(binCode.at(i-1) == '0' && binCode.at(i) == '1'){ if (binCode.at(i-1) == '0' && binCode.at(i) == '1') {
group << false; group << false;
}else if(binCode.at(i-1) == '0' && binCode.at(i) == '0'){ } else if(binCode.at(i-1) == '0' && binCode.at(i) == '0') {
group << true; group << true;
}else { } else {
return; return;
} }
} }
@ -227,59 +230,29 @@ void DevicePluginElro::radioData(const QList<int> &rawData)
QString button; QString button;
QByteArray buttonCode = binCode.mid(10,10); QByteArray buttonCode = binCode.mid(10,10);
if(buttonCode == "0001010101"){ if (buttonCode == "0001010101") {
button = "A"; button = "A";
}else if(buttonCode == "0100010101"){ } else if (buttonCode == "0100010101") {
button = "B"; button = "B";
}else if(buttonCode == "0101000101"){ } else if (buttonCode == "0101000101") {
button = "C"; button = "C";
}else if(buttonCode == "0101010001"){ } else if(buttonCode == "0101010001") {
button = "D"; button = "D";
}else if(buttonCode == "0101010100"){ } else if(buttonCode == "0101010100") {
button = "E"; button = "E";
}else{ } else {
return; return;
} }
// get power status -> On = 0100, Off = 0001 // get power status -> On = 0100, Off = 0001
bool power; bool power;
if(binCode.right(4).toInt(0,2) == 1){ if (binCode.right(4).toInt(0,2) == 1) {
power = true; power = true;
}else if(binCode.right(4).toInt(0,2) == 4){ } else if(binCode.right(4).toInt(0,2) == 4) {
power = false; power = false;
}else{ } else {
return; return;
} }
Device *device = 0; qDebug() << "ELRO:" << group << buttonCode << power;
QList<Device*> deviceList = deviceManager()->findConfiguredDevices(elroRemoteDeviceClassId);
foreach (Device *dev, deviceList) {
if (dev->hasParam("channel 1") && dev->paramValue("channel 1").toBool() == group.at(0) &&
dev->hasParam("channel 2") && dev->paramValue("channel 2").toBool() == group.at(1) &&
dev->hasParam("channel 3") && dev->paramValue("channel 3").toBool() == group.at(2) &&
dev->hasParam("channel 4") && dev->paramValue("channel 4").toBool() == group.at(3) &&
dev->hasParam("channel 5") && dev->paramValue("channel 5").toBool() == group.at(4)
) {
// Yippie! We found the device.
device = dev;
break;
}
}
if (!device) {
return;
}
ParamList params;
Param powerParam("power", power);
params.append(powerParam);
// FIXME: find a better way to get to the remote DeviceClass
DeviceClass deviceClass = supportedDevices().first();
foreach (const EventType &eventType, deviceClass.eventTypes()) {
if (eventType.name() == button) {
Event event = Event(eventType.id(), device->id(), params);
emit emitEvent(event);
return;
}
}
} }

View File

@ -6,91 +6,17 @@
"name": "Elro", "name": "Elro",
"id": "435a13a0-65ca-4f0c-94c1-e5873b258db5", "id": "435a13a0-65ca-4f0c-94c1-e5873b258db5",
"deviceClasses": [ "deviceClasses": [
{
"deviceClassId": "d85c1ef4-197c-4053-8e40-707aa671d302",
"idName": "elroRemote",
"name": "Elro Remote",
"createMethods": ["user"],
"paramTypes": [
{
"name": "channel 1",
"type": "bool"
},
{
"name": "channel 2",
"type": "bool"
},
{
"name": "channel 3",
"type": "bool"
},
{
"name": "channel 4",
"type": "bool"
},
{
"name": "channel 5",
"type": "bool"
}
],
"eventTypes": [
{
"id": "9dd3f862-35f3-4b69-954e-fa3c8bd68e39",
"name": "A",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "733226eb-91ba-4e37-9d78-12c87eb5e763",
"name": "B",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "47aaeaec-485a-4775-a543-33f339fd28c8",
"name": "C",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "db3d484c-add9-44ab-80a4-a0664e0c87c8",
"name": "D",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "eb914aac-fb73-4ee2-9f1b-c34b2f6cc24a",
"name": "E",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
}
]
},
{ {
"deviceClassId": "308ae6e6-38b3-4b3a-a513-3199da2764f8", "deviceClassId": "308ae6e6-38b3-4b3a-a513-3199da2764f8",
"name": "Elro switch", "name": "Elro Socket (AB440D)",
"idName": "socketAB440D",
"createMethods": ["user"], "createMethods": ["user"],
"paramTypes": [ "paramTypes": [
{
"name": "Name",
"type": "QString",
"inputType": "TextLine"
},
{ {
"name": "channel 1", "name": "channel 1",
"type": "bool" "type": "bool"
@ -135,20 +61,204 @@
"actionTypes": [ "actionTypes": [
{ {
"id": "31c9758e-6567-4f89-85bb-29e1a7c55d44", "id": "31c9758e-6567-4f89-85bb-29e1a7c55d44",
"name": "Set power", "idName": "powerOn",
"paramTypes": [ "name": "On"
{ },
"name": "power", {
"type": "bool" "id": "9ceb3233-20a3-46bf-b2af-faed1b7ab1ad",
} "idName": "powerOff",
] "name": "Off"
} }
] ]
}, },
{ {
"deviceClassId": "4c64aee6-7a4f-41f2-b278-edc55f0da0d3", "deviceClassId": "d29cf309-8a3e-4bcc-90ab-87d1adfb8985",
"name": "Elro motion detector", "name": "Elro Bulb (AB440L)",
"createMethods": ["discovery"] "idName": "bulbAB440L",
"createMethods": ["user"],
"paramTypes": [
{
"name": "Name",
"type": "QString",
"inputType": "TextLine"
},
{
"name": "channel 1",
"type": "bool"
},
{
"name": "channel 2",
"type": "bool"
},
{
"name": "channel 3",
"type": "bool"
},
{
"name": "channel 4",
"type": "bool"
},
{
"name": "channel 5",
"type": "bool"
},
{
"name": "A",
"type": "bool"
},
{
"name": "B",
"type": "bool"
},
{
"name": "C",
"type": "bool"
},
{
"name": "D",
"type": "bool"
},
{
"name": "E",
"type": "bool"
}
],
"actionTypes": [
{
"id": "31c9758e-6567-4f89-85bb-29e1a7c55d44",
"name": "On"
},
{
"id": "9ceb3233-20a3-46bf-b2af-faed1b7ab1ad",
"name": "Off"
}
]
},
{
"deviceClassId": "9516c818-7cbe-4ec2-a961-f29d7b918437",
"name": "Elro Socket (AB440S)",
"idName": "socketAB440S",
"createMethods": ["user"],
"paramTypes": [
{
"name": "Name",
"type": "QString",
"inputType": "TextLine"
},
{
"name": "channel 1",
"type": "bool"
},
{
"name": "channel 2",
"type": "bool"
},
{
"name": "channel 3",
"type": "bool"
},
{
"name": "channel 4",
"type": "bool"
},
{
"name": "channel 5",
"type": "bool"
},
{
"name": "A",
"type": "bool"
},
{
"name": "B",
"type": "bool"
},
{
"name": "C",
"type": "bool"
},
{
"name": "D",
"type": "bool"
},
{
"name": "E",
"type": "bool"
}
],
"actionTypes": [
{
"id": "31c9758e-6567-4f89-85bb-29e1a7c55d44",
"name": "On"
},
{
"id": "9ceb3233-20a3-46bf-b2af-faed1b7ab1ad",
"name": "Off"
}
]
},
{
"deviceClassId": "e03adc74-b972-451a-afd5-b562a7ab91cd",
"name": "Elro outdoor socket (AB440WD)",
"idName": "socketAB440WD",
"createMethods": ["user"],
"paramTypes": [
{
"name": "Name",
"type": "QString",
"inputType": "TextLine"
},
{
"name": "channel 1",
"type": "bool"
},
{
"name": "channel 2",
"type": "bool"
},
{
"name": "channel 3",
"type": "bool"
},
{
"name": "channel 4",
"type": "bool"
},
{
"name": "channel 5",
"type": "bool"
},
{
"name": "A",
"type": "bool"
},
{
"name": "B",
"type": "bool"
},
{
"name": "C",
"type": "bool"
},
{
"name": "D",
"type": "bool"
},
{
"name": "E",
"type": "bool"
}
],
"actionTypes": [
{
"id": "31c9758e-6567-4f89-85bb-29e1a7c55d44",
"name": "On"
},
{
"id": "9ceb3233-20a3-46bf-b2af-faed1b7ab1ad",
"name": "Off"
}
]
} }
] ]
} }

View File

@ -104,7 +104,7 @@ DeviceManager::DeviceError DevicePluginIntertechno::executeAction(Device *device
// ======================================= // =======================================
// generate bin from button code // generate bin from button code
if(familyCode == "1") { if (familyCode == "1") {
binCode.append("00000000"); binCode.append("00000000");
} else if (familyCode == "2") { } else if (familyCode == "2") {
binCode.append("01000000"); binCode.append("01000000");
@ -190,10 +190,10 @@ void DevicePluginIntertechno::radioData(const QList<int> &rawData)
return; return;
} }
QList<Device*> deviceList = deviceManager()->findConfiguredDevices(intertechnoRemoteDeviceClassId); // QList<Device*> deviceList = deviceManager()->findConfiguredDevices(intertechnoRemoteDeviceClassId);
if (deviceList.isEmpty()) { // if (deviceList.isEmpty()) {
return; // return;
} // }
int delay = rawData.first()/31; int delay = rawData.first()/31;
QByteArray binCode; QByteArray binCode;
@ -378,34 +378,6 @@ void DevicePluginIntertechno::radioData(const QList<int> &rawData)
return; return;
} }
qDebug() << "family code = " << familyCode << "button code =" << buttonCode << power; qDebug() << "INTERTECHNO: family code = " << familyCode << "button code =" << buttonCode << power;
// ===================================================
Device *device = 0;
foreach (Device *dev, deviceList) {
if (dev->paramValue("familyCode").toString() == familyCode) {
// Yippie! We found the device.
device = dev;
break;
}
}
if (!device) {
qWarning() << "couldn't find any configured device for intertech familyCode:" << familyCode;
return;
}
ParamList params;
Param powerParam("power", power);
params.append(powerParam);
// FIXME: find a better way to get to the remote DeviceClass
DeviceClass deviceClass = supportedDevices().first();
foreach (const EventType &eventType, deviceClass.eventTypes()) {
if (eventType.name() == buttonCode) {
qDebug() << "emit event " << pluginName() << familyCode << eventType.name() << power;
Event event = Event(eventType.id(), device->id(), params);
emit emitEvent(event);
return;
}
}
} }

View File

@ -6,187 +6,16 @@
"name": "Intertechno", "name": "Intertechno",
"id": "6a852bc2-34dd-4f4c-9ac9-dd4c32ddbcba", "id": "6a852bc2-34dd-4f4c-9ac9-dd4c32ddbcba",
"deviceClasses": [ "deviceClasses": [
{
"deviceClassId": "ab73ad2f-6594-45a3-9063-8f72d365c5e5",
"idName": "intertechnoRemote",
"name": "Intertechno Remote",
"createMethods": ["user"],
"paramTypes": [
{
"name": "familyCode",
"type": "QString",
"inputType": "TextLine",
"allowedValues": ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P"]
}
],
"eventTypes": [
{
"id": "785c1b30-a3f2-4696-af7c-d532acf3d6f7",
"name": "Button 1 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "1d42c850-7b43-452f-b205-e1aac14eb3ee",
"name": "Button 2 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "77a4780e-2355-4a77-870d-2f675bf986ce",
"name": "Button 3 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "bd6a8b4b-f946-4f3b-992f-e7cff10187b8",
"name": "Button 4 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "0f20782e-0acc-45f1-8c42-5dc5f5b29f1b",
"name": "Button 5 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "f7cb439a-0528-4905-9583-06b6bfeb3ba1",
"name": "Button 6 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "a0b0d8d8-2b43-4897-98e0-05b6b408a950",
"name": "Button 7 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "ae5833a2-bc43-4462-ae47-e45dac1fb0ce",
"name": "Button 8 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "52c13828-d047-4256-b488-0bf84abbc87c",
"name": "Button 9 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "22c5afbc-835e-47cc-8211-4429eb9d9fee",
"name": "Button 10 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "6bec5cbc-8bfb-4c6c-8ac8-f8e7723fd5aa",
"name": "Button 11 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "8b71edd2-8135-4c8b-bf44-380efadf1942",
"name": "Button 12 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "192f36a4-1e58-41aa-9618-83d46e329a4b",
"name": "Button 13 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "6c76de60-5e19-4a29-b027-e71e66caa2d6",
"name": "Button 14 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "c2f56c10-1f81-4477-88fa-fc0f4a6383df",
"name": "Button 15 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
},
{
"id": "5d2eb3f8-4cd4-4c71-9c0c-e0b685e168e4",
"name": "Button 16 pressed",
"paramTypes": [
{
"name": "power",
"type": "bool"
}
]
}
]
},
{ {
"deviceClassId": "324219e8-7c53-41b5-b314-c2900cd15252", "deviceClassId": "324219e8-7c53-41b5-b314-c2900cd15252",
"name": "Intertechno switch", "name": "Intertechno switch",
"createMethods": ["user"], "createMethods": ["user"],
"paramTypes": [ "paramTypes": [
{
"name": "Name",
"type": "QString",
"inputType": "TextLine"
},
{ {
"name": "familyCode", "name": "familyCode",
"type": "QString", "type": "QString",

View File

@ -12,6 +12,11 @@
"name": "RF Controller (LN-CON-RF20B)", "name": "RF Controller (LN-CON-RF20B)",
"createMethods": ["user"], "createMethods": ["user"],
"paramTypes": [ "paramTypes": [
{
"name": "Name",
"type": "QString",
"inputType": "TextLine"
},
{ {
"name": "ID", "name": "ID",
"type": "QString", "type": "QString",

View File

@ -24,7 +24,6 @@
LircClient::LircClient(QObject *parent) : LircClient::LircClient(QObject *parent) :
QObject(parent) QObject(parent)
{ {
m_socket = new QLocalSocket(this); m_socket = new QLocalSocket(this);
QObject::connect(m_socket, &QLocalSocket::readyRead, this, &LircClient::readyRead); QObject::connect(m_socket, &QLocalSocket::readyRead, this, &LircClient::readyRead);
} }
@ -33,17 +32,12 @@ bool LircClient::connect()
{ {
m_socket->connectToServer("/var/run/lirc/lircd", QIODevice::ReadWrite); m_socket->connectToServer("/var/run/lirc/lircd", QIODevice::ReadWrite);
if (!m_socket->isOpen()) { if (!m_socket->isOpen()) {
qWarning() << "Error connecting to lircd socket. Is Lircd running?"; qWarning() << "--> Lirc daemon NOT available.";
return false; return false;
} }
m_socket->write("LIST\n");
qDebug() << "connected to lircd!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!11111"; qDebug() << "--> Lirc daemon available.";
qDebug() << "wrote to lirc:" << m_socket->write("LIST\n");
return true; return true;
} }
void LircClient::readyRead() void LircClient::readyRead()
@ -53,7 +47,7 @@ void LircClient::readyRead()
bool inBlock = false; bool inBlock = false;
while (m_socket->canReadLine()) { while (m_socket->canReadLine()) {
QByteArray line = m_socket->readLine().trimmed(); QByteArray line = m_socket->readLine().trimmed();
qDebug() << "got line:" << line; //qDebug() << "got line:" << line;
if (line == "BEGIN") { if (line == "BEGIN") {
inBlock = true; inBlock = true;
continue; continue;
@ -87,7 +81,7 @@ void LircClient::readRemotes()
{ {
m_socket->readLine(); // IGNORE DATA m_socket->readLine(); // IGNORE DATA
int remoteCount = m_socket->readLine().trimmed().toInt(); int remoteCount = m_socket->readLine().trimmed().toInt();
qDebug() << "found" << remoteCount << "remotes"; qDebug() << "found" << remoteCount << "lirc remotes";
for (int i = 0; i < remoteCount; i++) { for (int i = 0; i < remoteCount; i++) {
QByteArray line = m_socket->readLine().trimmed(); QByteArray line = m_socket->readLine().trimmed();
m_remotes.append(line); m_remotes.append(line);

View File

@ -11,6 +11,11 @@
"name": "Unitec switch (48111)", "name": "Unitec switch (48111)",
"createMethods": ["user"], "createMethods": ["user"],
"paramTypes": [ "paramTypes": [
{
"name": "Name",
"type": "QString",
"inputType": "TextLine"
},
{ {
"name": "Channel", "name": "Channel",
"type": "QString", "type": "QString",

View File

@ -11,6 +11,11 @@
"name": "WiFi Device", "name": "WiFi Device",
"createMethods": ["user"], "createMethods": ["user"],
"paramTypes": [ "paramTypes": [
{
"name": "Name",
"type": "QString",
"inputType": "TextLine"
},
{ {
"name": "MAC", "name": "MAC",
"type": "QString", "type": "QString",

View File

@ -1,7 +1,5 @@
include(../guh.pri) include(../guh.pri)
message("Building guh version $${GUH_VERSION_STRING}")
TARGET = guhd TARGET = guhd
TEMPLATE = app TEMPLATE = app