『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 2209|回复: 9

[进阶教程] 【南京-江宁公交】nodered 官方接口,一劳永逸

[复制链接]

40

主题

2166

帖子

8178

积分

元老级技术达人

积分
8178
金钱
5997
HASS币
110
发表于 2022-12-1 13:21:36 | 显示全部楼层 |阅读模式
敬告:本帖本着“授人以鱼不如授人以渔”的思想,只给出关键点,具体自己实现


众所周知江宁不属于南京
包括医保、就学、社保都是独立于南京市的
当然还有公交

之前一直是小电驴+开车解决通勤问题
然鹅媳妇不会停那种升降车位,选择公交地铁通勤
在昨日大降温 中午苦等半小时才来车后,提出了需求:想知道车啥时候到
地铁有运行线路图,基本上可以卡点
公交不行,受影响太多,所以要搞数据

当然 第一时间想到的就是上论坛搜,以前有印象看到过公交信息的帖子
然后就只有北京的、车来了的(车来了很奇怪,小程序可以搜到,但是论坛帖子里给的地址就没有我所在的地区)
然后就自己搞呗

一搜:江宁有官方的查询方式http://www.jnptzh.net/JnWeiXinWeb/jnBusWeb.jsp#businfo
虽然微信里直接访问就可以查,但是每次还要点点点,本着所有数据归集到HA的原则:
NR获取数据,HA搞界面显示

录制_2022_12_01_11_40_31_436.gif

教程开始:
1、数据获取
访问http://www.jnptzh.net/JnWeiXinWeb/jnBusWeb.jsp#businfo,选线路、选方向、然后F12,根据图片找到报文
1.png

然后切换到【标头】那里,红色部分是我们需要的
2.png

2、NR里创建请求
3.png
如图,根据上面F12获取的信息,创建请求头,然后向目的地址请求
返回数据后进行解析,然后创建HA实体
2.1 设置请求头,对应上面F12界面里的【请求标头】
4.png
2.2 设置请求地址,对应上面F12界面里的【请求网址】
5.png
2.3 返回数据处理,这里主要就是删除多余字符,然后分割字符串,再替换,保留前3条有用信息,如果没有信息那就说“暂时无法获取”
6.png

3、HA里显示
考虑到
这里用到了custom:button-card和custom:state-switch,这两个第三方卡片,在HACS里搜索安装即可
自带的用到了vertical-stack、horizontal-stack、markdown这三种卡片
实现了去程和返程切换显示以及开启、关闭刷新功能(节省人家服务器资源,每分钟刷新数据才有意义,但是有点过分)
配置比较麻烦,贴上源码自己理解学习一下
type: vertical-stack
cards:
  - type: horizontal-stack
    cards:
      - type: custom:button-card
        color_type: card
        entity: switch.businfo_switch
        name: 公交信息切换
        state:
          - value: 'on'
            color: rgb(52, 168, 83)
            icon: mdi:home-account
            name: "回家"
          - value: 'off'
            color: rgb(66, 133, 244)
            icon: mdi:domain
            name: "去公司"
        styles:
          card:
            - height: 80px
            - width: 120px
        tap_action:
          action: toggle    

      - type: custom:button-card
        color_type: card
        entity: switch.businfo_update_switch
        name: 刷新开关
        layout: icon_label
        label: >
          [[[
            return states['sensor.businfo_uptime'].state;
          ]]]
        show_label: true
        show_name: false
        state:
          - value: 'on'
            icon: mdi:timer-sync-outline
            name: "刷新中"
          - value: 'off'
            icon: mdi:timer-remove-outline
            name: "停止刷新"
        styles:
          card:
            - height: 80px


  - type: custom:state-switch
    entity: switch.businfo_switch
    default: 'on'
    transition: flip-x
    transition_time: 500
    states:
      "on":
        type: markdown
        content: >-            
          ## <font color=#34a853>义乌 </font>站    
                
          <ha-icon icon="mdi:bus"></ha-icon><font size=5 color=#34a853>829</font> <font
          size=3 color=#ea4335> {{            
          states('sensor.829lu_yi_wu_wu_yi_lu_zhou')}}</font>    
                
          - {{ state_attr('sensor.829lu_yi_wu_wu_yi_lu_zhou','next_bus_info')}}    
                
          - {{ state_attr('sensor.829lu_yi_wu_wu_yi_lu_zhou','next_bus_info2')}}    
                
           <ha-icon icon="mdi:bus"></ha-icon><font size=5 color=#34a853>851</font> <font size=3 color=#ea4335> {{
          states('sensor.851lu_yi_wu_wu_yi_lu_zhou')}}</font>    
                
          - {{ state_attr('sensor.851lu_yi_wu_wu_yi_lu_zhou','next_bus_info')}}    
                
          - {{ state_attr('sensor.851lu_yi_wu_wu_yi_lu_zhou','next_bus_info2')}}        
      "off":
        type: markdown
        content: >-            
          ## <font color=#4285f4>武夷绿洲 </font>站    
                
          <ha-icon icon="mdi:bus"></ha-icon><font size=5 color=#4285f4>829</font> <font
          size=3 color=#ea4335> {{            
          states('sensor.829lu_wu_yi_lu_zhou_yi_wu')}}</font>    
                
          - {{ state_attr('sensor.829lu_wu_yi_lu_zhou_yi_wu','next_bus_info')}}    
                
          - {{ state_attr('sensor.829lu_wu_yi_lu_zhou_yi_wu','next_bus_info2')}}    
                
           <ha-icon icon="mdi:bus"></ha-icon><font size=5 color=#4285f4>851</font> <font size=3 color=#ea4335> {{
          states('sensor.851lu_wu_yi_lu_zhou_yi_wu')}}</font>    
                
          - {{ state_attr('sensor.851lu_wu_yi_lu_zhou_yi_wu','next_bus_info')}}    
                
          - {{ state_attr('sensor.851lu_wu_yi_lu_zhou_yi_wu','next_bus_info2')}}

评分

参与人数 1金钱 +20 HASS币 +20 收起 理由
+ 20 + 20 高手,这是高手!

查看全部评分

回复

使用道具 举报

10

主题

1282

帖子

4049

积分

论坛元老

Rank: 8Rank: 8

积分
4049
金钱
2767
HASS币
0
发表于 2022-12-1 17:03:26 | 显示全部楼层
厉害,大大的厉害
回复

使用道具 举报

46

主题

1594

帖子

6442

积分

论坛元老

Rank: 8Rank: 8

积分
6442
金钱
4838
HASS币
40
发表于 2022-12-1 18:12:53 | 显示全部楼层
请问有nr流吗学习一下
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

40

主题

2166

帖子

8178

积分

元老级技术达人

积分
8178
金钱
5997
HASS币
110
 楼主| 发表于 2022-12-1 18:48:28 | 显示全部楼层
jjcs 发表于 2022-12-1 18:12
请问有nr流吗学习一下

图片里都有了
那个地方不懂?
回复

使用道具 举报

46

主题

1594

帖子

6442

积分

论坛元老

Rank: 8Rank: 8

积分
6442
金钱
4838
HASS币
40
发表于 2022-12-1 19:07:33 | 显示全部楼层
ghostist 发表于 2022-12-1 18:48
图片里都有了
那个地方不懂?

其实我主要想学习一下你的函数,这些东西
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

0

主题

2

帖子

96

积分

注册会员

Rank: 2

积分
96
金钱
94
HASS币
0
发表于 2022-12-1 20:57:55 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

40

主题

2166

帖子

8178

积分

元老级技术达人

积分
8178
金钱
5997
HASS币
110
 楼主| 发表于 2022-12-2 08:44:27 | 显示全部楼层
jjcs 发表于 2022-12-1 19:07
其实我主要想学习一下你的函数,这些东西

设置请求头的函数
msg.headers = {
    'Host': 'www.jnptzh.net',
    'X-Requested-With': 'XMLHttpRequest',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
    'Accept': 'text/plain, */*; q=0.01',
    'Origin': 'http://www.jnptzh.net',
    'Content-Length': '0',
    'Connection': 'keep-alive',
    'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.30(0x18001e30) NetType/WIFI Language/zh_TW',
    'Referer': 'http://www.jnptzh.net/JnWeiXinWeb/jnBusWeb.jsp',
    'Cookie': 'JSESSIONID=47791F4BC976672A28303FE2AE15B973; BMAP_SECKEY=iIGp5DCKUPHx2SOjRsucE_ua0i3b9jR3t6Oj9Wg9OjugEH9al6SAjMACNcLc0EmVsp4fLbczzoMFbe3C6c9GuXcr-aLj_fdTCBDJWlnW_Vor22qygAlcjKFTySGzNz2X3vFKOy3RxJsdjnd4NCUjFZ9eVSRfUPLPN9In8foPdAk; SECKEY_ABVK=X+B4vQ/Jg8ItZSiJGJ2dTyi7nNsArPAHk8Z1Wyazqts%3D'
}
return msg;



数据处理的那个:
var str = msg.payload;
var msg1 = {};
msg1.payload = {};

var str1 = str.replaceAll("<img src='images/mybus.png' class='ui-li-icon ui-corner-none' height='26' width='26' />", "");
str = str1.replaceAll("<span style='font-size:13px;color:red'>", "");
str1 = str.replaceAll("<span style='font-size:13px;color:blue'>", "");
str = str1.replaceAll("</span>", "");
str1 = str.replaceAll("<span style='font-size:18px;color:blue'>", "");
str = str1.replaceAll("<span style='font-size:18px;color:red'>", "");
str1 = str.replaceAll("<li>", "");
str = str1.split("</li>");
msg1.payload = str;

var payload0 = msg1.payload[0];
var payload1 = msg1.payload[1];
var payload2 = msg1.payload[2];
if ((payload0 == "") || (payload0 == null))
    msg1.payload[0] = "暂时无法获取";
if ((payload1 == "") || (payload1 == null))
    msg1.payload[1] = "暂时无法获取";
if ((payload2 == "") || (payload2 == null))
    msg1.payload[2] = "暂时无法获取";
return msg1;

某个请求返回的payload:
"<li><img src='images/mybus.png' class='ui-li-icon ui-corner-none' height='26' width='26' /><span style='font-size:13px;color:red'>苏A00035F</span>距本站<span style='font-size:18px;color:red'>1</span>站<span style='font-size:13px;color:blue'>,约500.00米</span></li><li><img src='images/mybus.png' class='ui-li-icon ui-corner-none' height='26' width='26' /><span style='font-size:13px;color:red'>苏A01919F</span>距本站<span style='font-size:18px;color:red'>7</span>站<span style='font-size:13px;color:blue'>,约3.30公里</span></li><li><img src='images/mybus.png' class='ui-li-icon ui-corner-none' height='26' width='26' /><span style='font-size:13px;color:red'>苏A08871F</span>距本站<span style='font-size:18px;color:red'>8</span>站<span style='font-size:13px;color:blue'>,约4.03公里</span></li>"


回复

使用道具 举报

46

主题

1594

帖子

6442

积分

论坛元老

Rank: 8Rank: 8

积分
6442
金钱
4838
HASS币
40
发表于 2022-12-3 19:31:46 | 显示全部楼层
ghostist 发表于 2022-12-2 08:44
设置请求头的函数

感谢,不过为啥我的卡片没办法切换
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

40

主题

2166

帖子

8178

积分

元老级技术达人

积分
8178
金钱
5997
HASS币
110
 楼主| 发表于 2022-12-3 20:26:07 | 显示全部楼层
jjcs 发表于 2022-12-3 19:31
感谢,不过为啥我的卡片没办法切换

利用的是botton card,还有nr里额外创建的实体
回复

使用道具 举报

1

主题

71

帖子

304

积分

中级会员

Rank: 3Rank: 3

积分
304
金钱
233
HASS币
0
发表于 2024-8-2 18:36:42 来自手机 | 显示全部楼层
找了半天 就是这个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-9-21 11:23 , Processed in 0.138676 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表