Merge PR #218: Add Qt6 support

This commit is contained in:
jenkins 2025-09-11 14:25:48 +02:00
commit b2b802ed19
132 changed files with 780 additions and 192 deletions

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright 2013 - 2021, nymea GmbH * Copyright 2013 - 2025, nymea GmbH
* Contact: contact@nymea.io * Contact: contact@nymea.io
* *
* This file is part of nymea. * This file is part of nymea.
@ -29,6 +29,7 @@
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "integrationpluginalphainnotec.h" #include "integrationpluginalphainnotec.h"
#include "alphainnotecmodbustcpconnection.h"
#include "plugininfo.h" #include "plugininfo.h"
#include <network/networkdevicediscovery.h> #include <network/networkdevicediscovery.h>

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright 2013 - 2020, nymea GmbH * Copyright 2013 - 2025, nymea GmbH
* Contact: contact@nymea.io * Contact: contact@nymea.io
* *
* This file is part of nymea. * This file is part of nymea.
@ -34,9 +34,8 @@
#include <plugintimer.h> #include <plugintimer.h>
#include <integrations/integrationplugin.h> #include <integrations/integrationplugin.h>
#include "alphainnotecmodbustcpconnection.h"
class NetworkDeviceMonitor; class NetworkDeviceMonitor;
class AlphaInnotecModbusTcpConnection;
class IntegrationPluginAlphaInnotec: public IntegrationPlugin class IntegrationPluginAlphaInnotec: public IntegrationPlugin
{ {

View File

@ -52,7 +52,7 @@ void AmperfiedConnectDiscovery::startDiscovery(const QString &nameFilter)
connect(discoveryReply, &NetworkDeviceDiscoveryReply::hostAddressDiscovered, this, &AmperfiedConnectDiscovery::checkNetworkDevice); connect(discoveryReply, &NetworkDeviceDiscoveryReply::hostAddressDiscovered, this, &AmperfiedConnectDiscovery::checkNetworkDevice);
connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [=](){ connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [=](){
qCDebug(dcAmperfied()) << "Discovery: Network discovery finished. Found" << discoveryReply->networkDeviceInfos().count() << "network devices"; qCDebug(dcAmperfied()) << "Discovery: Network discovery finished. Found" << discoveryReply->networkDeviceInfos().length() << "network devices";
m_networkDeviceInfos = discoveryReply->networkDeviceInfos(); m_networkDeviceInfos = discoveryReply->networkDeviceInfos();
m_gracePeriodTimer.start(); m_gracePeriodTimer.start();
discoveryReply->deleteLater(); discoveryReply->deleteLater();
@ -144,14 +144,14 @@ void AmperfiedConnectDiscovery::finishDiscovery()
qint64 durationMilliSeconds = QDateTime::currentMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch(); qint64 durationMilliSeconds = QDateTime::currentMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch();
// Fill in finished network device information // Fill in finished network device information
for (int i = 0; i < m_discoveryResults.count(); i++) for (int i = 0; i < m_discoveryResults.length(); i++)
m_discoveryResults[i].networkDeviceInfo = m_networkDeviceInfos.get(m_discoveryResults.value(i).address); m_discoveryResults[i].networkDeviceInfo = m_networkDeviceInfos.get(m_discoveryResults.value(i).address);
// Cleanup any leftovers...we don't care any more // Cleanup any leftovers...we don't care any more
foreach (AmperfiedModbusTcpConnection *connection, m_connections) foreach (AmperfiedModbusTcpConnection *connection, m_connections)
cleanupConnection(connection); cleanupConnection(connection);
qCInfo(dcAmperfied()) << "Discovery: Finished the discovery process. Found" << m_discoveryResults.count() qCInfo(dcAmperfied()) << "Discovery: Finished the discovery process. Found" << m_discoveryResults.length()
<< "Amperfied wallboxes in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz"); << "Amperfied wallboxes in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz");
m_gracePeriodTimer.stop(); m_gracePeriodTimer.stop();

View File

@ -53,7 +53,7 @@ void IntegrationPluginAmperfied::discoverThings(ThingDiscoveryInfo *info)
return; return;
} }
qCInfo(dcAmperfied()) << "Discovery results:" << discovery->discoveryResults().count(); qCInfo(dcAmperfied()) << "Discovery results:" << discovery->discoveryResults().length();
foreach (const EnergyControlDiscovery::Result &result, discovery->discoveryResults()) { foreach (const EnergyControlDiscovery::Result &result, discovery->discoveryResults()) {
ThingDescriptor descriptor(energyControlThingClassId, "Amperfied Energy Control", QString("Slave ID: %1").arg(result.slaveId)); ThingDescriptor descriptor(energyControlThingClassId, "Amperfied Energy Control", QString("Slave ID: %1").arg(result.slaveId));
@ -82,7 +82,7 @@ void IntegrationPluginAmperfied::discoverThings(ThingDiscoveryInfo *info)
if (info->thingClassId() == connectHomeThingClassId || info->thingClassId() == connectBusinessThingClassId || info->thingClassId() == connectSolarThingClassId) { if (info->thingClassId() == connectHomeThingClassId || info->thingClassId() == connectBusinessThingClassId || info->thingClassId() == connectSolarThingClassId) {
AmperfiedConnectDiscovery *discovery = new AmperfiedConnectDiscovery(hardwareManager()->networkDeviceDiscovery(), info); AmperfiedConnectDiscovery *discovery = new AmperfiedConnectDiscovery(hardwareManager()->networkDeviceDiscovery(), info);
connect(discovery, &AmperfiedConnectDiscovery::discoveryFinished, info, [this, info, discovery](){ connect(discovery, &AmperfiedConnectDiscovery::discoveryFinished, info, [this, info, discovery](){
qCInfo(dcAmperfied()) << "Discovery results:" << discovery->discoveryResults().count(); qCInfo(dcAmperfied()) << "Discovery results:" << discovery->discoveryResults().length();
foreach (const AmperfiedConnectDiscovery::Result &result, discovery->discoveryResults()) { foreach (const AmperfiedConnectDiscovery::Result &result, discovery->discoveryResults()) {
QString description; QString description;

1
debian Symbolic link
View File

@ -0,0 +1 @@
debian-qt5

1
debian-qt6/changelog Symbolic link
View File

@ -0,0 +1 @@
../debian-qt5/changelog

1
debian-qt6/compat Normal file
View File

@ -0,0 +1 @@
13

308
debian-qt6/control Normal file
View File

@ -0,0 +1,308 @@
Source: nymea-plugins-modbus
Section: utils
Priority: optional
Maintainer: nymea GmbH <developer@nymea.io>
Standards-Version: 4.7.2
Build-depends: debhelper,
libnymea-dev,
libnymea-gpio-dev,
qt6-base-dev,
qt6-base-dev-tools,
qt6-serialport-dev,
qt6-serialbus-dev,
nymea-dev-tools:native,
pkg-config,
libi2c-dev,
python3:native
Package: libnymea-sunspec1
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends}
Description: nymea.io sunspec library
This package contains the nymea sunspec library.
Package: libnymea-sunspec-dev
Section: libdevel
Architecture: any
Multi-Arch: same
Depends: ${shlibs:Depends},
${misc:Depends},
libnymea-sunspec1 (= ${binary:Version}),
pkg-config,
qt6-base-dev,
qt6-base-dev-tools,
Description: The main libraries and header files for developing with nymea sunspec.
This package contains the nymea sunspec library - development files.
Package: libnymea-modbus
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends}
Description: nymea modbus integration plugins library
This package contains the nymea modbus library for integration plugins.
Package: libnymea-modbus-dev
Section: libdevel
Architecture: any
Multi-Arch: same
Depends: ${shlibs:Depends},
${misc:Depends},
libnymea-modbus (= ${binary:Version}),
pkg-config,
qt6-base-dev,
qt6-base-dev-tools,
python3,
Description: The main libraries and header files for developing with modbus based nymea integration plugins.
This package contains the nymea modbus integration plugin library - development files.
Package: nymea-modbus-cli
Architecture: any
Section: utils
Depends: ${shlibs:Depends},
${misc:Depends}
Description: nymea modbus command line tool for testing modbus TCP communication
This package contains the nymea modbus command line tool for testing modbus TCP communication.
Package: nymea-plugin-alphainnotec
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for alpha innotec heat pumps
This package contains the nymea integration plugin for alpha innotec head pumps.
Package: nymea-plugin-amperfied
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Amperfeid/Heidelberg wallboxes
This package contains the nymea integration plugin for Amperfeid/Heidelberg wallboxes.
Package: nymea-plugin-bgetech
Architecture: any
Multi-Arch: same
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for B+G E-Tech Modbus based energy meters
This package contains the nymea integration plugin for Modbus based energy meters
made by B+G E-Tech.
Package: nymea-plugin-drexelundweiss
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Drexel & Weiss heat pumps
This package contains the nymea integration plugin for Drexel & Weiss heat pumps.
Package: nymea-plugin-idm
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for iDM heat pumps
This package contains the nymea integration plugin for iDM heat pumps.
Package: nymea-plugin-inepro
Architecture: any
Multi-Arch: same
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for inepro Metering Modbus based energy meters
This package contains the nymea integration plugin for Modbus based energy meters
made by inepro Metering.
Package: nymea-plugin-inro
Architecture: any
Multi-Arch: same
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for INRO PANTABOX chargers
This package contains the nymea integration plugin for Modbus based PANTABOX
support.
Package: nymea-plugin-huawei
Architecture: any
Multi-Arch: same
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends}
Description: nymea integration plugin for Huawei FusionSolar energy devices
This package contains the nymea integration plugin for Huawei FusionSolar devices
based on Modbus TCP.
Package: nymea-plugin-kostal
Architecture: any
Multi-Arch: same
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends}
Description: nymea.io plugin for Kostal Solar inverters
This package contains the nymea.io plugin for Kostal Solar inverters
Package: nymea-plugin-mennekes
Architecture: any
Multi-Arch: same
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends}
Description: nymea.io plugin for Mennekes wallboxes
This package contains the nymea.io plugin for Mennekes wallboxes
Package: nymea-plugin-modbuscommander
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin to send and receive generic modbus commands
This package contains a nymea integration plugin which allows to send and receive
generic Modbus commands to/from a Modbus device.
Package: nymea-plugin-mypv
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for my-pv heating rods
This package contains the nymea integration plugin for my-pv solar inverters.
Package: nymea-plugin-mtec
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for M-TEC heat pumps
This package contains the nymea integration plugin for M-TEC heat pumps.
Package: nymea-plugin-schrack
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Schrack wallboxes
This package contains the nymea integration plugin for Schrack wallboxes.
Package: nymea-plugin-senseair
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Senseair sensors
This package contains the nymea integration plugin for Senseair sensors.
Package: nymea-plugin-sma
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends}
Description: nymea integration plugin for SMA solar inverters and meters
This package contains the nymea integration plugin for SMA solar inverters and meters.
Package: nymea-plugin-solax
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Solax modbus devices
This package contains the nymea integration plugin for solax compatible solar inverters, meters and batteries.
Package: nymea-plugin-stiebeleltron
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea.io plugin for Stiebel Eltron heat pumps
This package will install the nymea.io plugin for Stiebel Eltron heat pumps.
Package: nymea-plugin-sungrow
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Sungrow devices
This package contains the nymea integration plugin for Sungrow solar inverters, meters and batteries.
Package: nymea-plugin-sunspec
Architecture: any
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for SunSpec Modbus devices
This package contains the nymea integration plugin for SunSpec compatible solar inverters.
Package: nymea-plugin-pcelectric
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for PCE wallboxes
This package contains the nymea integration plugin for wallboxes made by PC Electric.
Package: nymea-plugin-phoenixconnect
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Conflicts: nymea-plugin-wallbe
Replaces: nymea-plugin-wallbe
Description: nymea integration plugin for PhoenixConnect wallboxes
This package contains the nymea integration plugin for wallboxes made
by PhonenixConnect and rebranded as Wallbe, Compleo and Scapo.
Package: nymea-plugin-vestel
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Vestel wallboxes
This package contains the nymea integration plugin for wallboxes made
by Vestel.
Package: nymea-plugin-wattsonic
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Wattsonic hybrid inverters
This package contains the nymea integration plugin for hybrid inverters made
by Wattsonic.
Package: nymea-plugin-webasto
Architecture: any
Section: libs
Depends: ${shlibs:Depends},
${misc:Depends},
Description: nymea integration plugin for Webasto Live wallboxes
This package contains the nymea integration plugin for wallboxes made
by Webasto.

1
debian-qt6/copyright Symbolic link
View File

@ -0,0 +1 @@
../debian-qt5/copyright

View File

@ -0,0 +1 @@
../debian-qt5/libnymea-modbus-dev.install.in

View File

@ -0,0 +1 @@
../debian-qt5/libnymea-modbus.install.in

View File

@ -0,0 +1 @@
../debian-qt5/libnymea-sunspec-dev.install.in

View File

@ -0,0 +1 @@
../debian-qt5/libnymea-sunspec1.dirs.in

View File

@ -0,0 +1 @@
../debian-qt5/libnymea-sunspec1.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-modbus-cli.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-alphainnotec.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-amperfied.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-bgetech.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-drexelundweiss.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-huawei.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-idm.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-inepro.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-inro.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-kostal.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-mennekes.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-modbuscommander.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-mtec.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-mypv.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-pcelectric.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-phoenixconnect.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-schrack.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-senseair.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-sma.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-solax.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-stiebeleltron.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-sungrow.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-sunspec.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-vestel.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-wattsonic.install.in

View File

@ -0,0 +1 @@
../debian-qt5/nymea-plugin-webasto.install.in

26
debian-qt6/rules Executable file
View File

@ -0,0 +1,26 @@
#!/usr/bin/make -f
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_auto_build:
dh_auto_build
make lrelease
override_dh_install: $(PREPROCESS_FILES:.in=)
dh_install
override_dh_auto_clean:
dh_auto_clean
find -name *plugininfo.h -exec rm {} \;
find -name *.qm -exec rm {} \;
find -name "autogenerated" -type d -exec rm -rvf {} +
rm -rf $(PREPROCESS_FILES:.in=)
%:
dh $@ --buildsystem=qmake6 --parallel

1
debian-qt6/source Symbolic link
View File

@ -0,0 +1 @@
../debian-qt5/source

View File

@ -132,7 +132,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter active power\" register" << 32080 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter active power\" register" << 32080 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 2)) { if (!valuesAreVaild(unit.values(), 2)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
} else { } else {
@ -177,7 +177,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter input power\" register" << 32064 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter input power\" register" << 32064 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 2)) { if (!valuesAreVaild(unit.values(), 2)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
} else { } else {
@ -222,7 +222,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter device status\" register" << 32089 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter device status\" register" << 32089 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 1)) { if (!valuesAreVaild(unit.values(), 1)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 1 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 1 << "but received" << unit.values();
} else { } else {
@ -266,7 +266,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter energy produced\" register" << 32106 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Inverter energy produced\" register" << 32106 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 2)) { if (!valuesAreVaild(unit.values(), 2)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
} else { } else {
@ -309,7 +309,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter active power\" register" << 37113 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter active power\" register" << 37113 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 2)) { if (!valuesAreVaild(unit.values(), 2)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
} else { } else {
@ -353,7 +353,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter Positive active electricity\" register" << 37119 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter Positive active electricity\" register" << 37119 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 2)) { if (!valuesAreVaild(unit.values(), 2)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
} else { } else {
@ -398,7 +398,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter Reverse active power\" register" << 37121 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Power meter Reverse active power\" register" << 37121 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 2)) { if (!valuesAreVaild(unit.values(), 2)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
} else { } else {
@ -443,7 +443,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 status\" register" << 37000 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 status\" register" << 37000 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 1)) { if (!valuesAreVaild(unit.values(), 1)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 1 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 1 << "but received" << unit.values();
} else { } else {
@ -499,7 +499,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 power\" register" << 37001 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 power\" register" << 37001 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 2)) { if (!valuesAreVaild(unit.values(), 2)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 2 << "but received" << unit.values();
} else { } else {
@ -542,7 +542,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 state of charge\" register" << 37004 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 1 state of charge\" register" << 37004 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 1)) { if (!valuesAreVaild(unit.values(), 1)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 1 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 1 << "but received" << unit.values();
} else { } else {
@ -586,7 +586,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 status\" register" << 37741 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 status\" register" << 37741 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 1)) { if (!valuesAreVaild(unit.values(), 1)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values count. Requested" << 1 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values count. Requested" << 1 << "but received" << unit.values();
} else { } else {
@ -642,7 +642,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 power\" register" << 37743 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 power\" register" << 37743 << "size:" << 2 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 2)) { if (!valuesAreVaild(unit.values(), 2)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values count. Requested" << 2 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values count. Requested" << 2 << "but received" << unit.values();
} else { } else {
@ -685,7 +685,7 @@ void HuaweiFusionSolar::readNextRegister()
handleModbusError(reply->error()); handleModbusError(reply->error());
if (reply->error() == QModbusDevice::NoError) { if (reply->error() == QModbusDevice::NoError) {
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 state of charge\" register" << 37738 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().count(); qCDebug(dcHuaweiFusionSolar()) << "<-- Response from \"Luna 2000 Battery 2 state of charge\" register" << 37738 << "size:" << 1 << "valueCount:" << unit.valueCount() << unit.values() << unit.values().length();
if (!valuesAreVaild(unit.values(), 1)) { if (!valuesAreVaild(unit.values(), 1)) {
qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 1 << "but received" << unit.values(); qCWarning(dcHuaweiFusionSolar()) << "<-- Received invalid values. Requested" << 1 << "but received" << unit.values();
} else { } else {
@ -712,7 +712,7 @@ void HuaweiFusionSolar::readNextRegister()
bool HuaweiFusionSolar::valuesAreVaild(const QVector<quint16> &values, int readSize) bool HuaweiFusionSolar::valuesAreVaild(const QVector<quint16> &values, int readSize)
{ {
if (values.count() != readSize) { if (values.length() != readSize) {
qCDebug(dcHuaweiFusionSolar()) << "Invalid values. The received values count does not match the requested" << readSize << "registers."; qCDebug(dcHuaweiFusionSolar()) << "Invalid values. The received values count does not match the requested" << readSize << "registers.";
return false; return false;
} }
@ -722,7 +722,7 @@ bool HuaweiFusionSolar::valuesAreVaild(const QVector<quint16> &values, int readS
// 0xFFFF: invalid value of a type other than the floating point type returned by one register // 0xFFFF: invalid value of a type other than the floating point type returned by one register
// 0xFFFFFFFF: invalid value returned by two registers // 0xFFFFFFFF: invalid value returned by two registers
if (values.count() == 2) { if (values.length() == 2) {
bool floatingPointValid = (values != QVector<quint16>() << 0x7fff << 0xffff); bool floatingPointValid = (values != QVector<quint16>() << 0x7fff << 0xffff);
if (!floatingPointValid) if (!floatingPointValid)
qCDebug(dcHuaweiFusionSolar()) << "Invalid values. The received values match the invalid for floating pointer:" << values; qCDebug(dcHuaweiFusionSolar()) << "Invalid values. The received values match the invalid for floating pointer:" << values;
@ -734,7 +734,7 @@ bool HuaweiFusionSolar::valuesAreVaild(const QVector<quint16> &values, int readS
return floatingPointValid && otherTypesValid; return floatingPointValid && otherTypesValid;
} }
if (values.count() == 1) if (values.length() == 1)
return values.at(0) != 0x7fff && values.at(0) != 0xffff; return values.at(0) != 0x7fff && values.at(0) != 0xffff;
return true; return true;

View File

@ -153,14 +153,14 @@ void HuaweiFusionSolarDiscovery::finishDiscovery()
qint64 durationMilliSeconds = QDateTime::currentMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch(); qint64 durationMilliSeconds = QDateTime::currentMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch();
// Fill in finished network device information // Fill in finished network device information
for (int i = 0; i < m_results.count(); i++) for (int i = 0; i < m_results.length(); i++)
m_results[i].networkDeviceInfo = m_networkDeviceInfos.get(m_results.value(i).address); m_results[i].networkDeviceInfo = m_networkDeviceInfos.get(m_results.value(i).address);
// Cleanup any leftovers...we don't care any more // Cleanup any leftovers...we don't care any more
foreach (HuaweiFusionSolar *connection, m_connections) foreach (HuaweiFusionSolar *connection, m_connections)
cleanupConnection(connection); cleanupConnection(connection);
qCInfo(dcHuawei()) << "Discovery: Finished the discovery process. Found" << m_results.count() qCInfo(dcHuawei()) << "Discovery: Finished the discovery process. Found" << m_results.length()
<< "inverters in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz"); << "inverters in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz");
emit discoveryFinished(); emit discoveryFinished();

View File

@ -884,7 +884,7 @@ void IntegrationPluginHuawei::evaluateEnergyProducedValue(Thing *inverterThing,
int historyMaxSize = 3; int historyMaxSize = 3;
int absurdlyHighValueLimit= 25000000; int absurdlyHighValueLimit= 25000000;
int historySize = m_inverterEnergyProducedHistory.value(inverterThing).count(); int historySize = m_inverterEnergyProducedHistory.value(inverterThing).length();
if (historySize > historyMaxSize) { if (historySize > historyMaxSize) {
m_inverterEnergyProducedHistory[inverterThing].removeFirst(); m_inverterEnergyProducedHistory[inverterThing].removeFirst();

View File

@ -51,7 +51,7 @@ void IntegrationPluginIdm::discoverThings(ThingDiscoveryInfo *info)
NetworkDeviceDiscoveryReply *discoveryReply = hardwareManager()->networkDeviceDiscovery()->discover(); NetworkDeviceDiscoveryReply *discoveryReply = hardwareManager()->networkDeviceDiscovery()->discover();
connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, discoveryReply, &NetworkDeviceDiscoveryReply::deleteLater); connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, discoveryReply, &NetworkDeviceDiscoveryReply::deleteLater);
connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [this, discoveryReply, info](){ connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [this, discoveryReply, info](){
qCDebug(dcIdm()) << "Discovery finished. Found" << discoveryReply->networkDeviceInfos().count() << "devices"; qCDebug(dcIdm()) << "Discovery finished. Found" << discoveryReply->networkDeviceInfos().length() << "devices";
foreach (const NetworkDeviceInfo &networkDeviceInfo, discoveryReply->networkDeviceInfos()) { foreach (const NetworkDeviceInfo &networkDeviceInfo, discoveryReply->networkDeviceInfos()) {
qCDebug(dcIdm()) << networkDeviceInfo; qCDebug(dcIdm()) << networkDeviceInfo;
QString title; QString title;

View File

@ -53,7 +53,7 @@ void IntegrationPluginInro::discoverThings(ThingDiscoveryInfo *info)
// Check if we already have set up this device // Check if we already have set up this device
Things existingThings = myThings().filterByParam(pantaboxThingSerialNumberParamTypeId, result.deviceInfo.serialNumber); Things existingThings = myThings().filterByParam(pantaboxThingSerialNumberParamTypeId, result.deviceInfo.serialNumber);
if (existingThings.count() == 1) { if (existingThings.length() == 1) {
qCDebug(dcInro()) << "This PANTABOX already exists in the system:" << result.deviceInfo.serialNumber << result.deviceInfo.ipAddress.toString(); qCDebug(dcInro()) << "This PANTABOX already exists in the system:" << result.deviceInfo.serialNumber << result.deviceInfo.ipAddress.toString();
descriptor.setThingId(existingThings.first()->id()); descriptor.setThingId(existingThings.first()->id());
} }

View File

@ -170,7 +170,7 @@ void PantaboxDiscovery::finishDiscovery()
foreach (Pantabox *connection, m_connections) foreach (Pantabox *connection, m_connections)
cleanupConnection(connection); cleanupConnection(connection);
qCInfo(dcInro()) << "Discovery: Finished the discovery process. Found" << m_results.count() qCInfo(dcInro()) << "Discovery: Finished the discovery process. Found" << m_results.length()
<< "PANTABOXE wallboxes in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz"); << "PANTABOXE wallboxes in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz");
emit discoveryFinished(); emit discoveryFinished();

View File

@ -72,7 +72,7 @@ void IntegrationPluginKostal::discoverThings(ThingDiscoveryInfo *info)
// Note: we introduced the serial number later, if the current thing has no serialnumber, we use the mac // Note: we introduced the serial number later, if the current thing has no serialnumber, we use the mac
Things existingThings = myThings().filterByParam(kostalInverterThingSerialNumberParamTypeId, result.serialNumber); Things existingThings = myThings().filterByParam(kostalInverterThingSerialNumberParamTypeId, result.serialNumber);
if (existingThings.count() == 1) { if (existingThings.length() == 1) {
qCDebug(dcKostal()) << "This Kostal inverter with this serial number already exists in the system:" << result.networkDeviceInfo; qCDebug(dcKostal()) << "This Kostal inverter with this serial number already exists in the system:" << result.networkDeviceInfo;
descriptor.setThingId(existingThings.first()->id()); descriptor.setThingId(existingThings.first()->id());
} }
@ -422,7 +422,7 @@ void IntegrationPluginKostal::setupKostalConnection(ThingSetupInfo *info)
// Update the battery if available // Update the battery if available
Things batteryThings = myThings().filterByParentId(thing->id()).filterByThingClassId(kostalBatteryThingClassId); Things batteryThings = myThings().filterByParentId(thing->id()).filterByThingClassId(kostalBatteryThingClassId);
if (batteryThings.count() == 1) { if (batteryThings.length() == 1) {
Thing *batteryThing = batteryThings.first(); Thing *batteryThing = batteryThings.first();
batteryThing->setStateValue(kostalBatteryVoltageStateTypeId, kostalConnection->batteryVoltage()); batteryThing->setStateValue(kostalBatteryVoltageStateTypeId, kostalConnection->batteryVoltage());
@ -446,7 +446,7 @@ void IntegrationPluginKostal::setupKostalConnection(ThingSetupInfo *info)
// Update the meter if available // Update the meter if available
Things meterThings = myThings().filterByParentId(thing->id()).filterByThingClassId(kostalMeterThingClassId); Things meterThings = myThings().filterByParentId(thing->id()).filterByThingClassId(kostalMeterThingClassId);
if (meterThings.count() == 1) { if (meterThings.length() == 1) {
Thing *meterThing = meterThings.first(); Thing *meterThing = meterThings.first();
// Current // Current

View File

@ -52,7 +52,7 @@ void KostalDiscovery::startDiscovery()
// Check what might be left on finished // Check what might be left on finished
connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, discoveryReply, &NetworkDeviceDiscoveryReply::deleteLater); connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, discoveryReply, &NetworkDeviceDiscoveryReply::deleteLater);
connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [=](){ connect(discoveryReply, &NetworkDeviceDiscoveryReply::finished, this, [=](){
qCDebug(dcKostal()) << "Discovery: Network discovery finished. Found" << discoveryReply->networkDeviceInfos().count() << "network devices"; qCDebug(dcKostal()) << "Discovery: Network discovery finished. Found" << discoveryReply->networkDeviceInfos().length() << "network devices";
m_networkDeviceInfos = discoveryReply->networkDeviceInfos(); m_networkDeviceInfos = discoveryReply->networkDeviceInfos();
// Give the last connections added right before the network discovery finished a chance to check the device... // Give the last connections added right before the network discovery finished a chance to check the device...
@ -152,14 +152,14 @@ void KostalDiscovery::finishDiscovery()
qint64 durationMilliSeconds = QDateTime::currentMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch(); qint64 durationMilliSeconds = QDateTime::currentMSecsSinceEpoch() - m_startDateTime.toMSecsSinceEpoch();
// Fill in all network device infos we have // Fill in all network device infos we have
for (int i = 0; i < m_discoveryResults.count(); i++) for (int i = 0; i < m_discoveryResults.length(); i++)
m_discoveryResults[i].networkDeviceInfo = m_networkDeviceInfos.get(m_discoveryResults.at(i).address); m_discoveryResults[i].networkDeviceInfo = m_networkDeviceInfos.get(m_discoveryResults.at(i).address);
// Cleanup any leftovers...we don't care any more // Cleanup any leftovers...we don't care any more
foreach (KostalModbusTcpConnection *connection, m_connections) foreach (KostalModbusTcpConnection *connection, m_connections)
cleanupConnection(connection); cleanupConnection(connection);
qCInfo(dcKostal()) << "Discovery: Finished the discovery process. Found" << m_discoveryResults.count() qCInfo(dcKostal()) << "Discovery: Finished the discovery process. Found" << m_discoveryResults.length()
<< "Kostal Inverters in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz"); << "Kostal Inverters in" << QTime::fromMSecsSinceStartOfDay(durationMilliSeconds).toString("mm:ss.zzz");
emit discoveryFinished(); emit discoveryFinished();
} }

View File

@ -1,8 +1,21 @@
QMAKE_CXXFLAGS += -Werror -std=c++11 -z defs
QMAKE_LFLAGS += -std=c++11 -z defs
QT += network serialbus QT += network serialbus
greaterThan(QT_MAJOR_VERSION, 5) {
message("Building using Qt6 support")
CONFIG *= c++17
QMAKE_LFLAGS *= -std=c++17
QMAKE_CXXFLAGS *= -std=c++17
} else {
message("Building using Qt5 support")
CONFIG *= c++11
QMAKE_LFLAGS *= -std=c++11
QMAKE_CXXFLAGS *= -std=c++11
DEFINES += QT_DISABLE_DEPRECATED_UP_TO=0x050F00
}
QMAKE_CXXFLAGS += -Werror -z defs
QMAKE_LFLAGS += -z defs
CONFIG += link_pkgconfig CONFIG += link_pkgconfig
PKGCONFIG += nymea PKGCONFIG += nymea

View File

@ -54,3 +54,15 @@ for(MODBUS_CONNECTION, MODBUS_CONNECTIONS_INCLUDES) {
INCLUDEPATH += $${OUT_PWD}/autogenerated INCLUDEPATH += $${OUT_PWD}/autogenerated
} }
greaterThan(QT_MAJOR_VERSION, 5) {
message("Building using Qt6 support")
CONFIG *= c++17
QMAKE_LFLAGS *= -std=c++17
QMAKE_CXXFLAGS *= -std=c++17
} else {
message("Building using Qt5 support")
CONFIG *= c++11
QMAKE_LFLAGS *= -std=c++11
QMAKE_CXXFLAGS *= -std=c++11
DEFINES += QT_DISABLE_DEPRECATED_UP_TO=0x050F00
}

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright 2013 - 2021, nymea GmbH * Copyright 2013 - 2025, nymea GmbH
* Contact: contact@nymea.io * Contact: contact@nymea.io
* *
* This file is part of nymea. * This file is part of nymea.
@ -39,21 +39,25 @@ ModbusDataUtils::ModbusDataUtils()
quint16 ModbusDataUtils::convertToUInt16(const QVector<quint16> &registers) quint16 ModbusDataUtils::convertToUInt16(const QVector<quint16> &registers)
{ {
Q_ASSERT_X(registers.count() == 1, "ModbusDataUtils", "invalid raw data size for converting value to quint16"); Q_ASSERT_X(registers.length() == 1, "ModbusDataUtils", "invalid raw data size for converting value to quint16");
return registers.at(0); return registers.at(0);
} }
qint16 ModbusDataUtils::convertToInt16(const QVector<quint16> &registers) qint16 ModbusDataUtils::convertToInt16(const QVector<quint16> &registers)
{ {
Q_ASSERT_X(registers.count() == 1, "ModbusDataUtils", "invalid raw data size for converting value to qint16"); Q_ASSERT_X(registers.length() == 1, "ModbusDataUtils", "invalid raw data size for converting value to qint16");
return static_cast<qint16>(registers.at(0)); return static_cast<qint16>(registers.at(0));
} }
quint32 ModbusDataUtils::convertToUInt32(const QVector<quint16> &registers, ByteOrder byteOrder) quint32 ModbusDataUtils::convertToUInt32(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 2, "ModbusDataUtils", "invalid raw data size for converting value to quint32"); Q_ASSERT_X(registers.length() == 2, "ModbusDataUtils", "invalid raw data size for converting value to quint32");
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
if (byteOrder == ByteOrderBigEndian) { if (byteOrder == ByteOrderBigEndian) {
inputStream << registers.at(0); inputStream << registers.at(0);
inputStream << registers.at(1); inputStream << registers.at(1);
@ -62,7 +66,11 @@ quint32 ModbusDataUtils::convertToUInt32(const QVector<quint16> &registers, Byte
inputStream << registers.at(0); inputStream << registers.at(0);
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
quint32 result = 0; quint32 result = 0;
outputStream >> result; outputStream >> result;
return result; return result;
@ -70,9 +78,13 @@ quint32 ModbusDataUtils::convertToUInt32(const QVector<quint16> &registers, Byte
qint32 ModbusDataUtils::convertToInt32(const QVector<quint16> &registers, ByteOrder byteOrder) qint32 ModbusDataUtils::convertToInt32(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 2, "ModbusDataUtils", "invalid raw data size for converting value to quint32"); Q_ASSERT_X(registers.length() == 2, "ModbusDataUtils", "invalid raw data size for converting value to quint32");
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
if (byteOrder == ByteOrderBigEndian) { if (byteOrder == ByteOrderBigEndian) {
inputStream << registers.at(0); inputStream << registers.at(0);
inputStream << registers.at(1); inputStream << registers.at(1);
@ -81,7 +93,11 @@ qint32 ModbusDataUtils::convertToInt32(const QVector<quint16> &registers, ByteOr
inputStream << registers.at(0); inputStream << registers.at(0);
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
qint32 result = 0; qint32 result = 0;
outputStream >> result; outputStream >> result;
return result; return result;
@ -89,9 +105,13 @@ qint32 ModbusDataUtils::convertToInt32(const QVector<quint16> &registers, ByteOr
quint64 ModbusDataUtils::convertToUInt64(const QVector<quint16> &registers, ByteOrder byteOrder) quint64 ModbusDataUtils::convertToUInt64(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 4, "ModbusDataUtils", "invalid raw data size for converting value to quint64"); Q_ASSERT_X(registers.length() == 4, "ModbusDataUtils", "invalid raw data size for converting value to quint64");
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
if (byteOrder == ByteOrderBigEndian) { if (byteOrder == ByteOrderBigEndian) {
inputStream << registers.at(0); inputStream << registers.at(0);
inputStream << registers.at(1); inputStream << registers.at(1);
@ -104,7 +124,11 @@ quint64 ModbusDataUtils::convertToUInt64(const QVector<quint16> &registers, Byte
inputStream << registers.at(0); inputStream << registers.at(0);
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
quint64 result = 0; quint64 result = 0;
outputStream >> result; outputStream >> result;
return result; return result;
@ -112,9 +136,13 @@ quint64 ModbusDataUtils::convertToUInt64(const QVector<quint16> &registers, Byte
qint64 ModbusDataUtils::convertToInt64(const QVector<quint16> &registers, ByteOrder byteOrder) qint64 ModbusDataUtils::convertToInt64(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 4, "ModbusDataUtils", "invalid raw data size for converting value to qint64"); Q_ASSERT_X(registers.length() == 4, "ModbusDataUtils", "invalid raw data size for converting value to qint64");
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
if (byteOrder == ByteOrderBigEndian) { if (byteOrder == ByteOrderBigEndian) {
inputStream << registers.at(0); inputStream << registers.at(0);
inputStream << registers.at(1); inputStream << registers.at(1);
@ -127,7 +155,12 @@ qint64 ModbusDataUtils::convertToInt64(const QVector<quint16> &registers, ByteOr
inputStream << registers.at(0); inputStream << registers.at(0);
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
qint64 result = 0; qint64 result = 0;
outputStream >> result; outputStream >> result;
return result; return result;
@ -136,10 +169,14 @@ qint64 ModbusDataUtils::convertToInt64(const QVector<quint16> &registers, ByteOr
QString ModbusDataUtils::convertToString(const QVector<quint16> &registers, ByteOrder characterByteOrder) QString ModbusDataUtils::convertToString(const QVector<quint16> &registers, ByteOrder characterByteOrder)
{ {
QByteArray bytes; QByteArray bytes;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream stream(&bytes, QDataStream::WriteOnly);
#else
QDataStream stream(&bytes, QIODevice::WriteOnly); QDataStream stream(&bytes, QIODevice::WriteOnly);
#endif
// Note: some devices use little endian within the register uint16 representation of the 2 characters. // Note: some devices use little endian within the register uint16 representation of the 2 characters.
stream.setByteOrder(characterByteOrder == ByteOrderBigEndian ? QDataStream::BigEndian : QDataStream::LittleEndian); stream.setByteOrder(characterByteOrder == ByteOrderBigEndian ? QDataStream::BigEndian : QDataStream::LittleEndian);
for (int i = 0; i < registers.count(); i++) { for (int i = 0; i < registers.length(); i++) {
stream << registers.at(i); stream << registers.at(i);
} }
@ -149,8 +186,12 @@ QString ModbusDataUtils::convertToString(const QVector<quint16> &registers, Byte
QByteArray ModbusDataUtils::convertToByteArray(const QVector<quint16> &registers) QByteArray ModbusDataUtils::convertToByteArray(const QVector<quint16> &registers)
{ {
QByteArray bytes; QByteArray bytes;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream stream(&bytes, QDataStream::WriteOnly);
#else
QDataStream stream(&bytes, QIODevice::WriteOnly); QDataStream stream(&bytes, QIODevice::WriteOnly);
for (int i = 0; i < registers.count(); i++) { #endif
for (int i = 0; i < registers.length(); i++) {
stream << registers.at(i); stream << registers.at(i);
} }
return bytes; return bytes;
@ -158,7 +199,7 @@ QByteArray ModbusDataUtils::convertToByteArray(const QVector<quint16> &registers
float ModbusDataUtils::convertToFloat32(const QVector<quint16> &registers, ByteOrder byteOrder) float ModbusDataUtils::convertToFloat32(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 2, "ModbusDataUtils", "invalid raw data size for converting value to float32"); Q_ASSERT_X(registers.length() == 2, "ModbusDataUtils", "invalid raw data size for converting value to float32");
quint32 rawValue = ModbusDataUtils::convertToUInt32(registers, byteOrder); quint32 rawValue = ModbusDataUtils::convertToUInt32(registers, byteOrder);
float value = 0; float value = 0;
memcpy(&value, &rawValue, sizeof(quint32)); memcpy(&value, &rawValue, sizeof(quint32));
@ -168,7 +209,7 @@ float ModbusDataUtils::convertToFloat32(const QVector<quint16> &registers, ByteO
double ModbusDataUtils::convertToFloat64(const QVector<quint16> &registers, ByteOrder byteOrder) double ModbusDataUtils::convertToFloat64(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 4, "ModbusDataUtils", "invalid raw data size for converting value to float64"); Q_ASSERT_X(registers.length() == 4, "ModbusDataUtils", "invalid raw data size for converting value to float64");
quint64 rawValue = ModbusDataUtils::convertToUInt64(registers, byteOrder); quint64 rawValue = ModbusDataUtils::convertToUInt64(registers, byteOrder);
double value = 0; double value = 0;
memcpy(&value, &rawValue, sizeof(quint64)); memcpy(&value, &rawValue, sizeof(quint64));
@ -188,10 +229,18 @@ QVector<quint16> ModbusDataUtils::convertFromInt16(qint16 value)
QVector<quint16> ModbusDataUtils::convertFromUInt32(quint32 value, ByteOrder byteOrder) QVector<quint16> ModbusDataUtils::convertFromUInt32(quint32 value, ByteOrder byteOrder)
{ {
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
inputStream << value; inputStream << value;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
QVector<quint16> values; QVector<quint16> values;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
quint16 registerValue = 0; quint16 registerValue = 0;
@ -214,10 +263,18 @@ QVector<quint16> ModbusDataUtils::convertFromInt32(qint32 value, ByteOrder byteO
QVector<quint16> ModbusDataUtils::convertFromUInt64(quint64 value, ByteOrder byteOrder) QVector<quint16> ModbusDataUtils::convertFromUInt64(quint64 value, ByteOrder byteOrder)
{ {
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
inputStream << value; inputStream << value;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
QVector<quint16> values; QVector<quint16> values;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
quint16 registerValue = 0; quint16 registerValue = 0;
@ -234,10 +291,18 @@ QVector<quint16> ModbusDataUtils::convertFromUInt64(quint64 value, ByteOrder byt
QVector<quint16> ModbusDataUtils::convertFromInt64(qint64 value, ByteOrder byteOrder) QVector<quint16> ModbusDataUtils::convertFromInt64(qint64 value, ByteOrder byteOrder)
{ {
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
inputStream << value; inputStream << value;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
QVector<quint16> values; QVector<quint16> values;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
quint16 registerValue = 0; quint16 registerValue = 0;
@ -254,8 +319,12 @@ QVector<quint16> ModbusDataUtils::convertFromInt64(qint64 value, ByteOrder byteO
QVector<quint16> ModbusDataUtils::convertFromString(const QString &value, quint16 stringLength, ByteOrder characterByteOrder) QVector<quint16> ModbusDataUtils::convertFromString(const QString &value, quint16 stringLength, ByteOrder characterByteOrder)
{ {
Q_ASSERT_X(value.length() <= stringLength, "ModbusDataUtils", "cannot convert a string which is bigger than the desired register vector."); Q_ASSERT_X(value.length() <= stringLength, "ModbusDataUtils", "cannot convert a string which is bigger than the desired register vector.");
QByteArray data = value.toLatin1() + QByteArray('\0', stringLength - value.count()); QByteArray data = value.toLatin1() + QByteArray('\0', stringLength - value.length());
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream stream(&data, QDataStream::ReadOnly);
#else
QDataStream stream(&data, QIODevice::ReadOnly); QDataStream stream(&data, QIODevice::ReadOnly);
#endif
// Note: some devices use little endian within the register uint16 representation of the 2 characters. // Note: some devices use little endian within the register uint16 representation of the 2 characters.
stream.setByteOrder(characterByteOrder == ByteOrderBigEndian ? QDataStream::BigEndian : QDataStream::LittleEndian); stream.setByteOrder(characterByteOrder == ByteOrderBigEndian ? QDataStream::BigEndian : QDataStream::LittleEndian);
QVector<quint16> values; QVector<quint16> values;

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright 2013 - 2021, nymea GmbH * Copyright 2013 - 2025, nymea GmbH
* Contact: contact@nymea.io * Contact: contact@nymea.io
* *
* This file is part of nymea. * This file is part of nymea.
@ -34,6 +34,7 @@
#include <QVector> #include <QVector>
#include <QObject> #include <QObject>
#include <QModbusPdu> #include <QModbusPdu>
#include <QMetaObject>
#include <QModbusDataUnit> #include <QModbusDataUnit>
class ModbusDataUtils class ModbusDataUtils

View File

@ -44,7 +44,7 @@ ModbusTcpMaster::ModbusTcpMaster(const QHostAddress &hostAddress, uint port, QOb
m_modbusTcpClient->setNumberOfRetries(m_numberOfRetries); m_modbusTcpClient->setNumberOfRetries(m_numberOfRetries);
connect(m_modbusTcpClient, &QModbusTcpClient::stateChanged, this, &ModbusTcpMaster::onModbusStateChanged); connect(m_modbusTcpClient, &QModbusTcpClient::stateChanged, this, &ModbusTcpMaster::onModbusStateChanged);
connect(m_modbusTcpClient, &QModbusRtuSerialMaster::errorOccurred, this, &ModbusTcpMaster::onModbusErrorOccurred); connect(m_modbusTcpClient, &QModbusTcpClient::errorOccurred, this, &ModbusTcpMaster::onModbusErrorOccurred);
m_reconnectTimer = new QTimer(this); m_reconnectTimer = new QTimer(this);
m_reconnectTimer->setSingleShot(true); m_reconnectTimer->setSingleShot(true);

View File

@ -80,9 +80,9 @@ def writePropertyGetSetDataUnitImplementationsTcp(fileDescriptor, className, reg
writeLine(fileDescriptor, ' QVector<quint16> values = %s;' % getConversionToValueMethod(registerDefinition)) writeLine(fileDescriptor, ' QVector<quint16> values = %s;' % getConversionToValueMethod(registerDefinition))
if registerDefinition['registerType'] == 'holdingRegister': if registerDefinition['registerType'] == 'holdingRegister':
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, %s, values.count());' % (registerDefinition['address'])) writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::HoldingRegisters, %s, values.length());' % (registerDefinition['address']))
elif registerDefinition['registerType'] == 'coils': elif registerDefinition['registerType'] == 'coils':
writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, %s, values.count());' % (registerDefinition['address'])) writeLine(fileDescriptor, ' QModbusDataUnit request = QModbusDataUnit(QModbusDataUnit::RegisterType::Coils, %s, values.length());' % (registerDefinition['address']))
else: else:
logger.warning('Error: invalid register type for writing.') logger.warning('Error: invalid register type for writing.')
exit(1) exit(1)
@ -831,7 +831,7 @@ def writeUpdateMethodTcp(fileDescriptor, className, registerDefinitions, blockDe
writeLine(fileDescriptor) writeLine(fileDescriptor)
writeLine(fileDescriptor, ' if (!m_updateRequestQueue.isEmpty()) {') writeLine(fileDescriptor, ' if (!m_updateRequestQueue.isEmpty()) {')
writeLine(fileDescriptor, ' qCDebug(dc%s()) << "Tried to update but there are still some update requests pending. Waiting for them to be finished..." << m_updateRequestQueue.count();' % className) writeLine(fileDescriptor, ' qCDebug(dc%s()) << "Tried to update but there are still some update requests pending. Waiting for them to be finished..." << m_updateRequestQueue.length();' % className)
writeLine(fileDescriptor, ' sendNextQueuedRequest();') writeLine(fileDescriptor, ' sendNextQueuedRequest();')
writeLine(fileDescriptor, ' return true;') writeLine(fileDescriptor, ' return true;')
writeLine(fileDescriptor, ' }') writeLine(fileDescriptor, ' }')

View File

@ -1,8 +1,20 @@
QMAKE_CXXFLAGS += -Werror -std=c++11 -z defs
QMAKE_LFLAGS += -std=c++11
QT += network serialbus QT += network serialbus
greaterThan(QT_MAJOR_VERSION, 5) {
message("Building using Qt6 support")
CONFIG *= c++17
QMAKE_LFLAGS *= -std=c++17
QMAKE_CXXFLAGS *= -std=c++17
} else {
message("Building using Qt5 support")
CONFIG *= c++11
QMAKE_LFLAGS *= -std=c++11
QMAKE_CXXFLAGS *= -std=c++11
DEFINES += QT_DISABLE_DEPRECATED_UP_TO=0x050F00
}
QMAKE_CXXFLAGS += -Werror -z defs
TARGET = nymea-sunspec1 TARGET = nymea-sunspec1
TEMPLATE = lib TEMPLATE = lib

View File

@ -313,7 +313,7 @@ void SunSpecConnection::processDiscoveryResult()
qCDebug(dcSunSpec()) << "Sorted model list:"; qCDebug(dcSunSpec()) << "Sorted model list:";
SunSpecCommonModel *currentCommonModel = nullptr; SunSpecCommonModel *currentCommonModel = nullptr;
SunSpecModel::CommonModelInfo commonModelInfo; SunSpecModel::CommonModelInfo commonModelInfo;
for (int i = 0; i < m_models.count(); i++) { for (int i = 0; i < m_models.length(); i++) {
SunSpecModel *model = m_models.at(i); SunSpecModel *model = m_models.at(i);
qCDebug(dcSunSpec()) << "-->" << model; qCDebug(dcSunSpec()) << "-->" << model;
if (model->modelId() == SunSpecModelFactory::ModelIdCommon) { if (model->modelId() == SunSpecModelFactory::ModelIdCommon) {
@ -467,7 +467,7 @@ void SunSpecConnection::scanModelsOnBaseRegister(quint16 offset)
} else { } else {
qCWarning(dcSunSpec()) << "Error occurred while reading model header from" << this << "using offset" << offset << m_modbusTcpClient->errorString(); qCWarning(dcSunSpec()) << "Error occurred while reading model header from" << this << "using offset" << offset << m_modbusTcpClient->errorString();
if (!m_modelDiscoveryResult.isEmpty()) { if (!m_modelDiscoveryResult.isEmpty()) {
qCWarning(dcSunSpec()) << "Error occurred but already discovered" << m_modelDiscoveryResult.count() << "models. Continue with the discovered models, but the discovery may be incomplete due to header reading errors."; qCWarning(dcSunSpec()) << "Error occurred but already discovered" << m_modelDiscoveryResult.length() << "models. Continue with the discovered models, but the discovery may be incomplete due to header reading errors.";
qCDebug(dcSunSpec()) << "Scan for SunSpec models on" << this << m_baseRegister << "finished successfully"; qCDebug(dcSunSpec()) << "Scan for SunSpec models on" << this << m_baseRegister << "finished successfully";
processDiscoveryResult(); processDiscoveryResult();
} else { } else {

View File

@ -261,7 +261,7 @@ bool SunSpecDataPoint::isValid() const
break; break;
case DataType::String: { case DataType::String: {
bool isNull = true; bool isNull = true;
for (int i = 0; i < m_rawData.count(); i++) { for (int i = 0; i < m_rawData.length(); i++) {
if (m_rawData.at(i) != 0x0000) { if (m_rawData.at(i) != 0x0000) {
isNull = false; isNull = false;
valid = true; valid = true;
@ -416,7 +416,7 @@ double SunSpecDataPoint::toDouble() const
QString SunSpecDataPoint::registersToString(const QVector<quint16> &registers) QString SunSpecDataPoint::registersToString(const QVector<quint16> &registers)
{ {
QStringList valueStrings; QStringList valueStrings;
for (int i = 0; i < registers.count(); i++) { for (int i = 0; i < registers.length(); i++) {
QString hexString(QStringLiteral("0x%1")); QString hexString(QStringLiteral("0x%1"));
valueStrings.append(hexString.arg(registers.at(i), 4, 16, QLatin1Char('0'))); valueStrings.append(hexString.arg(registers.at(i), 4, 16, QLatin1Char('0')));
} }
@ -427,21 +427,25 @@ QString SunSpecDataPoint::registersToString(const QVector<quint16> &registers)
quint16 SunSpecDataPoint::convertToUInt16(const QVector<quint16> &registers) quint16 SunSpecDataPoint::convertToUInt16(const QVector<quint16> &registers)
{ {
Q_ASSERT_X(registers.count() == 1, "SunSpecDataPoint", "invalid raw data size for converting value to quint16"); Q_ASSERT_X(registers.length() == 1, "SunSpecDataPoint", "invalid raw data size for converting value to quint16");
return registers.at(0); return registers.at(0);
} }
qint16 SunSpecDataPoint::convertToInt16(const QVector<quint16> &registers) qint16 SunSpecDataPoint::convertToInt16(const QVector<quint16> &registers)
{ {
Q_ASSERT_X(registers.count() == 1, "SunSpecDataPoint", "invalid raw data size for converting value to qint16"); Q_ASSERT_X(registers.length() == 1, "SunSpecDataPoint", "invalid raw data size for converting value to qint16");
return static_cast<qint16>(registers.at(0)); return static_cast<qint16>(registers.at(0));
} }
quint32 SunSpecDataPoint::convertToUInt32(const QVector<quint16> &registers, ByteOrder byteOrder) quint32 SunSpecDataPoint::convertToUInt32(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 2, "SunSpecDataPoint", "invalid raw data size for converting value to quint32"); Q_ASSERT_X(registers.length() == 2, "SunSpecDataPoint", "invalid raw data size for converting value to quint32");
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
if (byteOrder == ByteOrderBigEndian) { if (byteOrder == ByteOrderBigEndian) {
inputStream << registers.at(0); inputStream << registers.at(0);
inputStream << registers.at(1); inputStream << registers.at(1);
@ -450,7 +454,11 @@ quint32 SunSpecDataPoint::convertToUInt32(const QVector<quint16> &registers, Byt
inputStream << registers.at(0); inputStream << registers.at(0);
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
quint32 result = 0; quint32 result = 0;
outputStream >> result; outputStream >> result;
return result; return result;
@ -458,9 +466,13 @@ quint32 SunSpecDataPoint::convertToUInt32(const QVector<quint16> &registers, Byt
qint32 SunSpecDataPoint::convertToInt32(const QVector<quint16> &registers, ByteOrder byteOrder) qint32 SunSpecDataPoint::convertToInt32(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 2, "SunSpecDataPoint", "invalid raw data size for converting value to quint32"); Q_ASSERT_X(registers.length() == 2, "SunSpecDataPoint", "invalid raw data size for converting value to quint32");
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
if (byteOrder == ByteOrderBigEndian) { if (byteOrder == ByteOrderBigEndian) {
inputStream << registers.at(0); inputStream << registers.at(0);
inputStream << registers.at(1); inputStream << registers.at(1);
@ -469,7 +481,11 @@ qint32 SunSpecDataPoint::convertToInt32(const QVector<quint16> &registers, ByteO
inputStream << registers.at(0); inputStream << registers.at(0);
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
qint32 result = 0; qint32 result = 0;
outputStream >> result; outputStream >> result;
return result; return result;
@ -477,9 +493,13 @@ qint32 SunSpecDataPoint::convertToInt32(const QVector<quint16> &registers, ByteO
quint64 SunSpecDataPoint::convertToUInt64(const QVector<quint16> &registers, ByteOrder byteOrder) quint64 SunSpecDataPoint::convertToUInt64(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 4, "SunSpecDataPoint", "invalid raw data size for converting value to quint64"); Q_ASSERT_X(registers.length() == 4, "SunSpecDataPoint", "invalid raw data size for converting value to quint64");
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
if (byteOrder == ByteOrderBigEndian) { if (byteOrder == ByteOrderBigEndian) {
inputStream << registers.at(0); inputStream << registers.at(0);
inputStream << registers.at(1); inputStream << registers.at(1);
@ -492,7 +512,11 @@ quint64 SunSpecDataPoint::convertToUInt64(const QVector<quint16> &registers, Byt
inputStream << registers.at(0); inputStream << registers.at(0);
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
quint64 result = 0; quint64 result = 0;
outputStream >> result; outputStream >> result;
return result; return result;
@ -500,9 +524,13 @@ quint64 SunSpecDataPoint::convertToUInt64(const QVector<quint16> &registers, Byt
qint64 SunSpecDataPoint::convertToInt64(const QVector<quint16> &registers, ByteOrder byteOrder) qint64 SunSpecDataPoint::convertToInt64(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 4, "SunSpecDataPoint", "invalid raw data size for converting value to qint64"); Q_ASSERT_X(registers.length() == 4, "SunSpecDataPoint", "invalid raw data size for converting value to qint64");
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
if (byteOrder == ByteOrderBigEndian) { if (byteOrder == ByteOrderBigEndian) {
inputStream << registers.at(0); inputStream << registers.at(0);
inputStream << registers.at(1); inputStream << registers.at(1);
@ -515,7 +543,11 @@ qint64 SunSpecDataPoint::convertToInt64(const QVector<quint16> &registers, ByteO
inputStream << registers.at(0); inputStream << registers.at(0);
} }
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
qint64 result = 0; qint64 result = 0;
outputStream >> result; outputStream >> result;
return result; return result;
@ -524,8 +556,12 @@ qint64 SunSpecDataPoint::convertToInt64(const QVector<quint16> &registers, ByteO
QString SunSpecDataPoint::convertToString(const QVector<quint16> &registers) QString SunSpecDataPoint::convertToString(const QVector<quint16> &registers)
{ {
QByteArray bytes; QByteArray bytes;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream stream(&bytes, QDataStream::WriteOnly);
#else
QDataStream stream(&bytes, QIODevice::WriteOnly); QDataStream stream(&bytes, QIODevice::WriteOnly);
for (int i = 0; i < registers.count(); i++) { #endif
for (int i = 0; i < registers.length(); i++) {
stream << registers.at(i); stream << registers.at(i);
} }
@ -534,7 +570,7 @@ QString SunSpecDataPoint::convertToString(const QVector<quint16> &registers)
float SunSpecDataPoint::convertToFloat32(const QVector<quint16> &registers, ByteOrder byteOrder) float SunSpecDataPoint::convertToFloat32(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 2, "SunSpecDataPoint", "invalid raw data size for converting value to float32"); Q_ASSERT_X(registers.length() == 2, "SunSpecDataPoint", "invalid raw data size for converting value to float32");
quint32 rawValue = SunSpecDataPoint::convertToUInt32(registers, byteOrder); quint32 rawValue = SunSpecDataPoint::convertToUInt32(registers, byteOrder);
float value = 0; float value = 0;
memcpy(&value, &rawValue, sizeof(quint32)); memcpy(&value, &rawValue, sizeof(quint32));
@ -543,7 +579,7 @@ float SunSpecDataPoint::convertToFloat32(const QVector<quint16> &registers, Byte
double SunSpecDataPoint::convertToFloat64(const QVector<quint16> &registers, ByteOrder byteOrder) double SunSpecDataPoint::convertToFloat64(const QVector<quint16> &registers, ByteOrder byteOrder)
{ {
Q_ASSERT_X(registers.count() == 4, "SunSpecDataPoint", "invalid raw data size for converting value to float64"); Q_ASSERT_X(registers.length() == 4, "SunSpecDataPoint", "invalid raw data size for converting value to float64");
quint64 rawValue = SunSpecDataPoint::convertToUInt64(registers, byteOrder); quint64 rawValue = SunSpecDataPoint::convertToUInt64(registers, byteOrder);
double value = 0; double value = 0;
memcpy(&value, &rawValue, sizeof(quint64)); memcpy(&value, &rawValue, sizeof(quint64));
@ -563,10 +599,18 @@ QVector<quint16> SunSpecDataPoint::convertFromInt16(qint16 value)
QVector<quint16> SunSpecDataPoint::convertFromUInt32(quint32 value, ByteOrder byteOrder) QVector<quint16> SunSpecDataPoint::convertFromUInt32(quint32 value, ByteOrder byteOrder)
{ {
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
inputStream << value; inputStream << value;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
QVector<quint16> values; QVector<quint16> values;
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
quint16 registerValue = 0; quint16 registerValue = 0;
@ -588,10 +632,18 @@ QVector<quint16> SunSpecDataPoint::convertFromInt32(qint32 value, ByteOrder byte
QVector<quint16> SunSpecDataPoint::convertFromUInt64(quint64 value, ByteOrder byteOrder) QVector<quint16> SunSpecDataPoint::convertFromUInt64(quint64 value, ByteOrder byteOrder)
{ {
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
inputStream << value; inputStream << value;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
QVector<quint16> values; QVector<quint16> values;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
quint16 registerValue = 0; quint16 registerValue = 0;
@ -608,10 +660,18 @@ QVector<quint16> SunSpecDataPoint::convertFromUInt64(quint64 value, ByteOrder by
QVector<quint16> SunSpecDataPoint::convertFromInt64(qint64 value, ByteOrder byteOrder) QVector<quint16> SunSpecDataPoint::convertFromInt64(qint64 value, ByteOrder byteOrder)
{ {
QByteArray data; QByteArray data;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream inputStream(&data, QDataStream::WriteOnly);
#else
QDataStream inputStream(&data, QIODevice::WriteOnly); QDataStream inputStream(&data, QIODevice::WriteOnly);
#endif
inputStream << value; inputStream << value;
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream outputStream(&data, QDataStream::ReadOnly);
#else
QDataStream outputStream(&data, QIODevice::ReadOnly); QDataStream outputStream(&data, QIODevice::ReadOnly);
#endif
QVector<quint16> values; QVector<quint16> values;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
quint16 registerValue = 0; quint16 registerValue = 0;
@ -628,8 +688,12 @@ QVector<quint16> SunSpecDataPoint::convertFromInt64(qint64 value, ByteOrder byte
QVector<quint16> SunSpecDataPoint::convertFromString(const QString &value, quint16 stringLength) QVector<quint16> SunSpecDataPoint::convertFromString(const QString &value, quint16 stringLength)
{ {
Q_ASSERT_X(value.length() <= stringLength, "SunSpecDataPoint", "cannot convert a string which is bigger than the desired register vector."); Q_ASSERT_X(value.length() <= stringLength, "SunSpecDataPoint", "cannot convert a string which is bigger than the desired register vector.");
QByteArray data = value.toLatin1() + QByteArray('\0', stringLength - value.count()); QByteArray data = value.toLatin1() + QByteArray('\0', stringLength - value.length());
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
QDataStream stream(&data, QDataStream::ReadOnly);
#else
QDataStream stream(&data, QIODevice::ReadOnly); QDataStream stream(&data, QIODevice::ReadOnly);
#endif
QVector<quint16> values; QVector<quint16> values;
for (int i = 0; i < stringLength; i++) { for (int i = 0; i < stringLength; i++) {
quint16 registerValue = 0; quint16 registerValue = 0;

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright 2013 - 2020, nymea GmbH * Copyright 2013 - 2025, nymea GmbH
* Contact: contact@nymea.io * Contact: contact@nymea.io
* *
* This file is part of nymea. * This file is part of nymea.
@ -31,9 +31,10 @@
#ifndef SUNSPECDATAPOINT_H #ifndef SUNSPECDATAPOINT_H
#define SUNSPECDATAPOINT_H #define SUNSPECDATAPOINT_H
#include <QObject>
#include <QVector> #include <QVector>
#include <QDebug> #include <QDebug>
#include <QString>
#include <QMetaObject>
class SunSpecDataPoint class SunSpecDataPoint
{ {

View File

@ -126,12 +126,12 @@ void SunSpecModel::readBlockData()
} }
const QModbusDataUnit unit = reply->result(); const QModbusDataUnit unit = reply->result();
qCDebug(dcSunSpecModelData()) << "-->" << "Received block data" << this << unit.values().count() << SunSpecDataPoint::registersToString(unit.values()); qCDebug(dcSunSpecModelData()) << "-->" << "Received block data" << this << unit.values().length() << SunSpecDataPoint::registersToString(unit.values());
m_blockData = unit.values(); m_blockData = unit.values();
emit blockDataChanged(m_blockData); emit blockDataChanged(m_blockData);
if (m_blockData.count() != m_modelLength + 2) { if (m_blockData.length() != m_modelLength + 2) {
qCWarning(dcSunSpecModelData()) << "Received invalid block data count from read block data request. Model lenght:" << m_modelLength << "Response block count:" << m_blockData.count(); qCWarning(dcSunSpecModelData()) << "Received invalid block data count from read block data request. Model lenght:" << m_modelLength << "Response block count:" << m_blockData.length();
return; return;
} }

View File

@ -1,6 +1,6 @@
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Copyright 2013 - 2023, nymea GmbH * Copyright 2013 - 2025, nymea GmbH
* Contact: contact@nymea.io * Contact: contact@nymea.io
* *
* This file is part of nymea. * This file is part of nymea.
@ -33,6 +33,8 @@
#include <modbusdatautils.h> #include <modbusdatautils.h>
#include <QRegularExpression>
QList<int> slaveIdCandidates = {50, 11, 12, 13, 14}; QList<int> slaveIdCandidates = {50, 11, 12, 13, 14};
AmtronCompact20Discovery::AmtronCompact20Discovery(ModbusRtuHardwareResource *modbusRtuResource, QObject *parent): AmtronCompact20Discovery::AmtronCompact20Discovery(ModbusRtuHardwareResource *modbusRtuResource, QObject *parent):
@ -83,7 +85,7 @@ void AmtronCompact20Discovery::tryConnect(ModbusRtuMaster *master, quint16 slave
if (reply->error() == ModbusRtuReply::NoError) { if (reply->error() == ModbusRtuReply::NoError) {
QString serialNumber = ModbusDataUtils::convertToString(reply->result(), ModbusDataUtils::ByteOrderBigEndian).remove(QRegExp("^_*")); QString serialNumber = ModbusDataUtils::convertToString(reply->result(), ModbusDataUtils::ByteOrderBigEndian).remove(QRegularExpression("^_*"));
qCDebug(dcMennekes()) << "Test reply finished!" << reply->error() << serialNumber; qCDebug(dcMennekes()) << "Test reply finished!" << reply->error() << serialNumber;
Result result {master->modbusUuid(), serialNumber, slaveId}; Result result {master->modbusUuid(), serialNumber, slaveId};
@ -91,7 +93,7 @@ void AmtronCompact20Discovery::tryConnect(ModbusRtuMaster *master, quint16 slave
} }
if (slaveIdIndex < slaveIdCandidates.count() - 1) { if (slaveIdIndex < slaveIdCandidates.length() - 1) {
tryConnect(master, slaveIdIndex+1); tryConnect(master, slaveIdIndex+1);
} else { } else {
emit discoveryFinished(true); emit discoveryFinished(true);

Some files were not shown because too many files have changed in this diff Show More