Add v2xeamberelectric plugin in nymea_plugin_repo
parent
93ed882bdb
commit
ee205a5bd0
|
|
@ -0,0 +1,43 @@
|
|||
# C++ objects and libs
|
||||
|
||||
*.slo
|
||||
*.lo
|
||||
*.o
|
||||
*.a
|
||||
*.la
|
||||
*.lai
|
||||
*.so
|
||||
*.dll
|
||||
*.dylib
|
||||
|
||||
# Qt-es
|
||||
|
||||
/.qmake.cache
|
||||
/.qmake.stash
|
||||
*.pro.user
|
||||
*.pro.user.*
|
||||
*.qbs.user
|
||||
*.qbs.user.*
|
||||
*.moc
|
||||
moc_*.cpp
|
||||
qrc_*.cpp
|
||||
ui_*.h
|
||||
Makefile*
|
||||
*-build-*
|
||||
|
||||
# QtCreator
|
||||
|
||||
*.autosave
|
||||
|
||||
#QtCtreator Qml
|
||||
*.qmlproject.user
|
||||
*.qmlproject.user.*
|
||||
|
||||
build-*
|
||||
html
|
||||
build
|
||||
vendor
|
||||
*.qmlc
|
||||
*.swp
|
||||
|
||||
.crossbuilder
|
||||
|
|
@ -0,0 +1,165 @@
|
|||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
|
||||
This version of the GNU Lesser General Public License incorporates
|
||||
the terms and conditions of version 3 of the GNU General Public
|
||||
License, supplemented by the additional permissions listed below.
|
||||
|
||||
0. Additional Definitions.
|
||||
|
||||
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||
General Public License.
|
||||
|
||||
"The Library" refers to a covered work governed by this License,
|
||||
other than an Application or a Combined Work as defined below.
|
||||
|
||||
An "Application" is any work that makes use of an interface provided
|
||||
by the Library, but which is not otherwise based on the Library.
|
||||
Defining a subclass of a class defined by the Library is deemed a mode
|
||||
of using an interface provided by the Library.
|
||||
|
||||
A "Combined Work" is a work produced by combining or linking an
|
||||
Application with the Library. The particular version of the Library
|
||||
with which the Combined Work was made is also called the "Linked
|
||||
Version".
|
||||
|
||||
The "Minimal Corresponding Source" for a Combined Work means the
|
||||
Corresponding Source for the Combined Work, excluding any source code
|
||||
for portions of the Combined Work that, considered in isolation, are
|
||||
based on the Application, and not on the Linked Version.
|
||||
|
||||
The "Corresponding Application Code" for a Combined Work means the
|
||||
object code and/or source code for the Application, including any data
|
||||
and utility programs needed for reproducing the Combined Work from the
|
||||
Application, but excluding the System Libraries of the Combined Work.
|
||||
|
||||
1. Exception to Section 3 of the GNU GPL.
|
||||
|
||||
You may convey a covered work under sections 3 and 4 of this License
|
||||
without being bound by section 3 of the GNU GPL.
|
||||
|
||||
2. Conveying Modified Versions.
|
||||
|
||||
If you modify a copy of the Library, and, in your modifications, a
|
||||
facility refers to a function or data to be supplied by an Application
|
||||
that uses the facility (other than as an argument passed when the
|
||||
facility is invoked), then you may convey a copy of the modified
|
||||
version:
|
||||
|
||||
a) under this License, provided that you make a good faith effort to
|
||||
ensure that, in the event an Application does not supply the
|
||||
function or data, the facility still operates, and performs
|
||||
whatever part of its purpose remains meaningful, or
|
||||
|
||||
b) under the GNU GPL, with none of the additional permissions of
|
||||
this License applicable to that copy.
|
||||
|
||||
3. Object Code Incorporating Material from Library Header Files.
|
||||
|
||||
The object code form of an Application may incorporate material from
|
||||
a header file that is part of the Library. You may convey such object
|
||||
code under terms of your choice, provided that, if the incorporated
|
||||
material is not limited to numerical parameters, data structure
|
||||
layouts and accessors, or small macros, inline functions and templates
|
||||
(ten or fewer lines in length), you do both of the following:
|
||||
|
||||
a) Give prominent notice with each copy of the object code that the
|
||||
Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
4. Combined Works.
|
||||
|
||||
You may convey a Combined Work under terms of your choice that,
|
||||
taken together, effectively do not restrict modification of the
|
||||
portions of the Library contained in the Combined Work and reverse
|
||||
engineering for debugging such modifications, if you also do each of
|
||||
the following:
|
||||
|
||||
a) Give prominent notice with each copy of the Combined Work that
|
||||
the Library is used in it and that the Library and its use are
|
||||
covered by this License.
|
||||
|
||||
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||
document.
|
||||
|
||||
c) For a Combined Work that displays copyright notices during
|
||||
execution, include the copyright notice for the Library among
|
||||
these notices, as well as a reference directing the user to the
|
||||
copies of the GNU GPL and this license document.
|
||||
|
||||
d) Do one of the following:
|
||||
|
||||
0) Convey the Minimal Corresponding Source under the terms of this
|
||||
License, and the Corresponding Application Code in a form
|
||||
suitable for, and under terms that permit, the user to
|
||||
recombine or relink the Application with a modified version of
|
||||
the Linked Version to produce a modified Combined Work, in the
|
||||
manner specified by section 6 of the GNU GPL for conveying
|
||||
Corresponding Source.
|
||||
|
||||
1) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (a) uses at run time
|
||||
a copy of the Library already present on the user's computer
|
||||
system, and (b) will operate properly with a modified version
|
||||
of the Library that is interface-compatible with the Linked
|
||||
Version.
|
||||
|
||||
e) Provide Installation Information, but only if you would otherwise
|
||||
be required to provide such information under section 6 of the
|
||||
GNU GPL, and only to the extent that such information is
|
||||
necessary to install and execute a modified version of the
|
||||
Combined Work produced by recombining or relinking the
|
||||
Application with a modified version of the Linked Version. (If
|
||||
you use option 4d0, the Installation Information must accompany
|
||||
the Minimal Corresponding Source and Corresponding Application
|
||||
Code. If you use option 4d1, you must provide the Installation
|
||||
Information in the manner specified by section 6 of the GNU GPL
|
||||
for conveying Corresponding Source.)
|
||||
|
||||
5. Combined Libraries.
|
||||
|
||||
You may place library facilities that are a work based on the
|
||||
Library side by side in a single library together with other library
|
||||
facilities that are not Applications and are not covered by this
|
||||
License, and convey such a combined library under terms of your
|
||||
choice, if you do both of the following:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work based
|
||||
on the Library, uncombined with any other library facilities,
|
||||
conveyed under the terms of this License.
|
||||
|
||||
b) Give prominent notice with the combined library that part of it
|
||||
is a work based on the Library, and explaining where to find the
|
||||
accompanying uncombined form of the same work.
|
||||
|
||||
6. Revised Versions of the GNU Lesser General Public License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions
|
||||
of the GNU Lesser General Public License from time to time. Such new
|
||||
versions will be similar in spirit to the present version, but may
|
||||
differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Library as you received it specifies that a certain numbered version
|
||||
of the GNU Lesser General Public License "or any later version"
|
||||
applies to it, you have the option of following the terms and
|
||||
conditions either of that published version or of any later version
|
||||
published by the Free Software Foundation. If the Library as you
|
||||
received it does not specify a version number of the GNU Lesser
|
||||
General Public License, you may choose any version of the GNU Lesser
|
||||
General Public License ever published by the Free Software Foundation.
|
||||
|
||||
If the Library as you received it specifies that a proxy can decide
|
||||
whether future versions of the GNU Lesser General Public License shall
|
||||
apply, that proxy's public statement of acceptance of any version is
|
||||
permanent authorization for you to choose that version for the
|
||||
Library.
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
# v2xe_amber_electric_api
|
||||
--------------------------------
|
||||
|
||||
Description of the plugin...
|
||||
|
||||
plugin for amber electric api to get live data of energy use ,
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
nymea-plugin-v2xeamberelectric (0.0.1) bookworm; urgency=medium
|
||||
|
||||
* Initial release.
|
||||
|
||||
-- devendragajjar <devendragajjar@gmail.com> Mon, 21 Aug 2017 10:12:00 +0000
|
||||
|
|
@ -0,0 +1 @@
|
|||
11
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
Source: nymea-plugin-v2xeamberelectric
|
||||
Section: utils
|
||||
Priority: optional
|
||||
Maintainer: devendragajjar <devendragajjar@gmail.com>
|
||||
Standards-Version: 4.6.0
|
||||
Build-depends: debhelper (>= 9.0.0),
|
||||
libnymea1-dev,
|
||||
nymea-dev-tools:native,
|
||||
qt5-qmake:native,
|
||||
pkg-config,
|
||||
|
||||
|
||||
Package: nymea-plugin-v2xeamberelectric
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Section: libs
|
||||
Depends: ${shlibs:Depends},
|
||||
${misc:Depends},
|
||||
Description: nymea.io plugin for v2xeamberelectric
|
||||
The nymea daemon is a plugin based IoT (Internet of Things) server. The
|
||||
server works like a translator for devices, things and services and
|
||||
allows them to interact.
|
||||
With the powerful rule engine you are able to connect any device available
|
||||
in the system and create individual scenes and behaviors for your environment.
|
||||
.
|
||||
This package will install the nymea.io plugin for v2xeamberelectric
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: ${ProjectName}
|
||||
Upstream-Contact: devendragajjar <devendragajjar@gmail.com>
|
||||
Copyright: 2024, devendragajjar
|
||||
|
||||
|
||||
License: LGPL-3
|
||||
On Debian systems, the complete text of the GNU Lesser General
|
||||
Public License can be found in `/usr/share/common-licenses/LGPL-3'.
|
||||
|
||||
Files: *
|
||||
License: LGPL-3
|
||||
Copyright: devendragajjar <devendragajjar@gmail.com>
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
usr/lib/@DEB_HOST_MULTIARCH@/nymea/plugins/libnymea_integrationpluginEV_charger.so
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/make -f
|
||||
# -*- makefile -*-
|
||||
|
||||
export DH_VERBOSE=1
|
||||
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
|
||||
|
||||
PREPROCESS_FILES := $(wildcard debian/*.in)
|
||||
|
||||
$(PREPROCESS_FILES:.in=): %: %.in
|
||||
sed 's,/@DEB_HOST_MULTIARCH@,$(DEB_HOST_MULTIARCH:%=/%),g' $< > $@
|
||||
|
||||
override_dh_install: $(PREPROCESS_FILES:.in=)
|
||||
make -j9 install DESTDIR=debian/tmp AM_UPDATE_INFO_DIR=no INSTALL_ROOT=debian/tmp
|
||||
dh_install
|
||||
|
||||
override_dh_missing:
|
||||
dh_missing --list-missing
|
||||
|
||||
override_dh_auto_build:
|
||||
dh_auto_build
|
||||
make lrelease
|
||||
|
||||
override_dh_auto_clean:
|
||||
dh_auto_clean
|
||||
rm -rf $(PREPROCESS_FILES:.in=)
|
||||
|
||||
%:
|
||||
dh $@ --parallel
|
||||
|
||||
|
|
@ -0,0 +1 @@
|
|||
3.0 (native)
|
||||
|
|
@ -0,0 +1,176 @@
|
|||
{
|
||||
"name": "Amber_Electric_plgn",
|
||||
"displayName": "Amber_Electric_plgn",
|
||||
"id": "0233c848-6f6f-4907-a51c-81391e4f5356",
|
||||
"vendors": [
|
||||
{
|
||||
"name": "Amber_Electric",
|
||||
"displayName": "Amber_Electric",
|
||||
"id": "ec1985b9-5891-435d-9264-e8e18d392978",
|
||||
"thingClasses": [
|
||||
{
|
||||
"name": "V2Xe_Amber_Electric",
|
||||
"displayName": "V2Xe_Amber_Electric",
|
||||
"id": "11295990-7002-432e-b90c-cd4010548a32",
|
||||
"setupMethod": "JustAdd",
|
||||
"createMethods": ["User"],
|
||||
"interfaces": ["energystorage", "connectable"],
|
||||
"paramTypes": [
|
||||
{
|
||||
"id": "fc899f7b-f452-44dc-b72e-ee7bb8034ff0",
|
||||
"name": "auth_token",
|
||||
"displayName": "auth_token",
|
||||
"type" : "QString",
|
||||
"defaultValue": ""
|
||||
},
|
||||
{
|
||||
"id": "c50eac84-714e-4b9c-89d5-0b939b6c18d6",
|
||||
"name": "crnt_site",
|
||||
"displayName": "current_site",
|
||||
"type" : "QString",
|
||||
"defaultValue": ""
|
||||
}
|
||||
],
|
||||
"stateTypes": [
|
||||
{
|
||||
"id": "faf2a6c0-1897-4b9b-903a-e12b281efe24",
|
||||
"name": "connected",
|
||||
"displayName": "Reachable",
|
||||
"displayNameEvent": "Reachable changed",
|
||||
"type": "bool",
|
||||
"defaultValue": false,
|
||||
"cached": false
|
||||
},
|
||||
{
|
||||
"id": "42c8a6f8-4f97-4871-8bfb-ac7e6ffffa74",
|
||||
"name": "Sites",
|
||||
"displayName": "Sites",
|
||||
"displayNameEvent": "Sites_list_updated",
|
||||
"type": "QString",
|
||||
"writable": false,
|
||||
"defaultValue": ""
|
||||
},
|
||||
{
|
||||
"id": "27c3f8e0-0803-4eb8-ba4f-ce78fb0997a9",
|
||||
"name": "Type",
|
||||
"displayName": "type",
|
||||
"displayNameEvent": "type_evnet",
|
||||
"type": "QString",
|
||||
"defaultValue": "Amber"
|
||||
},
|
||||
{
|
||||
"id": "6e8d3fcd-c235-4793-95b5-321ca6e012a3",
|
||||
"name": "price",
|
||||
"displayName": "Feedin Price",
|
||||
"displayNameEvent": "AveragePrice_changed",
|
||||
"type": "double",
|
||||
"minValue": 0,
|
||||
"maxValue": 100,
|
||||
"defaultValue": 100,
|
||||
"unit": "EuroCentPerKiloWattHour",
|
||||
"suggestLogging": true
|
||||
},
|
||||
{
|
||||
"id": "a25d3b55-9b93-4465-90e3-5d36adb8fb23",
|
||||
"name": "currentprice",
|
||||
"displayName": "Current Price",
|
||||
"displayNameEvent": "currentPrice_changed",
|
||||
"type": "double",
|
||||
"minValue": 0,
|
||||
"maxValue": 1000,
|
||||
"unit":"EuroCentPerKiloWattHour",
|
||||
"defaultValue": 0,
|
||||
"suggestLogging": true
|
||||
},
|
||||
{
|
||||
"id": "cd1e22b2-2154-453a-bbdf-59156893258a",
|
||||
"name": "currentfeedin",
|
||||
"displayName": "Current Feedin",
|
||||
"displayNameEvent": "currentfeedinPrice changed",
|
||||
"type": "double",
|
||||
"minValue": 0,
|
||||
"maxValue": 1000,
|
||||
"unit":"EuroCentPerKiloWattHour",
|
||||
"defaultValue": 0,
|
||||
"suggestLogging": true
|
||||
},
|
||||
{
|
||||
"id": "52188fdf-4a4d-4ca8-b02e-cea5ed8c1615",
|
||||
"name": "futurefeedin",
|
||||
"displayName": "Future Feedin",
|
||||
"displayNameEvent": "futurefeedinPrice changed",
|
||||
"type": "double",
|
||||
"minValue": 0,
|
||||
"maxValue": 1000,
|
||||
"unit":"EuroCentPerKiloWattHour",
|
||||
"defaultValue": 0,
|
||||
"suggestLogging": true
|
||||
},
|
||||
{
|
||||
"id": "690d562e-a75d-4da9-940f-e1908544dbae",
|
||||
"name": "chargingState",
|
||||
"displayName": "Charging state",
|
||||
"displayNameEvent": "Charging state changed",
|
||||
"type": "QString",
|
||||
"possibleValues": ["idle", "charging", "discharging"],
|
||||
"defaultValue": "idle"
|
||||
},
|
||||
{
|
||||
"id": "d5ce4925-49e5-49b6-88d8-6e3889080be2",
|
||||
"name": "currentPower",
|
||||
"displayName": "Current power",
|
||||
"displayNameEvent": "Current power changed",
|
||||
"type": "double",
|
||||
"unit": "Watt",
|
||||
"defaultValue": 0,
|
||||
"cached": false,
|
||||
"suggestLogging": true
|
||||
},
|
||||
{
|
||||
"id": "420d2e55-afeb-4a83-b67a-e3c0a86ecc02",
|
||||
"name": "capacity",
|
||||
"displayName": "Capacity",
|
||||
"displayNameEvent": "Capacity changed",
|
||||
"type": "double",
|
||||
"unit": "KiloWattHour",
|
||||
"defaultValue": 0
|
||||
},
|
||||
{
|
||||
"id": "df196e56-f33a-4883-a9b4-345dab2bac95",
|
||||
"name": "batteryLevel",
|
||||
"displayName": "Battery level",
|
||||
"displayNameEvent": "Battery level changed",
|
||||
"type": "int",
|
||||
"unit": "Percentage",
|
||||
"defaultValue": "0",
|
||||
"minValue": 0,
|
||||
"maxValue": 100
|
||||
},
|
||||
{
|
||||
"id": "6225b633-b159-4794-9e54-84912049fd32",
|
||||
"name": "cellTemperature",
|
||||
"displayName": "Cell temperature",
|
||||
"displayNameEvent": "Cell temperature changed",
|
||||
"type": "double",
|
||||
"unit": "DegreeCelsius",
|
||||
"defaultValue": "0",
|
||||
"cached": false
|
||||
},
|
||||
{
|
||||
"id": "20410ff8-b9aa-4b63-a091-c3636278718e",
|
||||
"name": "batteryCritical",
|
||||
"displayName": "Battery level critical",
|
||||
"displayNameEvent": "Battery level critical changed",
|
||||
"type": "bool",
|
||||
"defaultValue": false
|
||||
}
|
||||
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,399 @@
|
|||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* *
|
||||
* Copyright (C) 2024 devendragajjar <devendragajjar@gmail.com> *
|
||||
* *
|
||||
* 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; *
|
||||
* version 3 of the License. *
|
||||
* *
|
||||
* 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 *
|
||||
* <http://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#include "v2xe_amber_electric.h"
|
||||
#include "plugininfo.h"
|
||||
#include "hardwaremanager.h"
|
||||
#include "network/networkaccessmanager.h"
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QJsonDocument>
|
||||
#include <QSslConfiguration>
|
||||
#include <QJsonArray>
|
||||
#include <QJsonObject>
|
||||
#include <QJsonValue>
|
||||
|
||||
|
||||
|
||||
|
||||
const QString const_site = "01J1XBQFGX57137EH0C6AG040D";
|
||||
const QString no_of_data_need = "5";
|
||||
const QString site_http_link = "https://api.amber.com.au/v1/sites";
|
||||
const QString price_http_link_front = "https://api.amber.com.au/v1/sites/";
|
||||
const QString price_http_link_back = "/prices/current?next="+ no_of_data_need +"&previous=" + no_of_data_need;
|
||||
//01J1XBQFGX57137EH0C6AG040D/prices/current?next=5&previous=5";
|
||||
const QString auth_token = "f5b2c823de5fed2f4c6bdb7c1b0db4f5";
|
||||
const QString renewble_http_link = "https://api.amber.com.au/v1/state/vic/renewables/current?next=48&previous=5&resolution=5";
|
||||
|
||||
|
||||
v2xe_amber_electric::v2xe_amber_electric()
|
||||
{
|
||||
m_connectedStateTypeIds[V2Xe_Amber_ElectricThingClassId] = V2Xe_Amber_ElectricConnectedStateTypeId;
|
||||
m_forecastPriceStateTypeIds[V2Xe_Amber_ElectricThingClassId] = V2Xe_Amber_ElectricForecastpriceStateTypeId;
|
||||
m_currentPriceStateTypeIds[V2Xe_Amber_ElectricThingClassId] = V2Xe_Amber_ElectricCurrentpriceStateTypeId;
|
||||
m_currentSiteTypeIds[V2Xe_Amber_ElectricThingClassId] = V2Xe_Amber_ElectricSitesStateTypeId;
|
||||
m_currentfeddinStateTypeIds[V2Xe_Amber_ElectricThingClassId] = V2Xe_Amber_ElectricCurrentfeedinStateTypeId;
|
||||
m_fururefeedinStateTypeIds[V2Xe_Amber_ElectricThingClassId] = V2Xe_Amber_ElectricFuturefeedinStateTypeId;
|
||||
m_consumerKey = auth_token;
|
||||
}
|
||||
|
||||
v2xe_amber_electric::~v2xe_amber_electric()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void v2xe_amber_electric::init()
|
||||
{
|
||||
// Initialisation can be done here.
|
||||
qCDebug(dcAmber_Electric_plgn()) << "Plugin initialized.";
|
||||
}
|
||||
|
||||
|
||||
|
||||
void v2xe_amber_electric::setupThing(ThingSetupInfo *info)
|
||||
{
|
||||
// A thing is being set up. Use info->thing() to get details of the thing, do
|
||||
// the required setup (e.g. connect to the device) and call info->finish() when done.
|
||||
|
||||
qCDebug(dcAmber_Electric_plgn()) << "Setup thing" << info->thing()->name() << info->thing()->params();
|
||||
QString key = info->thing()->paramValue(V2Xe_Amber_ElectricThingAuth_tokenParamTypeId).toString();
|
||||
if (!key.isEmpty()) {
|
||||
m_consumerKey = key;
|
||||
qCCritical(dcAmber_Electric_plgn()) << "m_consumerKey set " << m_consumerKey << "key " << key;
|
||||
}
|
||||
|
||||
QString site = info->thing()->paramValue(V2Xe_Amber_ElectricThingCrnt_siteParamTypeId).toString();
|
||||
if (!site.isEmpty()) {
|
||||
m_current_site = site;
|
||||
qCCritical(dcAmber_Electric_plgn()) << "m_current_site set " << m_current_site ;
|
||||
}
|
||||
else{
|
||||
m_current_site = const_site;
|
||||
}
|
||||
|
||||
// use defult key for now
|
||||
qCCritical(dcAmber_Electric_plgn()) << "No API key set.";
|
||||
qCCritical(dcAmber_Electric_plgn()) << "Either install an API key pacakge (nymea-apikeysprovider-plugin-*) or provide a key in the plugin settings.";
|
||||
|
||||
if (!m_pluginTimer) {
|
||||
m_pluginTimer = hardwareManager()->pluginTimerManager()->registerTimer(60);//TODO make 30 minutes after test
|
||||
connect(m_pluginTimer, &PluginTimer::timeout, this, &v2xe_amber_electric::onPluginTimer);
|
||||
}
|
||||
info->finish(Thing::ThingErrorNoError);
|
||||
}
|
||||
|
||||
void v2xe_amber_electric::onPluginTimer()
|
||||
{
|
||||
foreach (Thing *thing, myThings()) {
|
||||
|
||||
//requestPriceData(thing); // TODO
|
||||
#if ENABLE_RENEWEBLE_API
|
||||
requestRenewablesData(thing); //TODO
|
||||
#endif
|
||||
requestSiteData(thing);
|
||||
requestSitePriceData(thing);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void v2xe_amber_electric::executeAction(ThingActionInfo *info)
|
||||
{
|
||||
// An action is being executed. Use info->action() to get details about the action,
|
||||
// do the required operations (e.g. send a command to the network) and call info->finish() when done.
|
||||
|
||||
qCDebug(dcAmber_Electric_plgn()) << "Executing action for thing" << info->thing() << info->action().actionTypeId().toString() << info->action().params();
|
||||
|
||||
info->finish(Thing::ThingErrorNoError);
|
||||
}
|
||||
|
||||
void v2xe_amber_electric::thingRemoved(Thing *thing)
|
||||
{
|
||||
// A thing is being removed from the system. Do the required cleanup
|
||||
// (e.g. disconnect from the device) here.
|
||||
|
||||
qCDebug(dcAmber_Electric_plgn()) << "Remove thing" << thing;
|
||||
}
|
||||
|
||||
void v2xe_amber_electric::requestSitePriceData(Thing* thing, ThingSetupInfo* setup) {
|
||||
|
||||
QString price_http_link = price_http_link_front + m_current_site + price_http_link_back;
|
||||
|
||||
m_serverUrls[V2Xe_Amber_ElectricThingClassId] = price_http_link;
|
||||
|
||||
QNetworkRequest request;
|
||||
request.setUrl(QUrl(m_serverUrls[V2Xe_Amber_ElectricThingClassId]));
|
||||
|
||||
// Add the Authorization header with the token
|
||||
QString token = thing->paramValue(m_consumerKey).toString();
|
||||
token = m_consumerKey;
|
||||
qCCritical(dcAmber_Electric_plgn) << " using m_consumerKey " <<m_consumerKey;
|
||||
request.setRawHeader("Authorization", QString("Bearer %1").arg(token).toUtf8());
|
||||
request.setRawHeader("accept", "application/json");
|
||||
|
||||
QNetworkReply* reply =hardwareManager()->networkManager()->get(request);
|
||||
connect(reply, &QNetworkReply::finished, this, [this, thing, setup, reply]() {
|
||||
reply->deleteLater();
|
||||
|
||||
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
if (status != 200) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "Update reply HTTP error:" << status << reply->errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Error getting data from server."));
|
||||
} else {
|
||||
//thing->setStateValue(m_connectedStateTypeIds.value(thing->thingClassId()), false);//TODO remove comment
|
||||
}
|
||||
return;
|
||||
}
|
||||
onSitePriceDataReceived(thing, setup, reply);
|
||||
});
|
||||
}
|
||||
|
||||
void v2xe_amber_electric::onSitePriceDataReceived(Thing* thing, ThingSetupInfo* setup, QNetworkReply* reply) {
|
||||
if (reply->error() != QNetworkReply::NoError) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "Network error:" << reply->errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Network error."));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
QJsonParseError error;
|
||||
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error);
|
||||
if (error.error != QJsonParseError::NoError) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "JSON parse error:" << error.errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("JSON parse error."));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (jsonDoc.isArray()) {
|
||||
QString channelType;
|
||||
QJsonArray jsonArray = jsonDoc.array();
|
||||
for (const QJsonValue &value : jsonArray) {
|
||||
if (value.isObject()) {
|
||||
QJsonObject jsonObject = value.toObject();
|
||||
QString type = jsonObject["type"].toString(); //Get type
|
||||
channelType = jsonObject["channelType"].toString();
|
||||
|
||||
//Current Price
|
||||
if((type == "CurrentInterval") && channelType == "general"){
|
||||
|
||||
if (jsonObject.contains("perKwh") && jsonObject["perKwh"].isDouble()) { // Get perKwh
|
||||
|
||||
double perkwh = jsonObject["perKwh"].toDouble();
|
||||
|
||||
thing->setStateValue(m_currentPriceStateTypeIds.value(thing->thingClassId()), qAbs(perkwh));
|
||||
}
|
||||
}
|
||||
|
||||
//Future Price
|
||||
if((type == "ForecastInterval") && channelType == "general"){
|
||||
|
||||
if (jsonObject.contains("perKwh") && jsonObject["perKwh"].isDouble()) { // Get perKwh
|
||||
|
||||
double perkwh = jsonObject["perKwh"].toDouble();
|
||||
|
||||
thing->setStateValue(m_forecastPriceStateTypeIds.value(thing->thingClassId()), qAbs(perkwh));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Current Feedin //TODO what is feed in price its dummy data
|
||||
if((type == "CurrentInterval") && (channelType == "feedIn")){
|
||||
|
||||
if (jsonObject.contains("perKwh") && jsonObject["perKwh"].isDouble()) { // Get SportPerKwh
|
||||
double spotperkwh = jsonObject["perKwh"].toDouble();
|
||||
|
||||
thing->setStateValue(m_currentfeddinStateTypeIds.value(thing->thingClassId()), qAbs(spotperkwh));
|
||||
}
|
||||
}
|
||||
|
||||
//Future Feedin
|
||||
if((type == "ForecastInterval") && (channelType == "feedIn")){
|
||||
|
||||
if (jsonObject.contains("perKwh") && jsonObject["perKwh"].isDouble()) { // Get SportPerKwh
|
||||
double spotperkwh = jsonObject["perKwh"].toDouble();
|
||||
|
||||
thing->setStateValue(m_fururefeedinStateTypeIds.value(thing->thingClassId()), qAbs(spotperkwh));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorNoError);
|
||||
}
|
||||
thing->setStateValue(m_connectedStateTypeIds.value(thing->thingClassId()), true);
|
||||
}
|
||||
|
||||
|
||||
void v2xe_amber_electric::requestSiteData(Thing* thing, ThingSetupInfo* setup) {
|
||||
|
||||
m_serverUrls[V2Xe_Amber_ElectricThingClassId] = site_http_link;
|
||||
|
||||
|
||||
QNetworkRequest request;
|
||||
request.setUrl(QUrl(m_serverUrls[V2Xe_Amber_ElectricThingClassId]));
|
||||
|
||||
// Add the Authorization header with the token
|
||||
QString token = thing->paramValue(m_consumerKey).toString();
|
||||
token = m_consumerKey;
|
||||
qCCritical(dcAmber_Electric_plgn) << " using m_consumerKey " <<m_consumerKey;
|
||||
request.setRawHeader("Authorization", QString("Bearer %1").arg(token).toUtf8());
|
||||
request.setRawHeader("accept", "application/json");
|
||||
|
||||
QNetworkReply* reply =hardwareManager()->networkManager()->get(request);
|
||||
connect(reply, &QNetworkReply::finished, this, [this, thing, setup, reply]() {
|
||||
reply->deleteLater();
|
||||
|
||||
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
if (status != 200) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "Update reply HTTP error:" << status << reply->errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Error getting data from server."));
|
||||
} else {
|
||||
thing->setStateValue(m_connectedStateTypeIds.value(thing->thingClassId()), false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
onSiteDataReceived(thing, setup, reply);
|
||||
});
|
||||
}
|
||||
|
||||
void v2xe_amber_electric::onSiteDataReceived(Thing* thing, ThingSetupInfo* setup, QNetworkReply* reply) {
|
||||
if (reply->error() != QNetworkReply::NoError) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "Network error:" << reply->errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Network error."));
|
||||
}
|
||||
return;
|
||||
}
|
||||
QVariantList stringList = {};
|
||||
QString l_site;
|
||||
QJsonParseError error;
|
||||
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error);
|
||||
if (error.error != QJsonParseError::NoError) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "JSON parse error:" << error.errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("JSON parse error."));
|
||||
}
|
||||
return;
|
||||
}
|
||||
qCCritical(dcAmber_Electric_plgn) << "onSiteDataReceived " ;
|
||||
if (jsonDoc.isArray()) {
|
||||
QJsonArray jsonArray = jsonDoc.array();
|
||||
for (const QJsonValue &value : jsonArray) {
|
||||
if (value.isObject()) {
|
||||
QJsonObject jsonObject = value.toObject();
|
||||
QString type = jsonObject["id"].toString(); //Get type
|
||||
|
||||
if(!type.isEmpty()){ //update
|
||||
stringList.append(type);
|
||||
qCCritical(dcAmber_Electric_plgn) << "type :" << type;
|
||||
l_site = type;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
thing->setStateValue(m_currentSiteTypeIds.value(thing->thingClassId()), l_site);
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorNoError);
|
||||
}
|
||||
thing->setStateValue(m_connectedStateTypeIds.value(thing->thingClassId()), true);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if ENABLE_RENEWEBLE_API
|
||||
void v2xe_amber_electric::requestRenewablesData(Thing* thing, ThingSetupInfo* setup) {
|
||||
|
||||
m_serverUrls[V2Xe_Amber_ElectricThingClassId] = renewble_http_link;
|
||||
|
||||
QNetworkRequest request;
|
||||
request.setUrl(QUrl(m_serverUrls[V2Xe_Amber_ElectricThingClassId]));
|
||||
|
||||
// Add the Authorization header with the token
|
||||
QString token = thing->paramValue(m_consumerKey).toString();
|
||||
request.setRawHeader("Authorization", QString("Bearer %1").arg(token).toUtf8());
|
||||
request.setRawHeader("accept", "application/json");
|
||||
|
||||
QNetworkReply* reply = hardwareManager()->networkManager()->get(request);
|
||||
connect(reply, &QNetworkReply::finished, this, [this, thing, setup, reply]() {
|
||||
reply->deleteLater();
|
||||
|
||||
int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||
if (status != 200) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "Update reply HTTP error:" << status << reply->errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Error getting data from server."));
|
||||
} else {
|
||||
//thing->setStateValue(m_connectedStateTypeIds.value(thing->thingClassId()), false);//TODO remove comment
|
||||
}
|
||||
return;
|
||||
}
|
||||
onRenewablesDataReceived(thing, setup, reply);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void v2xe_amber_electric::onRenewablesDataReceived(Thing* thing, ThingSetupInfo* setup, QNetworkReply* reply) {
|
||||
|
||||
if (reply->error() != QNetworkReply::NoError) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "Network error:" << reply->errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("Network error."));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
QJsonParseError error;
|
||||
QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll(), &error);
|
||||
if (error.error != QJsonParseError::NoError) {
|
||||
qCWarning(dcAmber_Electric_plgn) << "JSON parse error:" << error.errorString();
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorHardwareFailure, QT_TR_NOOP("JSON parse error."));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (jsonDoc.isArray()) {
|
||||
QJsonArray jsonArray = jsonDoc.array();
|
||||
for (const QJsonValue &value : jsonArray) {
|
||||
if (value.isObject()) {
|
||||
QJsonObject jsonObject = value.toObject();
|
||||
QString type = jsonObject["type"].toString();
|
||||
if (type == "ActualRenewable") {
|
||||
//double renewables = jsonObject["renewables"].toDouble();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (setup) {
|
||||
setup->finish(Thing::ThingErrorNoError);
|
||||
}
|
||||
thing->setStateValue(m_connectedStateTypeIds.value(thing->thingClassId()), true);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
||||
* *
|
||||
* Copyright (C) 2020 devendragajjar <devendragajjar@gmail.com> *
|
||||
* *
|
||||
* 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; *
|
||||
* version 3 of the License. *
|
||||
* *
|
||||
* 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 *
|
||||
* <http://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||
|
||||
#ifndef INTEGRATIONPLUGINEV_CHARGER_H
|
||||
#define INTEGRATIONPLUGINEV_CHARGER_H
|
||||
|
||||
#include "integrations/integrationplugin.h"
|
||||
#include "extern-plugininfo.h"
|
||||
#include "plugintimer.h"
|
||||
#include "network/networkaccessmanager.h"
|
||||
|
||||
#include <QHash>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
#include <QPointer>
|
||||
#include <QNetworkReply>
|
||||
|
||||
#define ENABLE_RENEWEBLE_API 0
|
||||
|
||||
class v2xe_amber_electric: public IntegrationPlugin
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
Q_PLUGIN_METADATA(IID "io.nymea.IntegrationPlugin" FILE "integrationpluginv2xe_amber_electric.json")
|
||||
Q_INTERFACES(IntegrationPlugin)
|
||||
|
||||
|
||||
public:
|
||||
explicit v2xe_amber_electric();
|
||||
~v2xe_amber_electric();
|
||||
|
||||
void init() override;
|
||||
|
||||
void setupThing(ThingSetupInfo *info) override;
|
||||
|
||||
void executeAction(ThingActionInfo *info) override;
|
||||
|
||||
void thingRemoved(Thing *thing) override;
|
||||
|
||||
private slots:
|
||||
void onPluginTimer();
|
||||
void requestSitePriceData(Thing* thing, ThingSetupInfo* setup = nullptr);
|
||||
void requestSiteData(Thing* thing, ThingSetupInfo* setup = nullptr);
|
||||
#if ENABLE_RENEWEBLE_API
|
||||
void requestRenewablesData(Thing* thing, ThingSetupInfo* setup = nullptr);
|
||||
#endif
|
||||
|
||||
private:
|
||||
PluginTimer *m_pluginTimer = nullptr;
|
||||
QString m_consumerKey;
|
||||
QString m_current_site;
|
||||
QHash<ThingClassId, QString> m_serverUrls;
|
||||
QHash<ThingClassId, StateTypeId> m_connectedStateTypeIds;
|
||||
QHash<ThingClassId, StateTypeId> m_forecastPriceStateTypeIds;
|
||||
QHash<ThingClassId, StateTypeId> m_currentPriceStateTypeIds;
|
||||
QHash<ThingClassId, StateTypeId> m_currentSiteTypeIds;
|
||||
QHash<ThingClassId, StateTypeId> m_currentfeddinStateTypeIds;
|
||||
QHash<ThingClassId, StateTypeId> m_fururefeedinStateTypeIds;
|
||||
|
||||
void onSiteDataReceived(Thing* thing, ThingSetupInfo* setup = nullptr, QNetworkReply* reply = nullptr);
|
||||
void onSitePriceDataReceived(Thing* thing, ThingSetupInfo* setup = nullptr, QNetworkReply* reply = nullptr);
|
||||
#if ENABLE_RENEWEBLE_API
|
||||
void onRenewablesDataReceived(Thing* thing, ThingSetupInfo* setup = nullptr, QNetworkReply* reply = nullptr);
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif // INTEGRATIONPLUGINEV_CHARGER_H
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
include($$[QT_INSTALL_PREFIX]/include/nymea/plugin.pri)
|
||||
|
||||
QT += network
|
||||
|
||||
SOURCES += \
|
||||
v2xe_amber_electric.cpp
|
||||
|
||||
HEADERS += \
|
||||
v2xe_amber_electric.h
|
||||
|
||||
DISTFILES += \
|
||||
integrationpluginv2xe_amber_electric.json
|
||||
|
||||
Loading…
Reference in New Issue