diff --git a/makefile b/makefile index 1130b6719..df2c1d4a5 100644 --- a/makefile +++ b/makefile @@ -13,7 +13,7 @@ MAKEFLAGS+="j " #TARGET := $(notdir $(CURDIR)) TARGET := emsesp BUILD := build -SOURCES := src lib_standalone lib/rtcvars lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src src/devices +SOURCES := src lib_standalone lib/rtcvars lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src src/devices src/test INCLUDES := lib_standalone/ArduinoJson/src lib_standalone lib/rtcvars lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/uuid-telnet/src lib/uuid-syslog/src src/devices src LIBRARIES := diff --git a/src/test_data.h b/src/test/test.cpp similarity index 68% rename from src/test_data.h rename to src/test/test.cpp index f65e9a8db..c39e12121 100644 --- a/src/test_data.h +++ b/src/test/test.cpp @@ -1,10 +1,34 @@ + +/* + * EMS-ESP - https://github.com/proddy/EMS-ESP + * Copyright 2019 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "test.h" + +namespace emsesp { + // create some fake test data // used with the 'test' command, under su/admin -void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) { +void Test::run_test(uuid::console::Shell & shell, const std::string & command) { if (command == "devices") { - rxservice_.ems_mask(EMSbus::EMS_MASK_BUDERUS); // this is important otherwise nothing will be picked up! + EMSESP::rxservice_.ems_mask(EMSbus::EMS_MASK_BUDERUS); // this is important otherwise nothing will be picked up! - emsdevices.push_back(EMSFactory::add(EMSdevice::DeviceType::BOILER, EMSdevice::EMS_DEVICE_ID_BOILER, 0, "", "My Boiler", 0, 0)); + //emsdevices.push_back(EMSFactory::add(EMSdevice::DeviceType::BOILER, EMSdevice::EMS_DEVICE_ID_BOILER, 0, "", "My Boiler", 0, 0)); // A fake response - UBADevices(0x07) rx_telegram({0x08, 0x00, 0x07, 0x00, 0x0B, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}); @@ -13,14 +37,14 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) if (command == "boiler2") { // question: do we need to set the mask? std::string version("1.2.3"); - add_device(0x08, 123, version, EMSdevice::Brand::BUDERUS); // Nefit Trendline + EMSESP::add_device(0x08, 123, version, EMSdevice::Brand::BUDERUS); // Nefit Trendline } if (command == "unknown") { // question: do we need to set the mask? std::string version("1.2.3"); - add_device(0x09, 89, version, EMSdevice::Brand::BUDERUS); - rxservice_.loop(); + EMSESP::add_device(0x09, 89, version, EMSdevice::Brand::BUDERUS); + EMSESP::rxservice_.loop(); // simulate getting version information back from an unknown device rx_telegram({0x09, 0x0B, 0x02, 0x00, 0x59, 0x01, 0x02}); @@ -41,8 +65,8 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) // add thermostat - Thermostat: RC300/RC310/Moduline 3000/CW400/Sense II (DeviceID:0x10, ProductID:158, Version:03.03) ** master device ** std::string version("01.03"); - add_device(0x10, 158, version, EMSdevice::Brand::BUDERUS); - rxservice_.loop(); + EMSESP::add_device(0x10, 158, version, EMSdevice::Brand::BUDERUS); + EMSESP::rxservice_.loop(); // simulate incoming telegram // Thermostat(0x10) -> 48(0x48), ?(0x26B), data: 6B 08 4F 00 00 00 02 00 00 00 02 00 03 00 03 00 03 @@ -60,18 +84,18 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) // add_device(0x17, 93, version, EMSdevice::Brand::BUDERUS); // add_device(0x17, 254, version, EMSdevice::Brand::BUDERUS); // test unknown product_id - add_device(0x18, 157, version, EMSdevice::Brand::BOSCH); // Bosch CR100 - https://github.com/proddy/EMS-ESP/issues/355 + EMSESP::add_device(0x18, 157, version, EMSdevice::Brand::BOSCH); // Bosch CR100 - https://github.com/proddy/EMS-ESP/issues/355 } if (command == "solar") { shell.printfln(F("Testing Solar")); - rxservice_.ems_mask(EMSbus::EMS_MASK_BUDERUS); + EMSESP::rxservice_.ems_mask(EMSbus::EMS_MASK_BUDERUS); std::string version("1.2.3"); - add_device(0x30, 163, version, EMSdevice::Brand::BUDERUS); // SM100 + EMSESP::add_device(0x30, 163, version, EMSdevice::Brand::BUDERUS); // SM100 - rxservice_.loop(); + EMSESP::rxservice_.loop(); // SM100Monitor - type 0x0362 EMS+ - for SM100 and SM200 // B0 0B FF 00 02 62 00 44 02 7A 80 00 80 00 80 00 80 00 80 00 80 00 00 7C 80 00 80 00 80 00 80 @@ -82,11 +106,11 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) if (command == "cr100") { shell.printfln(F("Testing CR100")); - rxservice_.ems_mask(EMSbus::EMS_MASK_HT3); // switch to junkers + EMSESP::rxservice_.ems_mask(EMSbus::EMS_MASK_HT3); // switch to junkers std::string version("1.2.3"); - add_device(0x18, 157, version, EMSdevice::Brand::BOSCH); // Bosch CR100 - https://github.com/proddy/EMS-ESP/issues/355 - rxservice_.loop(); + EMSESP::add_device(0x18, 157, version, EMSdevice::Brand::BOSCH); // Bosch CR100 - https://github.com/proddy/EMS-ESP/issues/355 + EMSESP::rxservice_.loop(); // RCPLUSStatusMessage_HC1(0x01A5) // 98 00 FF 00 01 A5 00 CF 21 2E 00 00 2E 24 03 25 03 03 01 03 25 00 C8 00 00 11 01 03 @@ -94,10 +118,10 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) 0x03, 0x25, 0x03, 0x03, 0x01, 0x03, 0x25, 0x00, 0xC8, 0x00, 0x00, 0x11, 0x01, 0x03}); shell.loop_all(); - rxservice_.loop(); - txservice_.flush_tx_queue(); + EMSESP::rxservice_.loop(); + EMSESP::txservice_.flush_tx_queue(); shell.loop_all(); - show_values(shell); + EMSESP::show_values(shell); shell.invoke_command("thermostat"); shell.loop_all(); @@ -106,10 +130,10 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) shell.invoke_command("set mode auto"); shell.loop_all(); - show_emsbus(shell); + EMSESP::show_emsbus(shell); shell.loop_all(); - txservice_.send(); // send it to UART + EMSESP::txservice_.send(); // send it to UART } if (command == "rx") { @@ -131,7 +155,7 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) // bad CRC - corrupt telegram - CRC should be 0x8E uint8_t t5[] = {0x17, 0x0B, 0x91, 0x05, 0x44, 0x45, 0x46, 0x47, 0x99}; - rxservice_.add(t5, sizeof(t5)); + EMSESP::rxservice_.add(t5, sizeof(t5)); // simulating a Tx record uart_telegram({0x0B, 0x88, 0x07, 0x00, 0x20}); @@ -168,127 +192,127 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) if (command == "send") { shell.printfln(F("Sending to Tx...")); - show_emsbus(shell); - txservice_.send(); // send it to UART + EMSESP::show_emsbus(shell); + EMSESP::txservice_.send(); // send it to UART } if (command == "tx") { shell.printfln(F("Testing Tx...")); - txservice_.flush_tx_queue(); + EMSESP::txservice_.flush_tx_queue(); // TX queue example - Me -> Thermostat, (0x91), telegram: 0B 17 91 05 44 45 46 47 (#data=4) // uint8_t t11[] = {0x44, 0x45, 0x46, 0x47}; - // txservice_.add(Telegram::Operation::TX_RAW, 0x17, 0x91, 0x05, t11, sizeof(t11)); + // EMSESP::txservice_.add(Telegram::Operation::TX_RAW, 0x17, 0x91, 0x05, t11, sizeof(t11)); // TX - raw example test // uint8_t t12[] = {0x10, 0x08, 0x63, 0x04, 0x64}; - // txservice_.add(t12, sizeof(t12)); + // EMSESP::txservice_.add(t12, sizeof(t12)); // TX - sending raw string - // txservice_.send_raw("10 08 63 03 64 65 66"); + // EMSESP::txservice_.send_raw("10 08 63 03 64 65 66"); // TX - send a read request - send_read_request(0x18, 0x08); + EMSESP::send_read_request(0x18, 0x08); // TX - send a write request // uint8_t t18[] = {0x52, 0x79}; // send_write_request(0x91, 0x17, 0x00, t18, sizeof(t18)); - console_.loop(); - show_emsbus(shell); - txservice_.send(); // send it to UART + shell.loop_all(); + EMSESP::show_emsbus(shell); + EMSESP::txservice_.send(); // send it to UART - txservice_.flush_tx_queue(); + EMSESP::txservice_.flush_tx_queue(); } if (command == "poll") { shell.printfln(F("Testing Poll...")); // check if sending works when a poll comes in, with retries - txservice_.flush_tx_queue(); + EMSESP::txservice_.flush_tx_queue(); // simulate sending a read request // uint8_t t16[] = {0x44, 0x45, 0x46, 0x47}; // Me -> Thermostat, (0x91), telegram: 0B 17 91 05 44 45 46 47 (#data=4) - // txservice_.add(Telegram::Operation::TX_RAW, 0x17, 0x91, 0x05, t16, sizeof(t16)); - send_read_request(0x91, 0x17); - // txservice_.show_tx_queue(); + // EMSESP::txservice_.add(Telegram::Operation::TX_RAW, 0x17, 0x91, 0x05, t16, sizeof(t16)); + EMSESP::send_read_request(0x91, 0x17); + // EMSESP::txservice_.show_tx_queue(); // Simulate adding a Poll, so read request is sent uint8_t poll[1] = {0x8B}; - incoming_telegram(poll, 1); + EMSESP::incoming_telegram(poll, 1); // incoming Rx uart_telegram({0x17, 0x08, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A}); // Simulate adding a Poll - should send retry - incoming_telegram(poll, 1); + EMSESP::incoming_telegram(poll, 1); - show_emsbus(shell); + EMSESP::show_emsbus(shell); uint8_t t2[] = {0x21, 0x22}; - send_write_request(0x91, 0x17, 0x00, t2, sizeof(t2), 0); - show_emsbus(shell); + EMSESP::send_write_request(0x91, 0x17, 0x00, t2, sizeof(t2), 0); + EMSESP::show_emsbus(shell); - txservice_.flush_tx_queue(); + EMSESP::txservice_.flush_tx_queue(); } if (command == "mqtt1") { shell.printfln(F("Testing MQTT...")); // MQTT test - txservice_.flush_tx_queue(); - mqtt_.publish("boiler_cmd", "test me"); - // mqtt_.show_queue(); + EMSESP::txservice_.flush_tx_queue(); + EMSESP::EMSESP::mqtt_.publish("boiler_cmd", "test me"); + // EMSESP::mqtt_.show_queue(); // simulate an incoming mqtt msg char topic[Mqtt::MQTT_TOPIC_MAX_SIZE]; char payload[100]; strcpy(topic, "boiler_cmd"); strcpy(payload, "12345"); - mqtt_.incoming(topic, payload); - mqtt_.incoming(payload, payload); // should report error + EMSESP::mqtt_.incoming(topic, payload); + EMSESP::mqtt_.incoming(payload, payload); // should report error strcpy(topic, "thermostat_cmd_mode"); strcpy(payload, "auto"); - mqtt_.incoming(topic, payload); + EMSESP::mqtt_.incoming(topic, payload); strcpy(topic, "thermostat_cmd_temp"); strcpy(payload, "20"); - mqtt_.incoming(topic, payload); + EMSESP::mqtt_.incoming(topic, payload); strcpy(topic, "thermostat_cmd"); strcpy(payload, "{\"cmd\":\"temp\",\"data\":22.52}"); - mqtt_.incoming(topic, payload); + EMSESP::mqtt_.incoming(topic, payload); strcpy(topic, "boiler_cmd_wwtemp"); strcpy(payload, "66"); - mqtt_.incoming(topic, payload); + EMSESP::mqtt_.incoming(topic, payload); strcpy(topic, "thermostat_cmd"); strcpy(payload, "{\"cmd\":\"temp\",\"hc\":2,\"data\":22}"); - mqtt_.incoming(topic, payload); + EMSESP::mqtt_.incoming(topic, payload); strcpy(topic, "home/ems-esp/cmd"); strcpy(payload, "restart"); - mqtt_.incoming(topic, payload); + EMSESP::mqtt_.incoming(topic, payload); - // txservice_.show_tx_queue(); + // EMSESP::txservice_.show_tx_queue(); - publish_all_values(); + EMSESP::publish_all_values(); } if (command == "poll2") { shell.printfln(F("Testing Tx Sending last message on queue...")); - show_emsbus(shell); + EMSESP::show_emsbus(shell); uint8_t poll[1] = {0x8B}; - incoming_telegram(poll, 1); + EMSESP::incoming_telegram(poll, 1); - rxservice_.loop(); + EMSESP::rxservice_.loop(); - show_emsbus(shell); - txservice_.flush_tx_queue(); + EMSESP::show_emsbus(shell); + EMSESP::txservice_.flush_tx_queue(); } if (command == "rx2") { @@ -304,7 +328,7 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) } if (command == "mqtt2") { - // Mqtt::subscribe("cmd", std::bind(&EMSESP::dummy_mqtt_commands, this, _1)); + // Mqtt::subscribe("cmd", std::bind(&EMSESP::dummy_EMSESP::mqtt_commands, this, _1)); for (uint8_t i = 0; i < 30; i++) { Mqtt::subscribe("cmd", dummy_mqtt_commands); } @@ -319,19 +343,19 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) // send read request with offset if (command == "offset") { // send_read_request(0x18, 0x08); - txservice_.read_request(0x18, 0x08, 27); // no offset + EMSESP::txservice_.read_request(0x18, 0x08, 27); // no offset } if (command == "mixing") { shell.printfln(F("Mixing Solar")); - rxservice_.ems_mask(EMSbus::EMS_MASK_BUDERUS); + EMSESP::rxservice_.ems_mask(EMSbus::EMS_MASK_BUDERUS); std::string version("1.2.3"); - add_device(0x28, 160, version, EMSdevice::Brand::BUDERUS); // MM100, WWC - add_device(0x29, 161, version, EMSdevice::Brand::BUDERUS); // MM200, WWC + EMSESP::add_device(0x28, 160, version, EMSdevice::Brand::BUDERUS); // MM100, WWC + EMSESP::add_device(0x29, 161, version, EMSdevice::Brand::BUDERUS); // MM200, WWC - rxservice_.loop(); + EMSESP::rxservice_.loop(); // WWC1 on 0x29 rx_telegram({0xA9, 0x00, 0xFF, 0x00, 0x02, 0x32, 0x02, 0x6C, 0x00, 0x3C, 0x00, 0x3C, 0x3C, 0x46, 0x02, 0x03, 0x03, 0x00, 0x3C}); @@ -345,29 +369,31 @@ void EMSESP::run_test(uuid::console::Shell & shell, const std::string & command) } // simulates a telegram in the Rx queue, but without the CRC which is added automatically -void EMSESP::rx_telegram(const std::vector & rx_data) { +void Test::rx_telegram(const std::vector & rx_data) { uint8_t len = rx_data.size(); uint8_t data[50]; std::copy(rx_data.begin(), rx_data.end(), data); - data[len] = rxservice_.calculate_crc(rx_data.data(), len); - rxservice_.add(data, len + 1); - rxservice_.loop(); + data[len] = EMSESP::rxservice_.calculate_crc(rx_data.data(), len); + EMSESP::rxservice_.add(data, len + 1); + EMSESP::rxservice_.loop(); } // simulates a telegram straight from UART, but without the CRC which is added automatically -void EMSESP::uart_telegram(const std::vector & rx_data) { +void Test::uart_telegram(const std::vector & rx_data) { uint8_t len = rx_data.size(); uint8_t data[50]; std::copy(rx_data.begin(), rx_data.end(), data); - data[len] = rxservice_.calculate_crc(rx_data.data(), len); - incoming_telegram(data, len + 1); + data[len] = EMSESP::rxservice_.calculate_crc(rx_data.data(), len); + EMSESP::incoming_telegram(data, len + 1); } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" -void EMSESP::dummy_mqtt_commands(const char * message) { +void Test::dummy_mqtt_commands(const char * message) { // } #pragma GCC diagnostic pop + +} // namespace emsesp diff --git a/src/test/test.h b/src/test/test.h new file mode 100644 index 000000000..86a28f88b --- /dev/null +++ b/src/test/test.h @@ -0,0 +1,50 @@ +/* + * EMS-ESP - https://github.com/proddy/EMS-ESP + * Copyright 2019 Paul Derbyshire + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef EMSESP_TEST_H +#define EMSESP_TEST_H + +#include + +#include +#include + +#include +#include +#include + +#include "emsdevice.h" +#include "emsfactory.h" +#include "telegram.h" +#include "mqtt.h" +#include "emsesp.h" + +namespace emsesp { + +class Test { + public: + + static void run_test(uuid::console::Shell & shell, const std::string & command); // only for testing + static void dummy_mqtt_commands(const char * message); + static void rx_telegram(const std::vector & data); + static void uart_telegram(const std::vector & rx_data); +}; + +} // namespace emsesp + +#endif