diff --git a/nymea-plugins.pro b/nymea-plugins.pro index 82a638c5..2783d989 100644 --- a/nymea-plugins.pro +++ b/nymea-plugins.pro @@ -29,6 +29,7 @@ PLUGIN_DIRS = \ mqttclient \ netatmo \ networkdetector \ + onewire \ openweathermap \ osdomotics \ philipshue \ diff --git a/onewire/devicepluginonewire.cpp b/onewire/devicepluginonewire.cpp new file mode 100644 index 00000000..c977c64a --- /dev/null +++ b/onewire/devicepluginonewire.cpp @@ -0,0 +1,272 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2018 Bernhard Trinnes . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*! + \page onewire.html + \title One wire + \brief Plugin for one wire devices. + + \ingroup plugins + \ingroup nymea-plugins + + This plugin allows to receive data from the onw wire file system. + + \chapter Plugin properties + Following JSON file contains the definition and the description of all available \l{DeviceClass}{DeviceClasses} + and \l{Vendor}{Vendors} of this \l{DevicePlugin}. + + For more details how to read this JSON file please check out the documentation for \l{The plugin JSON File}. + + \quotefile plugins/deviceplugins/OneWire/devicepluginOneWire.json +*/ + +#include "devicepluginonewire.h" +#include "devices/device.h" +#include "plugininfo.h" + +#include +#include + + +//https://github.com/owfs +//https://github.com/owfs/owfs-doc/wiki + +DevicePluginOneWire::DevicePluginOneWire() +{ +} + +Device::DeviceError DevicePluginOneWire::discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms) +{ + Q_UNUSED(params); + + if (deviceClassId == temperatureSensorDeviceClassId) { + + foreach(Device *parentDevice, myDevices().filterByDeviceClassId(oneWireInterfaceDeviceClassId)) { + if (parentDevice->stateValue(oneWireInterfaceAutoAddStateTypeId).toBool()) { + //devices cannot be discovered since auto mode is enabled + return Device::DeviceErrorNoError; + } else { + if (m_oneWireInterface) + m_oneWireInterface->discoverDevices(); + } + } + return Device::DeviceErrorAsync; + } + return Device::DeviceErrorDeviceClassNotFound; +} + + +Device::DeviceSetupStatus DevicePluginOneWire::setupDevice(Device *device) +{ + if(!m_pluginTimer) { + m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(10); + connect(m_pluginTimer, &PluginTimer::timeout, this, &DevicePluginOneWire::onPluginTimer); + } + + if (device->deviceClassId() == oneWireInterfaceDeviceClassId) { + qCDebug(dcOneWire) << "Setup one wire interface"; + + /*if(!myDevices().filterByDeviceClassId(oneWireInterfaceDeviceClassId).isEmpty()) { + qCWarning(dcOneWire) << "Only one one wire interfaces allowed"; + return Device::DeviceSetupStatusFailure; + }*/ + m_oneWireInterface = new OneWire(device->paramValue(oneWireInterfaceDevicePathParamTypeId).toByteArray(), this); + + if (!m_oneWireInterface->init()){ + m_oneWireInterface->deleteLater(); + return Device::DeviceSetupStatusFailure; + } + connect(m_oneWireInterface, &OneWire::devicesDiscovered, this, &DevicePluginOneWire::onOneWireDevicesDiscovered); + return Device::DeviceSetupStatusSuccess; + } + + if (device->deviceClassId() == temperatureSensorDeviceClassId) { + + qCDebug(dcOneWire) << "Setup one wire temperature sensor" << device->params(); + if (!m_oneWireInterface) { //in case the child was setup before the interface + double temperature = m_oneWireInterface->getTemperature(device->paramValue(temperatureSensorDeviceAddressParamTypeId).toByteArray()); + device->setStateValue(temperatureSensorTemperatureStateTypeId, temperature); + } + return Device::DeviceSetupStatusSuccess; + } + + if (device->deviceClassId() == iButtonDeviceClassId) { + qCDebug(dcOneWire) << "Setup one wire iButton" << device->params(); + if (!m_oneWireInterface) { + + } + return Device::DeviceSetupStatusSuccess; + } + + if (device->deviceClassId() == switchDeviceClassId) { + qCDebug(dcOneWire) << "Setup one wire switch" << device->params(); + if (!m_oneWireInterface) { + QByteArray address = device->paramValue(switchDeviceAddressParamTypeId).toByteArray(); + device->setStateValue(switchDigitalOutputStateTypeId, m_oneWireInterface->getSwitchState(address)); + } + return Device::DeviceSetupStatusSuccess; + } + return Device::DeviceSetupStatusFailure; +} + +Device::DeviceError DevicePluginOneWire::executeAction(Device *device, const Action &action) +{ + Q_UNUSED(action) + if (device->deviceClassId() == oneWireInterfaceDeviceClassId) { + if (action.actionTypeId() == oneWireInterfaceAutoAddActionTypeId){ + device->setStateValue(oneWireInterfaceAutoAddStateTypeId, action.param(oneWireInterfaceAutoAddActionAutoAddParamTypeId).value()); + return Device::DeviceErrorNoError; + } + return Device::DeviceErrorActionTypeNotFound; + } + + if (device->deviceClassId() == switchDeviceClassId) { + + if (action.actionTypeId() == switchDigitalOutputActionTypeId){ + m_oneWireInterface->setSwitchState(device->paramValue(switchDeviceAddressParamTypeId).toByteArray(), action.param(switchDigitalOutputActionDigitalOutputParamTypeId).value().toBool()); + + return Device::DeviceErrorNoError; + } + return Device::DeviceErrorActionTypeNotFound; + } + return Device::DeviceErrorNoError; +} + + +void DevicePluginOneWire::deviceRemoved(Device *device) +{ + if (device->deviceClassId() == oneWireInterfaceDeviceClassId) { + m_oneWireInterface->deleteLater(); + return; + } + + if (myDevices().empty()) { + hardwareManager()->pluginTimerManager()->unregisterTimer(m_pluginTimer); + + } +} + + +void DevicePluginOneWire::onPluginTimer() +{ + foreach (Device *device, myDevices()) { + if (device->deviceClassId() == oneWireInterfaceDeviceClassId) { + device->setStateValue(oneWireInterfaceConnectedStateTypeId, m_oneWireInterface->interfaceIsAvailable()); + + if (device->stateValue(oneWireInterfaceAutoAddStateTypeId).toBool()) { + m_oneWireInterface->discoverDevices(); + } + } + + if (device->deviceClassId() == temperatureSensorDeviceClassId) { + QByteArray address = device->paramValue(temperatureSensorDeviceAddressParamTypeId).toByteArray(); + + double temperature = m_oneWireInterface->getTemperature(address); + device->setStateValue(temperatureSensorTemperatureStateTypeId, temperature); + } + } +} + +void DevicePluginOneWire::onOneWireDevicesDiscovered(QList oneWireDevices) +{ + foreach(Device *parentDevice, myDevices().filterByDeviceClassId(oneWireInterfaceDeviceClassId)) { + + bool autoDiscoverEnabled = parentDevice->stateValue(oneWireInterfaceAutoAddStateTypeId).toBool(); + QList temperatureDeviceDescriptors; + foreach (OneWire::OneWireDevice oneWireDevice, oneWireDevices){ + switch (oneWireDevice.family) { + //https://github.com/owfs/owfs-doc/wiki/1Wire-Device-List + case 0x10: //DS18S20 + case 0x28: //DS18B20 + case 0x3b: //DS1825, MAX31826, MAX31850 + DeviceDescriptor descriptor(temperatureSensorDeviceClassId, oneWireDevice.type, "One wire temperature sensor", parentDevice->id()); + ParamList params; + params.append(Param(temperatureSensorDeviceAddressParamTypeId, oneWireDevice.address)); + params.append(Param(temperatureSensorDeviceTypeParamTypeId, oneWireDevice.type)); + foreach (Device *existingDevice, myDevices().filterByDeviceClassId(temperatureSensorDeviceClassId)){ + if (existingDevice->paramValue(temperatureSensorDeviceAddressParamTypeId).toString() == oneWireDevice.address) { + descriptor.setDeviceId(existingDevice->id()); + break; + } + } + descriptor.setParams(params); + temperatureDeviceDescriptors.append(descriptor); + break; + } + } + if (autoDiscoverEnabled) { + if (!temperatureDeviceDescriptors.isEmpty()) + emit autoDevicesAppeared(temperatureSensorDeviceClassId, temperatureDeviceDescriptors); + } else { + if (!temperatureDeviceDescriptors.isEmpty()) + emit devicesDiscovered(temperatureSensorDeviceClassId, temperatureDeviceDescriptors); + } + break; + } +} + + +/* foreach(QByteArray member, dirMembers) { + int family = member.split('.').first().toInt(nullptr, 16); + qDebug(dcOneWire()) << "Member" << member << member.left(2) << family; + member.remove(member.indexOf('/'), 1); + QByteArray type; + switch (family) { + //https://github.com/owfs/owfs-doc/wiki/1Wire-Device-List + case 0x10: //DS18S20 + case 0x28: //DS18B20 + case 0x3b: //DS1825, MAX31826, MAX31850 + OneWireDevice device; + device.family =family; + device.Address = member.split('.').last(); + device.Type = getValue(member, "type"); + oneWireDevices.append(device); + qDebug(dcOneWire()) << "Discovered temperature sensor" << type << member; + break; + case 0x05: + case 0x12: + case 0x1C: + case 0x3A: + OneWireDevice device; + device.family =family; + device.Address = member.split('.').last(); + device.Type = getValue(member, "type"); + oneWireDevices.append(device); + qDebug(dcOneWire()) << "Discovered temperature sensor" << type << member; + qDebug(dcOneWire()) << "Discovered switch" << type << member; + break; + + case 0x08: //DS1992 1kbit Memory iButton + case 0x06: //DS1993 4kbit Memory iButton + case 0x0A: //DS1995 16kbit Memory iButton + case 0x0C: //DS1996 64kbit Memory iButton + type = getValue(member, "type"); + qDebug(dcOneWire()) << "Discovered ID device" << type << member; + break; + default: + //type = getValue(member, "type"); + //qDebug(dcOneWire()) << "Discovered unknown " << type << member; + //emit unknownDeviceDiscovered(member, type); + break ; + } + } + if(!oneWireDevices.isEmpty*/ diff --git a/onewire/devicepluginonewire.h b/onewire/devicepluginonewire.h new file mode 100644 index 00000000..576e1665 --- /dev/null +++ b/onewire/devicepluginonewire.h @@ -0,0 +1,56 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2018 Bernhard Trinnes * + * * + * This file is part of nymea. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; If not, see * + * . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef DEVICEPLUGINONEWIRE_H +#define DEVICEPLUGINONEWIRE_H + +#include "plugintimer.h" +#include "devices/deviceplugin.h" +#include "onewire.h" + +#include + +class DevicePluginOneWire : public DevicePlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "io.nymea.DevicePlugin" FILE "devicepluginonewire.json") + Q_INTERFACES(DevicePlugin) + +public: + explicit DevicePluginOneWire(); + + Device::DeviceError discoverDevices(const DeviceClassId &deviceClassId, const ParamList ¶ms) override; + Device::DeviceSetupStatus setupDevice(Device *device) override; + Device::DeviceError executeAction(Device *device, const Action &action) override; + void deviceRemoved(Device *device) override; + +private: + PluginTimer *m_pluginTimer = nullptr; + OneWire *m_oneWireInterface = nullptr; + +private slots: + void onPluginTimer(); + + void onOneWireDevicesDiscovered(QList devices); +}; + +#endif // DEVICEPLUGINONEWIRE_H diff --git a/onewire/devicepluginonewire.json b/onewire/devicepluginonewire.json new file mode 100644 index 00000000..0ad5516b --- /dev/null +++ b/onewire/devicepluginonewire.json @@ -0,0 +1,155 @@ +{ + "displayName": "One Wire", + "name": "OneWire", + "id": "2c697fb7-0645-466d-9cb9-aa1922c85bee", + "vendors": [ + { + "displayName": "One wire", + "name": "oneWire", + "id": "cecc5fae-29cf-40c0-b1f8-0af2dc8e8a63", + "deviceClasses": [ + { + "id": "c36c68d9-6182-4ae1-972d-b8b5e0cf185f", + "name": "oneWireInterface", + "displayName": "One wire interface", + "interfaces": ["connectable"], + "createMethods": ["user"], + "paramTypes": [ + { + "id": "a0e773ff-fd19-499e-96f0-830168229cd3", + "name": "path", + "displayName": "Path", + "type": "QString", + "defaultValue": "/dev/ttyS0" + } + ], + "stateTypes": [ + { + "id": "d0ded173-c382-4ee3-8e24-3647b4e16afa", + "name": "connected", + "displayName": "connected", + "displayNameEvent": "connected changed", + "defaultValue": false, + "type": "bool" + }, + { + "id": "64baf50e-8ed4-4526-8b92-7e4662d6fa39", + "name": "autoAdd", + "displayName": "Auto add one wire devices", + "displayNameAction": "Set auto add mode", + "displayNameEvent": "Auto add one wire devices changed", + "defaultValue": false, + "type": "bool", + "writable": true + } + ] + }, + { + "id": "e13beb24-953c-48b3-9262-7cde31d42ef5", + "name": "temperatureSensor", + "displayName": "Temperature Sensor", + "interfaces": ["temperaturesensor"], + "createMethods": ["discovery"], + "paramTypes": [ + { + "id": "b4368f34-d9bb-496f-84ba-091bd4b6a332", + "name": "address", + "displayName": "Address", + "type": "QString", + "readOnly": true + }, + { + "id": "5005822d-6a32-4bb8-9b77-f79da7382f76", + "name": "type", + "displayName": "Type", + "type": "QString", + "inputType": "TextLine", + "readOnly": true + } + ], + "stateTypes": [ + { + "id": "b04ee2a5-9b27-4ffc-9e12-7e05f5a41690", + "name": "temperature", + "displayName": "temperature", + "displayNameEvent": "temperature changed", + "unit": "DegreeCelsius", + "type": "double", + "defaultValue": 0 + } + ] + }, + { + "id": "71691119-3bda-4424-b853-1a00f21086e1", + "name": "switch", + "displayName": "Switch", + "interfaces": [ ], + "createMethods": ["discovery"], + "paramTypes": [ + { + "id": "e3e6e596-0cd4-42a3-8401-ccf6349314b7", + "name": "address", + "displayName": "Address", + "type": "QString", + "readOnly": true + }, + { + "id": "34c8f771-4141-4183-9eaf-becbaf362ac8", + "name": "type", + "displayName": "Type", + "type": "QString", + "inputType": "TextLine", + "readOnly": true + } + ], + "stateTypes": [ + { + "id": "78fa12c0-246c-4112-8be6-5943d3c3cda5", + "name": "digitalOutput", + "displayName": "Digital output", + "displayNameEvent": "Digital output changed", + "displayNameAction": "Set digital output", + "type": "bool", + "defaultValue": false, + "writable": true + } + ] + }, + { + "id": "22aff41f-0f48-40f2-aa4e-bb251723be1c", + "name": "iButton", + "displayName": "iButton", + "interfaces": [ ], + "createMethods": ["discovery"], + "paramTypes": [ + { + "id": "759e919c-8af2-43dd-af99-9b8c59321050", + "name": "address", + "displayName": "Address", + "type": "QString", + "readOnly": true + }, + { + "id": "5ca8d942-4ef2-47be-8ac9-be2ee19e168d", + "name": "type", + "displayName": "Type", + "type": "QString", + "inputType": "TextLine", + "readOnly": true + } + ], + "stateTypes": [ + ], + "eventTypes": [ + { + + "id": "61d69bec-c948-4703-9686-8762381d0ae4", + "name": "authenticated", + "displayName": "Authenticated" + } + ] + } + ] + } + ] +} diff --git a/onewire/onewire.cpp b/onewire/onewire.cpp new file mode 100644 index 00000000..2e280143 --- /dev/null +++ b/onewire/onewire.cpp @@ -0,0 +1,188 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2018 Bernhard Trinnes * + * * + * This file is part of nymea. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; If not, see * + * . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "onewire.h" +#include "extern-plugininfo.h" + +OneWire::OneWire(const QByteArray &deviceLocation, QObject *parent) : + QObject(parent), + m_deviceLocation(deviceLocation) +{ + +} + +OneWire::~OneWire() +{ + OW_finish(); +} + +bool OneWire::init() +{ + QByteArray initArguments; + initArguments.append("--fake 28 --fake 10"); + if (OW_init(initArguments) < 0) { + qWarning(dcOneWire()) << "ERROR initialising one wire" << strerror(errno); + return false; + } + m_path = "/"; + + /*QByteArray defaultPath = "/"; + size_t dir_length ; + char *dir_buffer = nullptr; + if (OW_get(defaultPath, &dir_buffer, &dir_length) < 0) { + qWarning(dcOneWire()) << "ERROR initialising one wire" << strerror(errno); + return false; + } + m_path = QByteArray(dir_buffer, dir_length); + if(m_path[0] != '/') { + m_path.prepend('/'); + } + m_path.append('\0'); + qDebug(dcOneWire()) << "Path:" << m_path; + free(dir_buffer);*/ + return true; +} + +bool OneWire::discoverDevices() +{ + char *dirBuffer = nullptr; + size_t dirLength ; + + if (OW_get(m_path, &dirBuffer, &dirLength) < 0) { + qWarning(dcOneWire()) << "DIRECTORY ERROR" << strerror(errno); + return false; + } + qDebug(dcOneWire()) << "Directory has members" << dirBuffer; + + QList dirMembers ; + dirMembers = QByteArray(dirBuffer, dirLength).split(','); + free(dirBuffer); + + QList oneWireDevices; + foreach(QByteArray member, dirMembers) { + int family = member.split('.').first().toInt(nullptr, 16); + if (family != 0) { + qDebug(dcOneWire()) << "Member" << member << member.left(2) << family; + member.remove(member.indexOf('/'), 1); + QByteArray type; + OneWireDevice device; + device.family = family; + device.address = member; + device.id = member.split('.').last(); + device.type = getValue(member, "type"); + oneWireDevices.append(device); + } + } + if(!oneWireDevices.isEmpty()) { + emit devicesDiscovered(oneWireDevices); + } + return true; +} + +bool OneWire::interfaceIsAvailable() +{ + return true; +} + +bool OneWire::isConnected(const QByteArray &address) +{ + Q_UNUSED(address) + QByteArray fullPath; + fullPath.append(m_path); + fullPath.append(address); + fullPath.append('\0'); + if(OW_present(fullPath) < 0) + return false; + return true; +} + +/* Takes a path and filename and prints the 1-wire value */ +/* makes sure the bridging "/" in the path is correct */ +/* watches for total length and free allocated space */ +QByteArray OneWire::getValue(const QByteArray &address, const QByteArray &type) +{ + char * getBuffer ; + size_t getLength ; + + QByteArray devicePath; + devicePath.append(m_path); + if(!m_path.endsWith('/')) + devicePath.append('/'); + devicePath.append(address); + devicePath.append('/'); + devicePath.append(type); + devicePath.append('\0'); + + if (OW_get(devicePath, &getBuffer, &getLength) < 0) { + qWarning(dcOneWire()) << "ERROR reading" << devicePath << strerror(errno); + } + + qDebug(dcOneWire()) << "Device value" << devicePath << getBuffer; + + QByteArray value = QByteArray(getBuffer, getLength); + free(getBuffer); + return value; +} + +void OneWire::setValue(const QByteArray &address, const QByteArray &deviceType, const QByteArray &value) +{ + Q_UNUSED(address) + Q_UNUSED(deviceType) + Q_UNUSED(value) +} + +double OneWire::getTemperature(const QByteArray &address) +{ + QByteArray temperature = getValue(address, "temperature"); + qDebug(dcOneWire()) << "Temperature" << temperature << temperature.replace(',','.').toDouble(); + return temperature.toDouble(); +} + +QByteArray OneWire::readMemory(const QByteArray &address) +{ + //getValue + return address; //TODDO +} + +QByteArray OneWire::getType(const QByteArray &address) +{ + QByteArray type = getValue(address, "type"); + return type; +} + +bool OneWire::getSwitchState(const QByteArray &address) +{ + QByteArray state = getValue(address, "switch_state"); + qDebug(dcOneWire()) << "Switch state" << state; + return 0; //TODO +} + +void OneWire::setSwitchState(const QByteArray &address, bool state) +{ + if (state) { + setValue(address, "switch_state", "TRUE"); + } else { + setValue(address, "switch_state", "FALSE"); + } +} + + diff --git a/onewire/onewire.h b/onewire/onewire.h new file mode 100644 index 00000000..28953e4f --- /dev/null +++ b/onewire/onewire.h @@ -0,0 +1,76 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * * + * Copyright (C) 2018 Bernhard Trinnes * + * * + * This file is part of nymea. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library; If not, see * + * . * + * * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef ONEWIRE_H +#define ONEWIRE_H + +#include "owcapi.h" + +#include + +class OneWire : public QObject +{ + Q_OBJECT +public: + enum OneWireProperty { + Address, //The entire 64-bit unique ID + Crc, //The 8-bit error correction + Family, //The 8-bit family code + Id, //The 48-bit middle portion of the unique ID number. + Locator, //Uses an extension of the 1-wire design from iButtonLink company that associated 1-wire physical connections with a unique 1-wire code. + Type //Part name assigned by Dallas Semi. E.g. DS2401 + }; + + struct OneWireDevice { + QByteArray address; + int family; + QByteArray id; + QByteArray type; + }; + + explicit OneWire(const QByteArray &deviceLocation, QObject *parent = nullptr); + ~OneWire(); + bool init(); + + QByteArray getPath(); + bool discoverDevices(); + bool interfaceIsAvailable(); + bool isConnected(const QByteArray &address); + + double getTemperature(const QByteArray &address); + QByteArray getType(const QByteArray &address); + QByteArray readMemory(const QByteArray &address); + bool getSwitchState(const QByteArray &address); + void setSwitchState(const QByteArray &address, bool state); + + +private: + QByteArray m_deviceLocation; + QByteArray m_path; + QByteArray getValue(const QByteArray &address, const QByteArray &deviceType); + void setValue(const QByteArray &address, const QByteArray &deviceType, const QByteArray &value); + +signals: + void devicesDiscovered(QList devices); +}; + +#endif // ONEWIRE_H diff --git a/onewire/onewire.pro b/onewire/onewire.pro new file mode 100644 index 00000000..d7654850 --- /dev/null +++ b/onewire/onewire.pro @@ -0,0 +1,17 @@ +include(../plugins.pri) + +TARGET = $$qtLibraryTarget(nymea_devicepluginonewire) + +LIBS += \ + -low \ + -lowcapi \ + +SOURCES += \ + devicepluginonewire.cpp \ + onewire.cpp \ + +HEADERS += \ + devicepluginonewire.h \ + onewire.h \ + +