Skip to content
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
品牌标识

AIRIOT智慧系统搭建平台经验交流

K

kzz

@kzz
关于
帖子
主题
群组
粉丝
关注

帖子

最新 最佳 有争议的

  • core v4.4.183内存泄漏,有发现吗
    K kzz

    ws-data也更新了

    image.png


  • core v4.4.183内存泄漏,有发现吗
    K kzz

    新版本还是有内存泄漏,会导致平台重启。有发现吗。

    image.png
    f3178544-709a-4b17-8878-d6cc239d33b5-image.png646fb92c-215c-415c-bca4-b55ab3076c4a-image.png


  • flow-engine v4.14.8更新之后会因为缺少文件夹报错
    K kzz

    flow-engine v4.14.8更新之后会因为缺少文件夹报错错,我手动解决了,但这需要反馈一下。
    "ZoneInfo": "/app/configs/zoneinfo.zip"
    }
    �time=2026-06-30T17:01:23.938+08:00 level=INFO msg="服务启动: 运行模式=release,版本号=v4.14.8,进程号=1" tag=main logType=syslog service=flow-engine
    1INFO msg=watcher's ctx cancel : context canceled
    �redis: 2026/06/30 17:01:23 redis.go:478: auto mode fallback: maintnotifications disabled due to handshake error: ERR unknown subcommand 'maint_notifications'. Try CLIENT HELP.
    �time=2026-06-30T17:01:23.941+08:00 level=INFO msg="创建etcd连接: {Endpoints:[etcd:2379] DialTimeout:10 Username:root Password:dell123 AutoSyncInterval:0s}"
    >DEBUG msg=config loaded: /airiot/config/pro.json format: json
    &DEBUG msg=config loaded: format:
    'DEBUG msg=config loaded: PATH format:
    +DEBUG msg=config loaded: HOSTNAME format:
    6DEBUG msg=config loaded: Service.ExecTimeout format:
    0DEBUG msg=config loaded: ETCD.PASSWORD format:
    <DEBUG msg=config loaded: production_etcd__password format:
    4DEBUG msg=config loaded: AIRIOT_CIPHER_KEY format:
    0DEBUG msg=config loaded: App.Log.Level format:
    'DEBUG msg=config loaded: HOME format:
    +DEBUG msg=config loaded: ZONEINFO format:
    1INFO msg=watcher's ctx cancel : context canceled
    1INFO msg=watcher's ctx cancel : context canceled
    mtime=2026-06-30T17:01:24.087+08:00 level=INFO msg="MQTT 已经连接" logType=syslog service=flow-engine
    {time=2026-06-30T17:01:24.088+08:00 level=INFO msg="关闭部门redis publish检查" logType=syslog service=flow-engine
    utime=2026-06-30T17:01:24.088+08:00 level=DEBUG msg="task停止: 退出注册" logType=syslog service=flow-engine
    ttime=2026-06-30T17:01:24.088+08:00 level=DEBUG msg="task停止: Watch停止" logType=syslog service=flow-engine
    �time=2026-06-30T17:01:24.089+08:00 level=ERROR msg=服务启动失败 tag=main logType=syslog service=flow-engine detail="lstat /app/configs/locale: no such file or directory"

    5ef18c67-f3a0-4a03-9270-ad270a986cdc-image.png

    创建临时容器
    docker create --name fe-tmp airiot/flow-engine:v4.14.8
    创建目标目录(使用确认后的正确路径)
    mkdir -p /root/app/airiot/flow-engine/configs
    提取配置
    docker cp fe-tmp:/app/configs/. /root/app/airiot/flow-engine/configs/
    清理临时容器
    docker rm fe-tmp
    创建 locale 目录
    mkdir -p /root/app/airiot/flow-engine/configs/locale
    从已有的 i18n 目录复制语言包
    cp /root/app/airiot/i18n/*.yaml /root/app/airiot/flow-engine/configs/locale/
    验证文件是否复制成功
    ls -la /root/app/airiot/flow-engine/configs/locale/


  • core v4.4.183内存泄漏,有发现吗
    K kzz

    700601f1-5865-49bd-9668-944d3cdaefb6-image.png

    core 进程占用 25.5~25.9 GB 后被系统强制杀掉
    5429a87f-983b-45e6-9693-3d1cca21d757-image.png
    会持续增长
    0d713f39-7513-4289-9940-848d2acd2623-image.png


  • 平台数据库 table_record 是什么表
    K kzz

    好的,拿到了,谢谢


  • 平台数据库 table_record 是什么表
    K kzz

    ok,( https://qa.airiot.tech/topic/2689/可视化数据源中-对报警表做-恢复时间为空-判断时-页面报错/6?_=1777449744652 ),
    上次那个components模块能再发我一下吗


  • 平台数据库 table_record 是什么表
    K kzz

    我尝试从 table_record 删了一个表的数据,好像没什么影响


  • 平台数据库 table_record 是什么表
    K kzz

    准确来说所有表记录都在,但是设备表记录数量是正常。

    image.png
    设备表记录数量是正常。

    只有表记录同步表,好像每次同步都会留下记录痕迹。
    e0b57f45-b0cd-4c2b-ac39-0af32118bf5b-image.png
    7c9282c7-7510-492c-ac0a-f2aecebb07a2-image.png
    cbb4032e-9842-4d1c-962e-aea217ee9dde-image.png


  • 平台数据库 table_record 是什么表
    K kzz

    @核桃酥 ,看出来了,都是表记录同步表,都是不断从数据库源获取的数据,好像每次同步都会留下记录痕迹。

    image.png

    image.png


  • 平台数据库 table_record 是什么表
    K kzz

    平台数据库 table_record 是什么表。占用空间越来越多,能清理吗。
    de325eb4-1c79-4175-9cca-58410b1a0959-image.png


  • 可视化数据源中,对报警表做 恢复时间为空 判断时,页面报错。
    K kzz

    我这个components模块已经是最新的了吧

    image.png082b9513-e3e5-41a5-9b82-7a38838bd831-image.png


  • 设备表驱动。 db-driver,不能根据设备id关联数据点的值
    K kzz

    @Zhang书书 ok,确实是这样


  • 可视化数据源中,对报警表做 恢复时间为空 判断时,页面报错。
    K kzz

    请求:
    d92ca238-6113-4c85-870d-7341b454fc44-image.png 2b5bab65-f903-4fc4-b38f-1ae075438120-image.png

    分组随便选,汇总个数。
    c3cb141c-1884-49da-8deb-b5d10d1e015c-image.png 5fa40f95-eb11-4e26-999d-61d3dcd5bd7a-image.png 5c7933f8-7970-4ae0-a82c-8de9d2a9b938-image.png

    版本:
    a311888e-563b-444f-bc58-b7cac365c7e7-image.png 0750e39d-0e51-44d9-bf74-770fe0ba1655-image.png 92c8036b-7ae9-4c6e-b3bb-864db9a5fc94-image.png


  • 设备表驱动。 db-driver,不能根据设备id关联数据点的值
    K kzz

    @Zhang书书 只能远程

    kale邀请您进行远程控制
    ToDesk设备代码:988 014 971
    临时密码:gjp9jtj8
    点击链接直接进行远程控制:
    https://wechat.todesk.com/invite-page?id=hJQ9Rvsw7heBSTkkn-ejF


  • 可视化数据源中,对报警表做 恢复时间为空 判断时,页面报错。
    K kzz

    可视化,数据源中对报警表做 恢复时间为空 判断时,页面报错。
    sql语句报错

    0563199f-1a6b-4cca-a75f-2faefd5e7e06-image.png
    2943a00b-e7a4-48c3-92a5-39760df0c8ae-image.png


  • 设备表驱动。 db-driver,不能根据设备id关联数据点的值
    K kzz

    这样的

    image.png

    image.png


  • 设备表驱动。 db-driver,不能根据设备id关联数据点的值
    K kzz

    设备表驱动。
    db-driver数据库驱动,不能自动根据设备id去过滤值
    我在驱动配置里面设置了对的id字段

    ae3d81d7-1398-4045-a543-6ee4f77ce54f-image.png
    61c3a0c7-5d2c-4f4f-8fc3-456ba58c349e-image.png
    点位
    b47de385-dcac-49f6-8388-578865fbac79-image.png

    配置好对应设备编号
    5fd9b54c-0d3d-4ab8-b6f6-913b26099b67-image.png

    D1308设备下的数据点值,没有和设备编号有关联。
    0b42a520-5400-4876-91a9-9f07026e6558-image.png
    12af7b96-b26b-485e-ad21-d55d0986e7b4-image.png

    驱动版本
    66e7d650-5596-411b-b9ec-90b12bb1b57c-image.png


  • 【记录一下】获取报警时长计算
    K kzz

    这个帖子是笔记,防止我自己忘记。
    我的项目是6488246bd7c5cfb28a4405c1,如果你能看懂就可以操作,
    如果看不懂,请在他人协助下完成以下操作。

    获取报警恢复耗时计算。
    报警恢复时间/时长统计。报警持续时间统计。

    这是说明:
    
    一个报警事件 = 从异常开始,到异常恢复的整个连续过程
    
    无论中间触发多少次提醒,只要属于同一异常持续过程,就只算 一次报警。
    
    查询通过以下规则进行“报警压缩”:
    
    按 ruleid + desc + table + tableData 分组
    
    如果时间间隔未超过 1.2 × interval,则认为仍属于同一次报警
    
    如果前一条已恢复,则视为新报警
    
    超过 1.2 × interval,则视为新报警
    

    方法一:直接运行sql语句查询报警数据表。
    直接查询报警数据表,查询出每次报警恢复耗时。

    /* ============================================================
       报警压缩 + 自动计算恢复时间 + 计算恢复时长(单位:秒)
    
       逻辑说明:
       1. 按 ruleid + desc + table + tableData 分组
       2. 判断是否为新报警段:
            - 第一条数据
            - 前一条已经物理恢复
            - 时间间隔 > 1.2 × interval(interval 单位:秒)
       3. 通过窗口累计求和生成分段ID
       4. 每段聚合出:
            - 报警开始时间 start_time
            - 报警结束时间 end_time
            - 记录条数 alarm_count
       5. 计算最终恢复时间
       6. 计算恢复持续时长(秒)
    
       注意:
       interval 字段单位为 秒
       ============================================================ */
    
    WITH base AS (
    
        /* ========================================================
           取同组内上一条报警时间和恢复时间
           ======================================================== */
        SELECT *,
            LAG("time") OVER (
                PARTITION BY ruleid, "desc", "table", "tableData"
                ORDER BY "time"
            ) AS prev_time,
    
            LAG("recoveryTime") OVER (
                PARTITION BY ruleid, "desc", "table", "tableData"
                ORDER BY "time"
            ) AS prev_recovery
    
        FROM "6488246bd7c5cfb28a4405c1".warning
    ),
    
    /* ============================================================
       判断是否为新报警段
       ============================================================ */
    mark AS (
        SELECT *,
    
            CASE
                WHEN prev_time IS NULL THEN 1
    
                WHEN prev_recovery IS NOT NULL
                     AND prev_recovery <= "time"
                     THEN 1
    
                WHEN EXTRACT(EPOCH FROM ("time" - prev_time))
                     > ("interval" * 1.2)
                     THEN 1
    
                ELSE 0
            END AS is_new_group
    
        FROM base
    ),
    
    /* ============================================================
       生成报警分段ID
       ============================================================ */
    grp AS (
        SELECT *,
            SUM(is_new_group) OVER (
                PARTITION BY ruleid, "desc", "table", "tableData"
                ORDER BY "time"
            ) AS grp_id
        FROM mark
    ),
    
    /* ============================================================
       按分段ID进行聚合
       ============================================================ */
    agg AS (
        SELECT
            ruleid,
            "desc",
            "table",
            "tableData",
            grp_id,
    
            MIN("time") AS start_time,
            MAX("time") AS end_time,
    
            /* 段内最大恢复时间 */
            MAX("recoveryTime") AS max_recovery,
    
            COUNT(*) AS alarm_count
    
        FROM grp
        GROUP BY
            ruleid, "desc", "table", "tableData", grp_id
    ),
    
    /* ============================================================
       计算最终恢复时间
       ============================================================ */
    final_result AS (
        SELECT
            ruleid,
            "desc",
            "table",
            "tableData",
            grp_id,
            start_time,
            end_time,
            alarm_count,
    
            /* 有恢复时间就用恢复时间,否则用 end_time */
            COALESCE(max_recovery, end_time) AS final_recovery_time
    
        FROM agg
    )
    
    /* ============================================================
       最终输出
       ============================================================ */
    SELECT
        ruleid,
        "desc",
        "table",
        "tableData",
        grp_id,
    
        start_time,
        end_time,
        alarm_count,
    
        final_recovery_time,
    
        /* 恢复持续时长(单位:秒) */
        CAST(
            EXTRACT(EPOCH FROM (final_recovery_time - start_time))
        AS BIGINT) AS recovery_seconds
    
    FROM final_result
    
    ORDER BY
        ruleid,
        "desc",
        "table",
        "tableData",
        start_time;
    

    方法二、
    如果报警数据归档了,又想查询全部报警数据,需要创建两个视图来实现。
    方法二第一步:

    /* 创建全部报警数据视图 */
    CREATE OR REPLACE VIEW "6488246bd7c5cfb28a4405c1".warning_all AS
    
    SELECT
        id::text                     AS id,
        level,
        uid,
        type,
        status,
        processed,
        "desc",
        audio,
        interval,
        ruleid,
        remark,
        "table",
        "tableData",
        fields,
        "recoveryFields",
        "time",
        "recoveryTime",
        "confirmTime",
        "handleTime",
        other,
        "warnTag",
        "timesOfPlay",
        handle,
        alert,
        "handleUser",
        "confirmUser",
        "warnMode",
        "broadcastContent",
        "broadcastVoice",
        "audioAlert",
        "i18nProp"
    FROM "6488246bd7c5cfb28a4405c1".warning
    
    UNION ALL
    
    SELECT
        id::text                     AS id,
        level,
        uid,
        type,
        status,
        processed,
        "desc",
        audio,
        interval,
        ruleid,
        remark,
        "table",
        "tableData",
        fields,
        "recoveryFields",
        "time",
        "recoveryTime",
        "confirmTime",
        "handleTime",
        other,
        "warnTag",
        "timesOfPlay",
        handle,
        alert,
        "handleUser",
        "confirmUser",
        "warnMode",
        "broadcastContent",
        "broadcastVoice",
        "audioAlert",
        "i18nProp"
    FROM "6488246bd7c5cfb28a4405c1".warning_archive;
    

    方法二第二步:

    /* 创建报警恢复时间统计视图 */
    CREATE OR REPLACE VIEW "6488246bd7c5cfb28a4405c1".warning_recovery_view AS
    
    WITH base AS (
        /* ========================================================
           取同组内上一条报警时间和恢复时间
           LAG() 返回当前行的前一条数据
           ======================================================== */
        SELECT *,
            LAG("time") OVER (
                PARTITION BY ruleid, "desc", "table", "tableData"
                ORDER BY "time"
            ) AS prev_time,
    
            LAG("recoveryTime") OVER (
                PARTITION BY ruleid, "desc", "table", "tableData"
                ORDER BY "time"
            ) AS prev_recovery
    
        FROM "6488246bd7c5cfb28a4405c1".warning_all
    ),
    
    mark AS (
        /* ========================================================
           判断是否为新报警段
           is_new_group = 1 表示当前记录是新报警段起始
           ======================================================== */
        SELECT *,
            CASE
                /* 第一条记录必定是新段 */
                WHEN prev_time IS NULL THEN 1
    
                /* 前一条已恢复,并且恢复时间早于当前报警时间 */
                WHEN prev_recovery IS NOT NULL
                     AND prev_recovery <= "time"
                     THEN 1
    
                /* 与上一条时间间隔超过 1.2 × interval */
                WHEN EXTRACT(EPOCH FROM ("time" - prev_time))
                     > ("interval" * 1.2)
                     THEN 1
    
                /* 否则属于同一报警段 */
                ELSE 0
            END AS is_new_group
        FROM base
    ),
    
    grp AS (
        /* ========================================================
           生成报警分段ID
           SUM(is_new_group) 累加,得到 grp_id,表示连续报警段
           ======================================================== */
        SELECT *,
            SUM(is_new_group) OVER (
                PARTITION BY ruleid, "desc", "table", "tableData"
                ORDER BY "time"
            ) AS grp_id
        FROM mark
    ),
    
    agg AS (
        /* ========================================================
           按分段ID聚合报警信息
           ======================================================== */
        SELECT
            ruleid,
            "desc",
            "table",
            "tableData",
            grp_id,
    
            /* 本段报警起始时间 */
            MIN("time") AS start_time,
    
            /* 本段报警最后触发时间 */
            MAX("time") AS end_time,
    
            /* 段内最大恢复时间,可能为批量确认 */
            MAX("recoveryTime") AS max_recovery,
    
            /* 本段记录条数 */
            COUNT(*) AS alarm_count
    
        FROM grp
        GROUP BY
            ruleid, "desc", "table", "tableData", grp_id
    )
    
    SELECT
        ruleid,
        "desc",
        "table",
        "tableData",
        grp_id,
    
        start_time,        -- 报警开始时间
        end_time,          -- 报警最后触发时间
        alarm_count,       -- 本段记录条数
    
        /* ========================================================
           最终恢复时间:
           - 有恢复时间使用 max_recovery
           - 无恢复时间(单条或多条)使用 end_time
           ======================================================== */
        COALESCE(max_recovery, end_time) AS final_recovery_time,
    
        /* ========================================================
           恢复持续时长(秒)
           final_recovery_time - start_time
           ======================================================== */
        CAST(
            EXTRACT(EPOCH FROM (COALESCE(max_recovery, end_time) - start_time))
        AS BIGINT) AS recovery_seconds
    
    FROM agg
    
    ORDER BY
        ruleid,
        "desc",
        "table",
        "tableData",
        start_time;
    

  • 角色管理里面,数据表记录权限取消不掉
    K kzz

    @核桃酥 在 角色管理里面,数据表记录权限取消不掉 中说:

    有外网地址吗?@kzz

    没有,只能远程。
    我的识别码:1610391542
    m183cr
    使用向日葵即可对我发起远程协助
    向日葵下载地址:http://url.oray.com/tGJdas/


  • 角色管理里面,数据表记录权限取消不掉
    K kzz

    @核桃酥 在 角色管理里面,数据表记录权限取消不掉 中说:

    你是在表记录选择里面,取消选中的一个表记录,点击确认,然后点击外层的保存后,在编辑这个角色,刚刚取消的那个选中状态 又变成选择了吗?

    是这样的,而且相关用户登录之后,确实还能看到表记录。

  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组