智能家居API
    智能家居API
    • JIMO-IOT开发文档
    • JIMO-IOT-V1.0
      • 传感器有关
        • 上传传感器的数据
        • 根据ID获取传感器的全部数据
        • 限制数量获取传感器的数据
        • 按照要求求平均值
        • 模块id获取对应的状态(会验证上线和数据实时性)
        • 有数量限制的获取传感器数据
        • 有限制的获取异常记录
      • 模块有关
        • 传感器的心跳验证
        • 获取一个模块信息
        • 获取全部模块信息
        • 获取模块在线时间
        • 智能模块的记录信息
        • 根据模块的ID更新模块的mode
      • 控制有关
        • 信息获取类型
          • 不同状态的指令记录
          • 分组进行获取指令的信息
          • 不同状态的指令记录(条数)
          • 根据模块的ID获取最新指令情况
          • 据模块的ID,读取多条指令
          • 根据ID获取指令的全部信息
        • 存在信息改变
          • 硬件模块获取指令的API
          • 模块回复系统执行情况
          • 撤回指令
          • 修改指令信息内容
          • 用户发布执行指令
          • 过期指令中断
          • 智能感知模块指令测试API
          • 修改指令信息内容(要全部参数)
      • 用户有关
        • 用户登录(更新部分内容或注册)
        • 获取当前登录的用户信息
        • 用户注销登录
    • JIMO-IOT-Client-API
      • 蜂鸣器的报警
        GET
      • 表示开门
        POST

    JIMO-IOT开发文档

    这是一个IOT的管理控制数据集成的服务系统!
    原开发文档地址:https://www.yuque.com/jimoworld/javabj/jimo-iot
    优化版开发文档:https://www.yuque.com/jimoworld/javabj/jimo-iot-v1.3
    针对物联网的控制及数据整理开发一个云系统,集成对硬件的便捷控制处理及数据的可视化展示!
    物联网 - chenjimo (chenjimo) - Gitee.com
    JIMO-IOT的整体开发正在设计过程中,后续开发好整理好资料,会在https://gitee.com/chenjimo我的码云进行开源,后续更新请持续关注!
    JIMO-IOT首页
    应用案例:基于ESP32&JIMO-IOT搭建的看门狗设备、基于JIMO-IOT的智能浇水开发、基于JIMO-IOT的智能晾衣架开发、JIMO-IOT通信控制测试Demo1;
    优化后的版本:JIMO-IOT针对部分案例的优化

    代码地址:#

    chenjimo/JIMO_IOT

    整体架构设计#

    信息
    设计思路:基于HTTP协议的(类MQTT)+Server+Web的开发。
    客户端向服务端进行订阅信息(定时心跳并汇报状态)、上传传感器数据(原数据)、并刷新服务端的指令要求!

    1.0的简化版本#

    信息
    先实现传感器数据的上传储存和页面展示、及简单的控制指令。
    实操接入Client硬件的案例:JIMO-IOT通信控制测试Demo1

    Mysql的数据结构#

    传感器信号的采集存储【device_log】#

    一个信号一个设备(传感器)ID、存储的原始值为String、一个精准的时间戳、一个备用的备注
    iddevice_idvaluetimebz
    1124.52023-11-15 23:55:32test

    传感器的信息(定死)【device_message】#

    传感器的name、归属模块module_id、检测类型type、检测单位unit、备注bz、
    阈值报警提示:最大值man、最小值min、
    idnamemodule_idtypeunitmanminbz
    1温度传感器1温度℃4010

    模块的信息(用户最小控制范围为模块)(定死)【module_message】#

    模块name、模块的状态status(30s中内有心跳为1、没有心跳1min为0、删除为-1)、
    模式设置mode(0为自动模式、1为智能模式、2为严格模式)、备注bz、
    idnamestatusmodebz
    1智能晾衣架模块01

    模块的心跳记录(大约30S会汇报一次)【module_log】#

    模块module_id、心跳时间戳、备注bz、
    idmodule_idtimebz
    112023-11-15 23:55:32test

    控制指令记录(用户选择规范指令)(定死)【oder_message】#

    指令名字、指令内容message、控制模块module_id、
    指令状态status(1可用、0禁用、-1已删除)、备注bz、
    idnamemessagemodule_idstatusbz
    1打开窗户OpenWindows11test

    控制记录(用户刷新指令,模块按顺序执行)【oder_log】#

    操作者ID、指令ID、模块ID、
    操作时间(用户输入时)、执行时间(模块刷新到时)、
    成功失败未响应撤回status(操作完回馈信息:1成功、2失败、0暂未向应、-1已撤销)、备注bz、
    iduser_idmodule_idwrite_timeread_timestatus(0)bz
    1112023-11-15 23:55:322023-11-15 23:56:021test

    用户信息【user_message】#

    用户ID、用户name、email、pwd、loginTime、sex、phone、备注bz、操作次数visit、
    权限等级(1可以看、2可操作、4可管理,同理3=1+2、5=1+4、7=1+2+4)
    idnamepwdemailpowerphoneloginTimesexvisitbz
    1JIMO1234561517962688@qq.com7138438194382023-11-15 23:55:32120Admin

    用户拥有的模块信息【user_module】#

    用户ID、模块ID、
    模块权限表示模块的操作限制(1可以看、2可操作、4可管理,同理3=1+2、5=1+4、7=1+2+4)、
    iduser_idmodule_idpower
    1117

    API规范#

    心跳时间测试时间:30S,正常运行设置为300S比较合适
    实时统计数据的刷新建议在:测试5S,正常运行20S
    传感器的数值上传间隔测试(硬件端):4S,正常运行设置为15S比较合适。
    指令请求设置(硬件端):10S左右比较合适,越小越准时但会浪费很多性能。

    传感器的数据上传#

    信息
    传感器数据上传:POST,ID、value、time、

    问题逻辑分析#

    对于模块的状态分析#

    信息
    我们在进行输入指令的时候,模块是智能状态和手动状态的激活方式,是在每几秒的命令获取中进行刷新自己的状态,是自动模式下和手动模式下都要进行智能检测进行判别,所以应该设置优先级!
    严格模式(手动设置)>手动模式>智能模式>自动模式。
    这里我们简化为,只有智能模式和全自动模式,意味着没有指令的情况下,模块自主决定行为。只要有指令就按计划执行指令。也就意味着在简化版本中mode为一个虚设的存在,不需要特定的去读取模式状态,来进行调整。后续可以在2.0版本中完善,对于不同模式下的用户操作限制以及模块的运行状态控制。在1.0版本中均做了扩展预留的预设。

    对于模块和对应用户的权限分析#

    信息
    理论上讲多个用户对应多个家庭和多个成员。意味着模块是有家庭的属性的但又不仅限一个人,安全考虑只有模块有不同用户的属性对应不同模块,不同的家庭成员对此安全考虑儿童保护应又具有操作权限的限制,所以添加了模块对于不同人的权限(定义原则根据模块自身的情况而定),对于不同用户的权限不同应该由家庭管理员进行设置。所以同家庭的模块对应不同的用户的最高权限即为家庭管理员。模块权限由模块接入时所对应自身的功能和属性决定!
    所以在展示指令的时候应该会用对应的所属权和权限进行匹配和限制操作。同时数据的展示和模块状态栏均应如此,但考虑到简化版中仅有一个用户和简单的测试用户的情况所以没有对家庭关系的权限和控制及展示做详细的逻辑处理,会在后续的2.0版本中完善这一项家庭的权限管理!在1.0版本中均做了扩展预留的预设。

    对于天气的提前感知#

    信息
    通过外界API自动预判定,进行一次操作指令,和数据存储。(可以依靠心跳函数进行激活对天气的数据刷新,再外加一个状态判定)

    对于执行指令执行时的执行状态判定#

    信息
    1、每次心跳函数同步刷新,执行单位的状态值,例如窗户是开是关、衣架是伸是缩、水位是高是低(这部分数据均是不需要加载那么勤的)
    2、单独在执行的时候进行一次逻辑判定(比较复杂且不准)
    3、或者硬件层面就可以自行进行判定,无需额外添加(待分析电路)。

    2.0的完全版本#

    信息
    2024-3-24开始!
    更多功能的完善和实现!经过最近四个月的使用和与硬件的对接中又遇到的缺陷进行了完善和优化!
    2024-4-6:目前只做到最新版本:JIMO-IOTV.3JIMO-IOT针对部分案例的优化
    后续更新开情况了!
    JIMO-IOT针对部分案例的优化
    APIFOX的接口文档,以及基础开发文档:
    JIMO-IOT
    JIMO-IOT开发文档 - 智能家居API

    一、再次开发拓展#

    1、遇到的问题整理#

    问题收集:::warning
    关于智能浇水:
    1、报警API的完善(数据报警和多个报警锁分开)。水量进行报警和记录报告提醒
    2、信息分割(展示数据的分割和处理)湿度数据的显示反转
    3、把模块分开!
    4、增添指令回馈的标识对应的展示!
    关于智能门窗:
    1、智能门窗的状态显示(三进制两位的理解)
    2、模式同步(1、2、3的处理)显示处理
    3、报警标识不同对应不同的标识和信息传递
    关于智能晾衣架:
    1、增添指令回馈的标识对应的展示!
    2、自动下发检测天气情况进行对应的处理(大于智能模式等操作权限)
    3、对应状态进行优化提醒的方式和内容
    4、相关衣架状态的展示和页面的处理
    :::

    2、优化设计思路#

    (1)关于传感器API的优化(报警锁互不干涉、根据不同情况设置不同的锁时长)
    (2)关于报警API的思路优化(专用的API通过过滤传感器的数据刷新实现特殊报警并记录)
    (3)关于网页数据展示的优化(分页处理、平均计算、传感数据的细节处理和单位)
    (3)关于不同模块的状态显示的优化(主要对传感器数据的标识进行处理限制时间范围和最新,同步绑定3、4模块的上线)
    (4)增设指令数据反馈的类型(3不需要浇水、4水不足“报警”、5状态无需改变)
    (5)智能控制的实现自动命令(自动定时”未来“天气的感知,对有效模块状态检测下加状态的综合判断下执行)

    3、实现功能优化#

    API优化
    页面后端优化
    页面显示优化
    细节功能优化

    二、实现操作#

    (1)API的优化#

    1、数据上传报警锁锁优化#

    intervalById.get(deviceLog.getDeviceId())代替localDateTime做冷却时间的登记即可!

    2、报警内容优化#

    用switch进行分别处理。
    对于ID:1、5、8、9、11、12、14、15、16、17不需要做报警判断的处理!
    ID4:由土壤湿度的过于干燥,需要浇水时没有水在进行报警处理!
    ID13:特殊的报警信息增添,跟据参数信息以及模式状态进行提示出错!Bz写入具体问题信息!属于关键信息所以冷却时间较短!
    ID14:需要根据雨滴情况结合模式状态以及关于晾衣架的状态的情况进行智能报警!提醒收回衣服,或者默默记录不需要提醒!
    其他则默认default报警处理!并封装了统一的报警通用方法!
    image.png

    3、最终变动#

    image.png

    4、测试与补充#

    注意:
    1、Integer.getInteger()和Integer.parseInt()的区分运用,建议后者!
    2、baseMapper.selectOne(Wrappers.<DeviceLog>lambdaQuery() .eq(DeviceLog::getDeviceId, 16).ge(DeviceLog::getTime, now.minusMinutes(3)).orderByDesc(DeviceLog::getTime).last("LIMIT 1")),避免输出多个值一定要加上.last("LIMIT 1")!

    (2)页面后端优化#

    1、信息按时间分页处理数据以及平均时间段进行输出#

    下发的指令进行分开数据显示处理(通过特殊处理使数据分开显示,前端页面做一些分开和限制显示即可)
    传感器的数据进行分页(默认的显示最近一天(小时平均),通过按钮显示最近一月(天平均),和从一开始的数据显示(按月平均))

    2、处理新的指令回馈优化#

    对于模块二增设不同的定义:3-不需要浇水、4-水不够(需要进行提示水量不足)。
    对于模块三:需要增设5状态无需改变!
    通过再写入时进行备注进行区分,前端改一下信息加一个备注即可!

    3、优化心跳函数的同步问题#

    (3)页面显示优化#

    1、模块之间的内容显示切换以及状态值的刷新与样式HTML;2、单位与数据的处理显示以及新的状态返回状况显示、3、一个综合显示台为首页信息展示的大数据展示!
    留给以后的优化> 参考:(关于这些炫酷的页面展示,我打算留给下一个本版本加入优化)
    echarts可视化大数据模板-门窗安防.zipecharts数据可视化模板-模块展示.zipecharts数据同步监控大盘模板-浇水.zipecharts物流云数据看板平台模板-登录页面.zip基于echarts大数据统计模板-晾衣架.zipapp智能家居首页模板.zip

    logo#

    (4)细节优化#

    1、关于页面的显示以及状态展示的合理化;#

    2、关于定时指令的处理和定时失败指令。#

    这里需要集成对于智能感知模块的控制实现,比如开启或关闭智能感知、和对应的感知功能的更新、以及对应的感知数据展示以及记录。
    因为此模块为虚拟模块与JIMO-IOT的运行共存,所以以上的功能均默认为开启状态!具体的优化细节留给后续根据需求再次扩展!
    这里暂时实现定时处理实物即可(定时处理长时间未响应的指令、获取未来天气根据状态情况自动下发指令、在前端上模拟显示在线提示)
    天气API:控制台 · 天气API、实时天气预报api 24小时天气预报接口 实时气象预警 空气质量预报;
    {
      "cityid": "101010100",
      "date": "2024-04-04",
      "week": "星期四",
      "update_time": "15:10",
      "city": "北京",
      "cityEn": "beijing",
      "country": "中国",
      "countryEn": "China",
      "wea": "多云",
      "wea_img": "yun",
      "tem": "16.4",
      "tem1": "18",
      "tem2": "7",
      "win": "东南风",
      "win_speed": "2级",
      "win_meter": "5km/h",
      "humidity": "38%",
      "visibility": "11km",
      "pressure": "1016",
      "air": "73",
      "air_pm25": "73",
      "air_level": "良",
      "air_tips": "各类人群可多参加户外活动,多呼吸一下清新的空气。",
      "alarm": {
        "alarm_type": "",
        "alarm_level": "",
        "alarm_title": "",
        "alarm_content": ""
      },
      "rain_pcpn": "0",
      "uvIndex": "5",
      "uvDescription": "中等",
      "wea_day": "多云",
      "wea_day_img": "yun",
      "wea_night": "多云",
      "wea_night_img": "yun",
      "sunrise": "05:53",
      "sunset": "18:41",
      "hours": [
        {
          "hours": "14:00",
          "wea": "晴",
          "wea_img": "qing",
          "tem": "14",
          "win": "南风",
          "win_speed": "3级",
          "vis": "16.9",
          "aqinum": "76",
          "aqi": "良"
        },
        {
          "hours": "15:00",
          "wea": "晴",
          "wea_img": "qing",
          "tem": "14",
          "win": "南风",
          "win_speed": "3级",
          "vis": "27.04",
          "aqinum": "44",
          "aqi": "优"
        },
        {
          "hours": "16:00",
          "wea": "晴",
          "wea_img": "qing",
          "tem": "14",
          "win": "东南风",
          "win_speed": "3级",
          "vis": "27.04",
          "aqinum": "44",
          "aqi": "优"
        },
        {
          "hours": "17:00",
          "wea": "多云",
          "wea_img": "yun",
          "tem": "14",
          "win": "东南风",
          "win_speed": "4级",
          "vis": "27.04",
          "aqinum": "44",
          "aqi": "优"
        },
        {
          "hours": "18:00",
          "wea": "晴",
          "wea_img": "qing",
          "tem": "13",
          "win": "东南风",
          "win_speed": "4级",
          "vis": "27.04",
          "aqinum": "44",
          "aqi": "优"
        },
        {
          "hours": "19:00",
          "wea": "多云",
          "wea_img": "yun",
          "tem": "11",
          "win": "东南风",
          "win_speed": "4级",
          "vis": "27.04",
          "aqinum": "44",
          "aqi": "优"
        },
        {
          "hours": "20:00",
          "wea": "晴",
          "wea_img": "qing",
          "tem": "10",
          "win": "东南风",
          "win_speed": "3级",
          "vis": "27.04",
          "aqinum": "44",
          "aqi": "优"
        },
        {
          "hours": "21:00",
          "wea": "晴",
          "wea_img": "qing",
          "tem": "9",
          "win": "东南风",
          "win_speed": "2级",
          "vis": "27.04",
          "aqinum": "45",
          "aqi": "优"
            },
            {
                "hours": "22:00",
                "wea": "小雨",
                "wea_img": "yu",
                "tem": "8",
                "win": "东南风",
                "win_speed": "2级",
                "vis": "27.04",
                "aqinum": "47",
                "aqi": "优"
            },
            {
                "hours": "23:00",
                "wea": "小雨",
                "wea_img": "yu",
                "tem": "6",
                "win": "东南风",
                "win_speed": "2级",
                "vis": "27.04",
                "aqinum": "50",
                "aqi": "优"
            },
            {
                "hours": "00:00",
                "wea": "多云",
                "wea_img": "yun",
                "tem": "6",
                "win": "东南风",
                "win_speed": "2级",
                "vis": "27.04",
                "aqinum": "51",
                "aqi": "良"
            },
            {
                "hours": "01:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "5",
                "win": "东南风",
                "win_speed": "2级",
                "vis": "27.04",
                "aqinum": "52",
                "aqi": "良"
            },
            {
                "hours": "02:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "5",
                "win": "东南风",
                "win_speed": "2级",
                "vis": "27.04",
                "aqinum": "55",
                "aqi": "良"
            },
            {
                "hours": "03:00",
                "wea": "多云",
                "wea_img": "yun",
                "tem": "4",
                "win": "东风",
                "win_speed": "1级",
                "vis": "27.04",
                "aqinum": "56",
                "aqi": "良"
            },
            {
                "hours": "04:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "4",
                "win": "东风",
                "win_speed": "1级",
                "vis": "22.53",
                "aqinum": "58",
                "aqi": "良"
            },
            {
                "hours": "05:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "3",
                "win": "东北风",
                "win_speed": "1级",
                "vis": "19.31",
                "aqinum": "61",
                "aqi": "良"
            },
            {
                "hours": "06:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "4",
                "win": "东北风",
                "win_speed": "1级",
                "vis": "16.9",
                "aqinum": "63",
                "aqi": "良"
            },
            {
                "hours": "07:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "5",
                "win": "东北风",
                "win_speed": "1级",
                "vis": "15.02",
                "aqinum": "66",
                "aqi": "良"
            },
            {
                "hours": "08:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "6",
                "win": "东北风",
                "win_speed": "1级",
                "vis": "13.52",
                "aqinum": "68",
                "aqi": "良"
            },
            {
                "hours": "09:00",
                "wea": "多云",
                "wea_img": "yun",
                "tem": "9",
                "win": "东北风",
                "win_speed": "1级",
                "vis": "12.88",
                "aqinum": "70",
                "aqi": "良"
            },
            {
                "hours": "10:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "11",
                "win": "东北风",
                "win_speed": "1级",
                "vis": "12.29",
                "aqinum": "71",
                "aqi": "良"
            },
            {
                "hours": "11:00",
                "wea": "多云",
                "wea_img": "yun",
                "tem": "14",
                "win": "东北风",
                "win_speed": "1级",
                "vis": "11.76",
                "aqinum": "72",
                "aqi": "良"
            },
            {
                "hours": "12:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "16",
                "win": "东南风",
                "win_speed": "1级",
                "vis": "11.76",
                "aqinum": "72",
                "aqi": "良"
            },
            {
                "hours": "13:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "18",
                "win": "南风",
                "win_speed": "1级",
                "vis": "11.27",
                "aqinum": "73",
                "aqi": "良"
            },
            {
                "hours": "14:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "20",
                "win": "西南风",
                "win_speed": "2级",
                "vis": "10.82",
                "aqinum": "75",
                "aqi": "良"
            },
            {
                "hours": "15:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "20",
                "win": "西南风",
                "win_speed": "2级",
                "vis": "10.82",
                "aqinum": "75",
                "aqi": "良"
            },
            {
                "hours": "16:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "21",
                "win": "西南风",
                "win_speed": "2级",
                "vis": "10.82",
                "aqinum": "75",
                "aqi": "良"
            },
            {
                "hours": "17:00",
                "wea": "晴",
                "wea_img": "qing",
                "tem": "21",
                "win": "西南风",
                "win_speed": "3级",
                "vis": "10.4",
                "aqinum": "76",
                "aqi": "良"
            }
        ],
        "aqi": {
            "update_time": "14:01",
            "air": "76",
            "air_level": "良",
            "air_tips": "各类人群可多参加户外活动,多呼吸一下清新的空气。",
            "pm25": "46",
            "pm25_desc": "良",
            "pm10": "101",
            "pm10_desc": "轻度污染",
            "o3": "57",
            "o3_desc": "",
            "no2": "30",
            "no2_desc": "",
            "so2": "9",
            "so2_desc": "",
            "co": "0.6",
            "co_desc": "",
            "kouzhao": "不用佩戴口罩",
            "yundong": "适宜运动",
            "waichu": "适宜外出",
            "kaichuang": "适宜开窗",
            "jinghuaqi": "不需要打开"
        },
        "zhishu": {
            "chuanyi": {
                "level": "较冷",
                "tips": "建议着厚外套加毛衣等服装。"
            },
            "daisan": {
                "level": "不带伞",
                "tips": "天气较好,不用带雨伞。"
            },
            "ganmao": {
                "level": "易发",
                "tips": "易发生感冒,体弱人群注意防护。"
            },
            "chenlian": {
                "level": "较适宜",
                "tips": "请选择避风的地点晨练,避免迎风锻炼。"
            },
            "ziwaixian": {
                "level": "强",
                "tips": "涂擦SPF大于15、PA+防晒护肤品。"
            },
            "liangshai": {
                "level": "适宜",
                "tips": "天气不错,抓紧时机让衣物晒太阳吧。"
            },
            "kaiche": {
                "level": "",
                "tips": ""
            },
            "xiche": {
                "level": "较不宜",
                "tips": "风力较大,洗车后会蒙上灰尘。"
            },
            "lvyou": {
                "level": "适宜",
                "tips": "风稍大,但仍可尽情地享受大自然风光。"
            },
            "diaoyu": {
                "level": "较适宜",
                "tips": "风稍大会对垂钓产生一定影响。"
            }
        }
    }
    思路:获取到对应的天气信息,应该对于实时信息和未来信息进行区分。实时信息用于对于环境要求直接进行响应!
    1、对于智能晾衣架仅考虑是否下雨当前和未来三个小时内进行定时或者及时收衣服!然后根据情况如果有天气预警则优先级大于下雨情况并需要向用户汇报!
    2、对于智能门窗(安防)模块,需要先获取天气信息,实时信息不需要考虑,仅考虑极端天气的预警信息,然后根据模块的模式状态进行区分处理,看情况是否需要提醒用户!
    对应的控制细节,这里控制的开关在数据库中存在!并可以单独控制和查看历史记录!
    注意字符串的空处理:alarm.getAlarm_type() != null && !alarm.getAlarm_type().isEmpty() && alarm.getAlarm_level() != null && !alarm.getAlarm_level().isEmpty()

    3、设备的在线时长#

    (见上方图片)

    4、异常数据的展示罗列出来(限制最新的10条)!#

    image.png

    5、优化响应速度#

    优化引入JS、CSS等,将图片PNG转化为更小的JPG。优化后总的快了3~8倍速!
    image.png

    6、对于用户过滤的安全限制登录优化#

    这里暂时针对一个简单的注册和登录验证,必须是通过已经注册的用户或IP进行使用。
    其他的会记录访客记录IP等后才可访问,但是访客不可一下发指令和改变一些参数信息!只可以看页面!
    修改于 2024-04-06 07:04:46
    下一页
    上传传感器的数据
    Built with