From e1ec1032b5b0ce1b253fd63dc281195178d59eff Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 21 Mar 2023 16:52:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8C=87=E4=BB=A4=E4=B8=B2?= =?UTF-8?q?=E5=8F=A3BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++ buildtools | 2 +- dep/iflytopcpp | 2 +- sh/boardinit.sh | 49 ++++++++++ src/configs/zconfig.hpp | 6 +- src/main.cpp | 6 +- src/service/device_io_service.cpp | 171 +++++++++++++-------------------- src/service/device_io_service.hpp | 20 ++-- src/service/device_io_service_mock.cpp | 2 +- src/service/device_io_service_mock.hpp | 2 +- src/service/light_control_service.cpp | 36 ++++--- 11 files changed, 165 insertions(+), 137 deletions(-) diff --git a/README.md b/README.md index 1635850..ba15b32 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,12 @@ ## 编译RK3328 ```bash + +# 板子环境初始化 +./sh/boardinit.sh --deviceId --ftpserver 47.92.195.73 --fixmac true --ip +# demo +./sh/boardinit.sh --deviceId intelligent_light_pole01 --ftpserver 47.92.195.73 --fixmac true --ip 192.168.1.192 + # 初始化环境 ./sh/iflytool.sh envsetup diff --git a/buildtools b/buildtools index 45b06ce..a1cb271 160000 --- a/buildtools +++ b/buildtools @@ -1 +1 @@ -Subproject commit 45b06ce5325ab6528de930d9b579ae447e12c26f +Subproject commit a1cb2710c928ec2fb36fc944f592303b0118e227 diff --git a/dep/iflytopcpp b/dep/iflytopcpp index a25cad2..217a1d9 160000 --- a/dep/iflytopcpp +++ b/dep/iflytopcpp @@ -1 +1 @@ -Subproject commit a25cad2026c70d65867ad54e3f1faced1ebd2988 +Subproject commit 217a1d97abdaa252dd0daae0cf1c2e2d702833b9 diff --git a/sh/boardinit.sh b/sh/boardinit.sh index 9b4d1af..ac04076 100755 --- a/sh/boardinit.sh +++ b/sh/boardinit.sh @@ -51,6 +51,50 @@ function generate_device_info() { } +function update_frpc_config() { + # + # 当前这版本的FRPC的配置文件有问题,重新生成配置文件 + # + # [common] + # server_addr = {{ .Envs.FRP_SERVER_ADDR }} + # server_port = 7000 + # log_file = /var/log/frpc.log + # log_level = debug + # log_max_days = 3 + # login_fail_exit = false + # user = {{ .Envs.DEVICE_ID }} + # + # [ssh] + # type = tcp + # local_ip = 127.0.0.1 + # local_port = 22 + # remote_port = 0 + + + echo "[common]" >/etc/frpc.ini + echo "server_addr = ${FTP_SERVER_ADDR}" >>/etc/frpc.ini + echo "server_port = 7000" >>/etc/frpc.ini + echo "log_file = /var/log/frpc.log" >>/etc/frpc.ini + echo "log_level = debug" >>/etc/frpc.ini + echo "log_max_days = 3" >>/etc/frpc.ini + echo "login_fail_exit = false" >>/etc/frpc.ini + echo "user = ${DEVICE_ID}" >>/etc/frpc.ini + echo "" >>/etc/frpc.ini + echo "[ssh]" >>/etc/frpc.ini + echo "type = tcp" >>/etc/frpc.ini + echo "local_ip = 127.0.0.1" >>/etc/frpc.ini + echo "local_port = 22" >>/etc/frpc.ini + echo "remote_port = 0" >>/etc/frpc.ini + + echo "+++++++++ create /etc/frpc.ini +++++++++" + cat /etc/frpc.ini + echo "" + + systemctl enable frpc.service + systemctl start frpc + +} + set -e DEVICE_ID="" FTP_SERVER_ADDR="" @@ -108,3 +152,8 @@ if [ "$FIX_MAC" == "true" ]; then fi generate_device_info + +# 翻转屏幕 +ff_rotate right + +update_frpc_config \ No newline at end of file diff --git a/src/configs/zconfig.hpp b/src/configs/zconfig.hpp index 7d85994..3e81b8f 100644 --- a/src/configs/zconfig.hpp +++ b/src/configs/zconfig.hpp @@ -20,14 +20,16 @@ marco(int /* */, recoder_ch_number, 5) /*录音设备配置*/ \ marco(int /* */, recoder_sample_rate, 16000) /*录音设备配置*/ \ marco(int /* */, recoder_period_time_ms, 50) /*录音设备配置*/ \ - marco(string /* */, wakeup_module_path, "./precise/precise-engine") /*唤醒词配置*/ \ - marco(string /* */, wakeup_lib_module, "xiaomaoxiaomao/xiaomaoxiaomao.pb") /*唤醒词配置*/ \ + marco(string /* */, wakeup_module_path, "xiaomaoxiaomao/xiaomaoxiaomao.pb") /*唤醒词配置*/ \ + marco(string /* */, wakeup_lib_module, "./precise/precise-engine") /*唤醒词配置*/ \ marco(string /* */, wakeup_chunk_length, "1600") /*唤醒词配置,对应50ms*/ \ marco(bool /* */, voice_logger_enable, true) /*是否记录语音配置*/ \ marco(string /* */, aiui_appid, "5938b7c7") /*唤醒词配置,对应50ms*/ \ marco(string /* */, aiui_appkey, "19c1f7becc78eedc7826b485aabe30de") /*唤醒词配置,对应50ms*/ \ marco(string /* */, aiui_auth_id, "") /*唤醒词配置,对应50ms*/ \ marco(string /* */, aiui_scene, "main_box") /*唤醒词配置,对应50ms*/ \ + marco(string /* */, device_io_uart_path, "/dev/ttyUSB1") /*唤醒词配置,对应50ms*/ \ + marco(int /* */, device_io_uart_baundrate, 115200) /*唤醒词配置,对应50ms*/ \ marco(string /* */, lightControlMode, "auto") /*照明灯控制模式 auto/manual*/ \ marco(int /* */, lightAutoOpenHour, 18) /**/ \ marco(int /* */, lightAutoOpenMin, 0) /**/ \ diff --git a/src/main.cpp b/src/main.cpp index a4bf48e..9788692 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -119,12 +119,14 @@ void Main::buildDeviceIOService() { /** * @brief DeviceIOService初始化 */ -#if 0 + auto config = GET_SERVICE(ZConfig); + +#if 1 BUILD_AND_REG_SERRVICE(DeviceIOService); #else BUILD_AND_REG_MOCK_SERRVICE(DeviceIOService, DeviceIOServiceMock); #endif - GET_SERVICE(DeviceIOService)->initialize(); + GET_SERVICE(DeviceIOService)->initialize(config->get_device_io_uart_path(), config->get_device_io_uart_baundrate()); } void Main::buildVoiceProcessService() { diff --git a/src/service/device_io_service.cpp b/src/service/device_io_service.cpp index 5c3576d..21da360 100644 --- a/src/service/device_io_service.cpp +++ b/src/service/device_io_service.cpp @@ -8,29 +8,29 @@ using namespace core; using namespace std; const static int ksubboarddeviceid = 0x01; -const int kovertime = 33; +const int kovertime = 33; -#define EXEC_MODBUS(exptr) \ - int ret = exptr; \ - if (ret != 0) { \ - throw zexception( \ - fmt::format("[{}:{}] do {} fail, ret={},{}", __FUNCTION__, __LINE__, exptr, ret, modbusStatusToStr(ret))); \ +#define EXEC_MODBUS(exptr) \ + int ret = exptr; \ + if (ret != 0) { \ + throw zexception( \ + fmt::format("[{}:{}] do {} fail, ret={},{}", __FUNCTION__, __LINE__, #exptr, ret, modbusStatusToStr(ret))); \ } -void DeviceIOService::initialize() { +void DeviceIOService::initialize(string uartpath, int baudrate) { modbusMaster = shared_ptr(new ModbusMaster()); - bool suc = modbusMaster->initializeTtyChannel("/dev/ttyUSB0", 115200); + bool suc = modbusMaster->initializeTtyChannel(uartpath.c_str(), baudrate); if (!suc) { logger->error("modbusMaster initializeTtyChannel fail"); } - thread.reset(new Thread("input_device_state_monitor", [this]() { inputStateMonitorLoop(); })); - +#if 0 idcard_read_thread.reset(new Thread("idcard_read", [this]() { ThisThread thisThread; + int loopperiod = 50; while (!thisThread.getExitFlag()) { try { - bool state; + bool state; string info; idcardread(state, info); @@ -38,28 +38,26 @@ void DeviceIOService::initialize() { logger->info("idcard read info:{}", info); onidcard(info); } - + loopperiod = 50; } catch (zexception& e) { - static tp_steady lastlogticket; - if (tu_steady().elapsedTimeS(lastlogticket) > 5) { - logger->error("idcard read fail:{}", e.what()); - lastlogticket = tu_steady().now(); - } + logger->error("idcard read fail:{}", e.what()); + loopperiod = 10000; } - thisThread.sleepForMs(100); + thisThread.sleepForMs(loopperiod); } })); +#endif } void DeviceIOService::relayControl(relay_device_type_t type, bool value) { /** * @brief - * 0(16Byte) | 继电器0 ->继电器15 掩码 - * 1(16Byte) | 继电器16->继电器31 掩码 - * 2(16Byte) | 继电器0 ->继电器15 继电器状态 - * 3(16Byte) | 继电器16->继电器31 继电器状态 + * 8(16Byte) | 继电器0 ->继电器15 掩码 + * 9(16Byte) | 继电器16->继电器31 掩码 + * 10(16Byte) | 继电器0 ->继电器15 继电器状态 + * 11(16Byte) | 继电器16->继电器31 继电器状态 */ - uint32_t off = (uint32_t)type; - uint32_t mask = 1 << off; + uint32_t off = (uint32_t)type; + uint32_t mask = 1 << off; uint32_t status = value ? mask : 0; uint16_t reg[4]; @@ -68,21 +66,21 @@ void DeviceIOService::relayControl(relay_device_type_t type, bool value) { MODBUS_SET_REG(reg[2], uint16_t(status)); MODBUS_SET_REG(reg[3], uint16_t(status >> 16)); - EXEC_MODBUS(modbusMaster->modbus10(ksubboarddeviceid, 0, 4, reg, kovertime)); + EXEC_MODBUS(modbusMaster->modbus10(ksubboarddeviceid, 8, 4, reg, kovertime)); } DeviceIOService::RelayDeviceState DeviceIOService::relayStateGet() { /** * @brief - * 0(16Byte) | 继电器0 ->继电器15 掩码 - * 1(16Byte) | 继电器16->继电器31 掩码 - * 2(16Byte) | 继电器0 ->继电器15 继电器状态 - * 3(16Byte) | 继电器16->继电器31 继电器状态 + * 8(16Byte) | 继电器0 ->继电器15 掩码 + * 9(16Byte) | 继电器16->继电器31 掩码 + * 10(16Byte) | 继电器0 ->继电器15 继电器状态 + * 11(16Byte) | 继电器16->继电器31 继电器状态 */ DeviceIOService::RelayDeviceState state = {}; - Modbus03Rx modbus03rx; - EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 2, 2, modbus03rx, kovertime)); + Modbus03Rx modbus03rx; + EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 10, 2, modbus03rx, kovertime)); uint32_t regstate = uint32_t(modbus03rx.getReg(2)) | uint32_t(modbus03rx.getReg(3) << 16); - state.state = regstate; + state.state = regstate; return state; } @@ -91,93 +89,56 @@ uint16_t DeviceIOService::getReg(int index) { EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, index, 1, modbus03rx, kovertime)); return modbus03rx.getReg(index); } -#if 0 -/*********************************************************************************************************************** - * ==================================================路由器电源控制=================================================== * - ***********************************************************************************************************************/ -bool DeviceIOService::routerGetPowerState() { return relayStateGet(0); } -void DeviceIOService::routerSetPowerState(bool routepower) { - logger->debug("routerSetPowerState {}", routepower); - relayControl(0, true); -} - -/*********************************************************************************************************************** - * ==================================================触控屏供电控制=================================================== * - ***********************************************************************************************************************/ -bool DeviceIOService::touchScreenGetPowerState() { return relayStateGet(1); } -void DeviceIOService::touchScreenSetPowerState(bool touchpower) { - logger->debug("touchScreenSetPowerState {}", touchpower); - relayControl(1, touchpower); -} - -/*********************************************************************************************************************** - * ==================================================USB充电器供电=================================================== * - ***********************************************************************************************************************/ -bool DeviceIOService::usbChargerGetPowerState() { return relayStateGet(2); } -void DeviceIOService::usbChargerSetPowerState(bool usbpower) { - logger->debug("usbChargerSetPowerState {}", usbpower); - relayControl(2, usbpower); -} - -/*********************************************************************************************************************** - * ==================================================摄像头供电=================================================== * - ***********************************************************************************************************************/ -bool DeviceIOService::cameraGetPowerState() { return relayStateGet(3); } -void DeviceIOService::cameraSetPowerState(bool camerapower) { - logger->debug("cameraSetPowerState {}", camerapower); - relayControl(3, camerapower); -} - -/*********************************************************************************************************************** - * ==================================================照明控制=================================================== * - ***********************************************************************************************************************/ -bool DeviceIOService::lightGetPowerState() { return relayStateGet(4); } -void DeviceIOService::lightSetPowerState(bool lightpower) { - logger->debug("lightSetPowerState {}", lightpower); - relayControl(4, lightpower); -} -#endif DeviceIOService::InputDeviceState DeviceIOService::getinputState() { +#if 0 +寄存器: +Addr | 功能 +------------|------------------------------- +12(16Byte) | 所有限位输入状态 +#endif DeviceIOService::InputDeviceState inputDeviceState; - Modbus03Rx modbus03rx; - EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 4, 2, modbus03rx, kovertime)); - uint32_t regstate = uint32_t(modbus03rx.getReg(4)) | uint32_t(modbus03rx.getReg(5) << 16); + Modbus03Rx modbus03rx; + EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 12, 1, modbus03rx, kovertime)); + uint32_t regstate = uint32_t(modbus03rx.getReg(4)) | uint32_t(modbus03rx.getReg(5) << 16); inputDeviceState.state = regstate; return inputDeviceState; } void DeviceIOService::inputStateMonitorLoop() { ThisThread thisThread; + int loopperiod = 50; while (!thisThread.getExitFlag()) { try { - uint32_t regstate = getinputState().state; + uint32_t newkeystate = getinputState().state; for (size_t i = 0; i < 32; i++) { - bool state = (regstate & (1 << i)) != 0; + bool state = (newkeystate & (1 << i)) != 0; bool oldstate = (keystate & (1 << i)) != 0; if (state != oldstate) { logger->info("on {} state change, state={}", input_device_type2str(input_device_type_t(i)), state); onInputStateChange((input_device_type_t)i, state); } } + keystate = newkeystate; + loopperiod = 50; } catch (const std::exception& e) { /** - * @brief 如果出现异常,则每隔5秒打印一次日志 + * @brief 如果出现异常,那么就延时10秒,然后再次尝试 */ - static tp_steady lastlogticket; - if (tu_steady().elapsedTimeS(lastlogticket) > 5) { - logger->error("inputStateMonitorLoop fail, {}", e.what()); - lastlogticket = tu_steady().now(); - } + logger->error("[:{}] catch exception, {}", __LINE__, e.what()); + loopperiod = 10000; + } catch (...) { + logger->error("[:{}] catch exception, unknown error", __LINE__); + loopperiod = 10000; } - thisThread.sleepForMs(50); + thisThread.sleepForMs(loopperiod); } } uint32_t DeviceIOService::getInterTemperature() { return getReg(16); } DeviceIOService::env_sensor_state_t DeviceIOService::getEnvSensorState() { - Modbus03Rx modbus03rx; + Modbus03Rx modbus03rx; env_sensor_state_t env_sensor_state = {0}; EXEC_MODBUS(modbusMaster->modbus03(ksubboarddeviceid, 48, 11, modbus03rx, kovertime)); /** @@ -195,18 +156,18 @@ DeviceIOService::env_sensor_state_t DeviceIOService::getEnvSensorState() { 59(16Byte) | light_intensity H 60(16Byte) | light_intensity L */ - env_sensor_state.wind_speed = modbus03rx.getReg(48); - env_sensor_state.wind_direction = modbus03rx.getReg(49); - env_sensor_state.temperature = modbus03rx.getReg(50); - env_sensor_state.humidity = modbus03rx.getReg(51); - env_sensor_state.noise = modbus03rx.getReg(52); - env_sensor_state.pm2_5 = modbus03rx.getReg(53); - env_sensor_state.pm10 = modbus03rx.getReg(54); - env_sensor_state.co2 = modbus03rx.getReg(55); + env_sensor_state.wind_speed = modbus03rx.getReg(48); + env_sensor_state.wind_direction = modbus03rx.getReg(49); + env_sensor_state.temperature = modbus03rx.getReg(50); + env_sensor_state.humidity = modbus03rx.getReg(51); + env_sensor_state.noise = modbus03rx.getReg(52); + env_sensor_state.pm2_5 = modbus03rx.getReg(53); + env_sensor_state.pm10 = modbus03rx.getReg(54); + env_sensor_state.co2 = modbus03rx.getReg(55); env_sensor_state.atmospheric_pressure = modbus03rx.getReg(56); - env_sensor_state.tvoc = modbus03rx.getReg(57); - env_sensor_state.hcho = modbus03rx.getReg(58); - env_sensor_state.light_intensity = uint32_t(modbus03rx.getReg(59)) << 16 | uint32_t(modbus03rx.getReg(60)); + env_sensor_state.tvoc = modbus03rx.getReg(57); + env_sensor_state.hcho = modbus03rx.getReg(58); + env_sensor_state.light_intensity = uint32_t(modbus03rx.getReg(59)) << 16 | uint32_t(modbus03rx.getReg(60)); logger->debug( "getEnvSensorState, " @@ -239,7 +200,7 @@ void DeviceIOService::fanGetState(int id, float& power, uint16_t& error) { } float DeviceIOService::fanGetState(int id) { - float power = 0; + float power = 0; uint16_t error = 0; fanGetState(id, power, error); if (error != 0) { @@ -275,8 +236,8 @@ void DeviceIOService::idcardread(bool& state, string& info) { * ..(16Byte) | * 127(16Byte) | */ - state = false; - info = ""; + state = false; + info = ""; int datalen = 0; { Modbus03Rx modbus03rx; diff --git a/src/service/device_io_service.hpp b/src/service/device_io_service.hpp index 2c460d8..28d80ec 100644 --- a/src/service/device_io_service.hpp +++ b/src/service/device_io_service.hpp @@ -42,7 +42,7 @@ class DeviceIOService : public enable_shared_from_this { ENABLE_LOGGER(DeviceIOService); shared_ptr modbusMaster; - uint32_t keystate; + uint32_t keystate = 0; unique_ptr thread; unique_ptr idcard_read_thread; @@ -67,7 +67,7 @@ class DeviceIOService : public enable_shared_from_this { class InputDeviceState { public: uint32_t state; - bool getState(input_device_type_t inputtype) { return (state & (1 << inputtype)) != 0; } + bool getState(input_device_type_t inputtype) { return (state & (1 << inputtype)) != 0; } }; string input_device_type2str(input_device_type_t type) { @@ -79,7 +79,7 @@ class DeviceIOService : public enable_shared_from_this { case kHumanProximitySensor: return "kHumanProximitySensor"; default: - return "unknow"; + return fmt::format("unknow({})", (int)type); } } @@ -111,23 +111,23 @@ class DeviceIOService : public enable_shared_from_this { class RelayDeviceState { public: uint32_t state; - bool getState(relay_device_type_t inputtype) { return (state & (1 << inputtype)) != 0; } + bool getState(relay_device_type_t inputtype) { return (state & (1 << inputtype)) != 0; } }; public: DeviceIOService(){}; - virtual void initialize(); + virtual void initialize(string uartpath, int baudrate); /********************************************************************************************************************* * ===================================================继电器控制==================================================== * *********************************************************************************************************************/ - virtual void relayControl(relay_device_type_t type, bool value); + virtual void relayControl(relay_device_type_t type, bool value); virtual RelayDeviceState relayStateGet(); /********************************************************************************************************************* * =================================================监听IO输入状态================================================== * *********************************************************************************************************************/ nod::signal onInputStateChange; - virtual InputDeviceState getinputState(); + virtual InputDeviceState getinputState(); /********************************************************************************************************************* * ===================================================温度传感器==================================================== * @@ -173,16 +173,16 @@ class DeviceIOService : public enable_shared_from_this { /********************************************************************************************************************* * ==================================================散热风扇控制=================================================== * *********************************************************************************************************************/ - virtual void fanGetState(int id, float& power, uint16_t& error); + virtual void fanGetState(int id, float& power, uint16_t& error); virtual float fanGetState(int id); - virtual void fanSetState(int id, float power); + virtual void fanSetState(int id, float power); /********************************************************************************************************************* * ====================================================刷卡控制===================================================== * *********************************************************************************************************************/ nod::signal onidcard; - virtual void idcardread(bool& state, string& info); + virtual void idcardread(bool& state, string& info); private: void inputStateMonitorLoop(); diff --git a/src/service/device_io_service_mock.cpp b/src/service/device_io_service_mock.cpp index ffc75d9..d6fcd62 100644 --- a/src/service/device_io_service_mock.cpp +++ b/src/service/device_io_service_mock.cpp @@ -24,7 +24,7 @@ class DeviceIOServiceMock : public DeviceIOService { }; #endif -void DeviceIOServiceMock::initialize() {} +void DeviceIOServiceMock::initialize(string uartpath, int baudrate) {} uint16_t DeviceIOServiceMock::getReg(int index) { return 9973; } void DeviceIOServiceMock::relayControl(relay_device_type_t type, bool value) { logger->info("relayControl type:{}, value:{}", relay_device_type2str(type), value); diff --git a/src/service/device_io_service_mock.hpp b/src/service/device_io_service_mock.hpp index 86f4f94..35c2f88 100644 --- a/src/service/device_io_service_mock.hpp +++ b/src/service/device_io_service_mock.hpp @@ -37,7 +37,7 @@ class DeviceIOServiceMock : public DeviceIOService { DeviceIOServiceMock() : DeviceIOService(){}; virtual ~DeviceIOServiceMock() {} - virtual void initialize() override; + virtual void initialize(string uartpath, int baudrate) override; virtual uint16_t getReg(int index) override; virtual void relayControl(relay_device_type_t type, bool value) override; virtual RelayDeviceState relayStateGet() override; diff --git a/src/service/light_control_service.cpp b/src/service/light_control_service.cpp index 6545b20..c8ce8e2 100644 --- a/src/service/light_control_service.cpp +++ b/src/service/light_control_service.cpp @@ -16,8 +16,8 @@ void LightControlService::start() { ThisThread thisThread; // 获得当前从1970到现在的绝对天数 - int day = time(nullptr) / 86400; - bool triggerOpen = false; + int day = time(nullptr) / 86400; + bool triggerOpen = false; bool triggerClose = false; while (!thisThread.getExitFlag()) { @@ -27,32 +27,40 @@ void LightControlService::start() { // 更新当前绝对天数 int nowDay = time(nullptr) / 86400; if (nowDay != day) { - day = nowDay; - triggerOpen = false; + day = nowDay; + triggerOpen = false; triggerClose = false; } if (!triggerClose && config->get_lightControlMode() == "auto") { // 判断是否到达开启时间 - time_t now = time(nullptr); - struct tm *tm = localtime(&now); + time_t now = time(nullptr); + struct tm *tm = localtime(&now); if (tm->tm_hour >= config->get_lightAutoCloseHour() || (tm->tm_hour == config->get_lightAutoCloseHour() && tm->tm_min >= config->get_lightAutoCloseMin())) { - logger->info("LightControlService triggerClose"); - triggerClose = true; - deviceIoService->relayControl(DeviceIOService::kLightPower, false); + try { + logger->info("LightControlService triggerClose"); + deviceIoService->relayControl(DeviceIOService::kLightPower, false); + triggerClose = true; + } catch (const std::exception &e) { + logger->error("LightControlService triggerClose error: {}", e.what()); + } } } // if (!triggerOpen && config->get_lightControlMode() == "auto") { // 判断是否到达开启时间 - time_t now = time(nullptr); - struct tm *tm = localtime(&now); + time_t now = time(nullptr); + struct tm *tm = localtime(&now); if (tm->tm_hour >= config->get_lightAutoOpenHour() || (tm->tm_hour == config->get_lightAutoOpenHour() && tm->tm_min >= config->get_lightAutoOpenMin())) { - logger->info("LightControlService triggerOpen"); - triggerOpen = true; - deviceIoService->relayControl(DeviceIOService::kLightPower, true); + try { + logger->info("LightControlService triggerOpen"); + deviceIoService->relayControl(DeviceIOService::kLightPower, true); + triggerOpen = true; + } catch (const std::exception &e) { + logger->error("LightControlService triggerOpen error: {}", e.what()); + } } }