This commit is contained in:
2025-08-02 12:09:34 +08:00
commit e70b01cdca
2785 changed files with 575579 additions and 0 deletions

View File

@@ -0,0 +1,14 @@
# 前言
- 知乎
- https://www.zhihu.com/people/XMedia2015
# 相关软件
>有什么关于 Apple TV 的用后体验及软件意见分享? - 殇小辛的回答 - 知乎
- https://www.zhihu.com/question/572608645/answer/3167083336
>在大陆使用 Apple TV 有什么建议?
- https://www.zhihu.com/question/59459394/answer/2933247325
1. infuse
2. Fileball
3. B站miao/cheers
4. 看电视台节目的AppAPTV、iSTB Lite、iSTB、iPlay TV、TV+
5. 阿里云盘播放器iiVA和Alplayer

View File

@@ -0,0 +1,41 @@
# 前言
- Aqara M2刷固件M2需要拆机M1S 4.0固件之后也不支持Telnet开启
- 利用Aqara Gateway集成将Aqara网关(M1s,P3,E1)接入HA:https://post.smzdm.com/p/agqnrkpw/
- AqaraGateway:https://github.com/niceboygithub/AqaraGateway
- Aqara M2 网关开启Telnet集成到Home Assistant:https://sspai.com/post/86223
- M2 2022 POE版本开启Telnet: https://github.com/niceboygithub/AqaraCameraHubfw/blob/main/modified/M2PoE/telnet.md
- [[#M2 2022 Telnet]]
- ***万物皆可HA教你把各种智能设备接入Home Assistant 图文教程***:https://www.bilibili.com/opus/770959033731383298
# Aqara HomeKit反接到HA
https://post.smzdm.com/p/awz3kgrg/
1. Aqara接入一次Homekit之后在IOS家庭App中选中网关点击网关之后选择从"家庭"中移除桥接设备。在家庭APP中可以打开配对模式 31141937533
2. 重新启动一下Aqara网关。
3. 之后就可以HA中找到Aqara网关的HomeKit设备连接提示了。
| https://bbs.hassbian.com/thread-24044-1-1.html |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| _本帖最后由 longtor 于 2024-5-22 05:38 编辑_ <br> <br><br>Aqara  m2网关反向接入homeassistant 一个网关同时接入 Aqara、苹果家庭、HA <br><br>总体思路先接Aqara APP、苹果家庭APPhomekit再删除homekit然后接入ha最后从ha接回homekitha自带的hassbridge接入到苹果家庭<br><br>1、Aqara APP添加网关M2<br>2、苹果家庭APP<br>1加入网关M2。<br>2删除家庭设置 - 家居中枢与桥接 - 删除 Aqara Hub M2<br><br>3、homeassistant<br>1集成 里面,自动弹出新集成。配置。<br>2填写网关上面homekit的ID码提交。<br>3在 新增设备选项中填写 区域,或取消,接入成功。<br>4Homekit Bridge生成二维码。<br><br>4、苹果家庭 APP扫二维码新增 网桥homekit 设备 出现。 |
| |
# M2 2022 Telnet
Aqara M2网关接HA教程
如果你正在寻找如何将Aqara M2 POE网关接入Home Assistant那么你来对地方了这里有一个详细的教程专门针对M2 POE版本型号ZHWG19LM。通过以下步骤你可以轻松地将你的网关接入Home Assistant。
**准备工作** 🛠️
首先你需要准备一个U盘并格式化。注意格式化必须为FAT32分区必须为MBR。如果后续网关降级失败可以从这两点入手。
下载降级文件 📥
从GitHub的AqaraCameraHubfw项目中下载两个降级文件并将它们放入U盘。
**正式步骤** 📋
断电并插入U盘拔掉M2的电源线断电然后将U盘插上。
按住按钮并通电按住前面的小按钮同时插上电源线通电。当小灯变成淡紫色时松开按钮。等待一会儿M2会完成降级并重启灯会变成正常的颜色。成功后M2就降级为了一个很老的版本并开启了telnet。
**连接telnet**
使用telnet连上M2账号为root没有密码直接回车。然后执行三条命令来进行更新用的是AqaraCameraHubfw中修改过的固件。看了下基本是跟官方同步的版本。后续不要用aqara home进行更新需要更新的话就连上telnet使用这个命令进行更新。执行更新命令的时候可能需要网关所在的网络有科学上网环境。如果执行第三个命令的时候后输出找不到文件或目录那就是第二个命令没有成功下载到文件。我们将/tmp/curl -s -k -L -o....中的-s删掉不让他静默执行就可以看到报错信息输出可通过这个查找问题原因。执行完这三个命令后输入reboot对网关进行重启然后再次连上telnet执行那三个命令然后reboot重启非常重要一定要这样执行两次。这时候我们进aqara home查看版本信息会看到已经是最新的版本了。
**关闭自动更新** 🚫
接下来关闭自动更新固件的指令,防止网关自动更新。
**接入Home Assistant** 🏠
这时候M2网关已经完成了固件的刷入并开启了telnet然后我们在hacs中的Repository中输入aqara gateway的项目地址并安装。安装完成重启ha然后我们就能把网关接入ha了。

View File

@@ -0,0 +1,3 @@
- 这是一个简单的连接器,用于通过 MQTT 公开 HDMI-CEC 适配器 https://hub.docker.com/r/tobiasha/hdmi-cec
- Raspberry Pi 运行 hdmi-cec-rest 的 Docker 映像 https://github.com/blakeblackshear/rpi-hdmi-cec-rest
- https://github.com/hsbiti/docker-hdmi-cec-rest

View File

@@ -0,0 +1,62 @@
# 前言
- 和风天气heweather HomeAssistant插件使用说明 https://www.bilibili.com/opus/687775477026259015
- HomeAssistant 和风天气插件的自动化分享 https://www.bilibili.com/read/cv18078640/
# 和风天气 Token
afdc8b37975043888ad47943ff25b980
# HA
在configuration.yaml中添加
```YAML
template:
- trigger:
- platform: time_pattern
hours: "*"
action:
- service: weather.get_forecasts
data:
type: hourly
target:
entity_id: weather.he_feng_tian_qi
response_variable: hourly
sensor:
- name: "小时天气预警"
unique_id: weather_forecast_hourly
state: >
{% if hourly['weather.he_feng_tian_qi'].forecast[0].condition in ('sunny','cloudy','partlycloudy','windy') %}
off
{% else %}
on
{% endif %}
attributes:
states: >
{% if hourly['weather.he_feng_tian_qi'].forecast[0].condition in ('sunny','cloudy','partlycloudy','windy') %}
未来一小时,天气{{ hourly['weather.he_feng_tian_qi'].forecast[0].text }},没有降雨
{% else %}
接下来一小时会有{{ hourly['weather.he_feng_tian_qi'].forecast[0].text }},降水概率为 {{ hourly['weather.he_feng_tian_qi'].forecast[0].precipitation_probability }}%
{% endif %}
```
## 自动化
对应的自动化:
```yaml
alias: 一小时天气预警
description: ""
triggers:
- entity_id:
- sensor.xiao_shi_tian_qi_yu_jing
trigger: state
actions:
- device_id: 384bea520a0ee825ecb63fb71d19b2a1
domain: mobile_app
type: notify
message: "注意注意! 接下来的天气为{{state_attr('sensor.xiao_shi_tian_qi_yu_jing','states')}} "
title: 天气预警
- action: notify.send_message
metadata: {}
data:
message: "[\"注意注意! {{state_attr('sensor.xiao_shi_tian_qi_yu_jing','states')}}\"]"
target:
entity_id: notify.xiaomi_cn_799945688_l06a_play_text_a_5_1
initial_state: true
```

View File

@@ -0,0 +1,11 @@
# 安装
Docker模式下安装
https://blog.csdn.net/weixin_44379605/article/details/127784744
```c++
docker run -d -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red
```
# 创建令牌
点击用户->"安全"选项卡->创建长期令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjMWZlYjYzYmZjMzk0MDU3YjE1MTFhN2IyZTQzODYwZCIsImlhdCI6MTczODY2MjgzMiwiZXhwIjoyMDU0MDIyODMyfQ.P8nUFoxJFPst_CpJHvShag7sMk6yvG841Kv0hL_tPdU

View File

@@ -0,0 +1 @@
https://zhuanlan.zhihu.com/p/352298928

View File

@@ -0,0 +1,271 @@
科沃斯IDECJ3FLME
# fix HA不出现实体的问题
- https://bbs.hassbian.com/thread-27784-1-1.html
- https://bbs.hassbian.com/thread-28408-1-1.html
1. 进入容器的CMD
2. cd /usr/local/lib/python3.13/site-packages/deebot_client/hardware/deebot
3. ln -svfT lr4qcs.py 3sp2in.py
删除 rm -rf 3sp2in.py
- https://mitmproxy.org/
- 【mitmproxy抓包工具 从安装到简单使用】 https://www.bilibili.com/video/BV1UC4y1t7EL/?share_source=copy_web&vd_source=fe8142e8e12816535feaeabd6f6cdc8e
- IOS使用MitmProxy
- https://www.jianshu.com/p/498073a8971f
- https://hachibye.medium.com/%E4%BB%A5mitmproxy%E7%8D%B2%E5%8F%96%E6%89%8B%E6%A9%9F%E6%95%B8%E6%93%9A%E5%B0%81%E5%8C%85-9870f6507b63
https://github.com/DeebotUniverse/client.py/issues/492
```
<redacted>
```
# In HA my X5 Pro did'nt accept cleaning commands (rcp not support error)
# Command Json
Start
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=6btMpMAS6PhZrX3D&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
{"body":{"data":{"act":"start","content":{"type":"auto"}}},"header":{"channel":"iOS","reqid":"RIzVHS","ts":"1741248430546","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
Pause
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=EKptJpQmzpbr4rKF&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
{"body":{"data":{"act":"pause"}},"header":{"channel":"iOS","reqid":"yepkRW","ts":"1741248436662","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
Resume
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=6hYStayiak272hKX&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
{"body":{"data":{"act":"resume"}},"header":{"channel":"iOS","reqid":"nYtIgx","ts":"1741248438194","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
Stop
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=kSFXbynehrfkNWEK&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
{"body":{"data":{"act":"stop"}},"header":{"channel":"iOS","reqid":"EiLUjr","ts":"1741248516782","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
AI Clean Start
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=trfmKfcdAKwWaRim&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
{"body":{"data":{"act":"start","content":{"type":"entrust"}}},"header":{"channel":"iOS","reqid":"pSKuSb","ts":"1741249424264","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
Charge
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=JC4G5mYJnMHaA6mR&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=charge&fmt=j
{"body":{"data":{"act":"go"}},"header":{"channel":"iOS","reqid":"GDJHxj","ts":"1741249495751","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
This is a single room vacuum only:
https://api-ngiot.dc-cn.cn.ecouser.net/api/iot/endpoint/control?si=NM7kXnJYG2mszmwY&ct=q&eid=9b7f3e00-3bea-4354-9ba8-b0dc9ceb6e0e&et=3sp2in&er=96uOLWSM&apn=clean_V2&fmt=j
{"body":{"data":{"act":"start","content":{"type":"freeClean","value":"1,0"}}},"header":{"channel":"iOS","reqid":"MMTIad","ts":"1741249568936","ver":"0.0.50","m":"request","pri":1,"tzm":480,"tzc":"Asia\/Shanghai"}}
# Add Deebot X5 Pro Omni 提交
相关的Git提交
https://github.com/DeebotUniverse/client.py/pull/659/commits/da52c671ce544c21b6753b380148f93f8dadc6e5#diff-a5514fb587b325f41e547af3e94ae3470a2366bef25dd8b5ae5842fc25328bc0
- lr4qcs.py:p1jij8.py
- p1jij8.py
## p1jij8.py
```c++
"""Deebot T20 Omni Capabilities."""
from __future__ import annotations
from deebot_client.capabilities import (
Capabilities,
CapabilityClean,
CapabilityCleanAction,
CapabilityCustomCommand,
CapabilityEvent,
CapabilityExecute,
CapabilityLifeSpan,
CapabilityMap,
CapabilitySet,
CapabilitySetEnable,
CapabilitySettings,
CapabilitySetTypes,
CapabilityStats,
CapabilityWater,
DeviceType,
)
from deebot_client.commands.json.advanced_mode import GetAdvancedMode, SetAdvancedMode
from deebot_client.commands.json.battery import GetBattery
from deebot_client.commands.json.carpet import (
GetCarpetAutoFanBoost,
SetCarpetAutoFanBoost,
)
from deebot_client.commands.json.charge import Charge
from deebot_client.commands.json.charge_state import GetChargeState
from deebot_client.commands.json.clean import Clean, CleanArea, GetCleanInfo
from deebot_client.commands.json.clean_count import GetCleanCount, SetCleanCount
from deebot_client.commands.json.clean_logs import GetCleanLogs
from deebot_client.commands.json.clean_preference import (
GetCleanPreference,
SetCleanPreference,
)
from deebot_client.commands.json.continuous_cleaning import (
GetContinuousCleaning,
SetContinuousCleaning,
)
from deebot_client.commands.json.custom import CustomCommand
from deebot_client.commands.json.error import GetError
from deebot_client.commands.json.fan_speed import GetFanSpeed, SetFanSpeed
from deebot_client.commands.json.life_span import GetLifeSpan, ResetLifeSpan
from deebot_client.commands.json.map import (
GetCachedMapInfo,
GetMajorMap,
GetMapTrace,
GetMinorMap,
)
from deebot_client.commands.json.multimap_state import (
GetMultimapState,
SetMultimapState,
)
from deebot_client.commands.json.network import GetNetInfo
from deebot_client.commands.json.play_sound import PlaySound
from deebot_client.commands.json.pos import GetPos
from deebot_client.commands.json.relocation import SetRelocationState
from deebot_client.commands.json.stats import GetStats, GetTotalStats
from deebot_client.commands.json.true_detect import GetTrueDetect, SetTrueDetect
from deebot_client.commands.json.volume import GetVolume, SetVolume
from deebot_client.commands.json.water_info import GetWaterInfo, SetWaterInfo
from deebot_client.commands.json.work_mode import GetWorkMode, SetWorkMode
from deebot_client.const import DataType
from deebot_client.events import (
AdvancedModeEvent,
AvailabilityEvent,
BatteryEvent,
CachedMapInfoEvent,
CarpetAutoFanBoostEvent,
CleanCountEvent,
CleanLogEvent,
CleanPreferenceEvent,
ContinuousCleaningEvent,
CustomCommandEvent,
ErrorEvent,
FanSpeedEvent,
FanSpeedLevel,
LifeSpan,
LifeSpanEvent,
MajorMapEvent,
MapChangedEvent,
MapTraceEvent,
MultimapStateEvent,
NetworkInfoEvent,
PositionsEvent,
ReportStatsEvent,
RoomsEvent,
StateEvent,
StatsEvent,
TotalStatsEvent,
TrueDetectEvent,
VolumeEvent,
WorkMode,
WorkModeEvent,
water_info,
)
from deebot_client.models import StaticDeviceInfo
from deebot_client.util import short_name
from . import DEVICES
DEVICES[short_name(__name__)] = StaticDeviceInfo(
DataType.JSON,
Capabilities(
device_type=DeviceType.VACUUM,
availability=CapabilityEvent(
AvailabilityEvent, [GetBattery(is_available_check=True)]
),
battery=CapabilityEvent(BatteryEvent, [GetBattery()]),
charge=CapabilityExecute(Charge),
clean=CapabilityClean(
action=CapabilityCleanAction(command=Clean, area=CleanArea),
continuous=CapabilitySetEnable(
ContinuousCleaningEvent,
[GetContinuousCleaning()],
SetContinuousCleaning,
),
count=CapabilitySet(CleanCountEvent, [GetCleanCount()], SetCleanCount),
log=CapabilityEvent(CleanLogEvent, [GetCleanLogs()]),
preference=CapabilitySetEnable(
CleanPreferenceEvent, [GetCleanPreference()], SetCleanPreference
),
work_mode=CapabilitySetTypes(
event=WorkModeEvent,
get=[GetWorkMode()],
set=SetWorkMode,
types=(
WorkMode.MOP,
WorkMode.MOP_AFTER_VACUUM,
WorkMode.VACUUM,
WorkMode.VACUUM_AND_MOP,
),
),
),
custom=CapabilityCustomCommand(
event=CustomCommandEvent, get=[], set=CustomCommand
),
error=CapabilityEvent(ErrorEvent, [GetError()]),
fan_speed=CapabilitySetTypes(
event=FanSpeedEvent,
get=[GetFanSpeed()],
set=SetFanSpeed,
types=(
FanSpeedLevel.QUIET,
FanSpeedLevel.NORMAL,
FanSpeedLevel.MAX,
FanSpeedLevel.MAX_PLUS,
),
),
life_span=CapabilityLifeSpan(
types=(LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH),
event=LifeSpanEvent,
get=[GetLifeSpan([LifeSpan.BRUSH, LifeSpan.FILTER, LifeSpan.SIDE_BRUSH])],
reset=ResetLifeSpan,
),
map=CapabilityMap(
cached_info=CapabilityEvent(CachedMapInfoEvent, [GetCachedMapInfo()]),
changed=CapabilityEvent(MapChangedEvent, []),
major=CapabilityEvent(MajorMapEvent, [GetMajorMap()]),
minor=CapabilityExecute(GetMinorMap),
multi_state=CapabilitySetEnable(
MultimapStateEvent, [GetMultimapState()], SetMultimapState
),
position=CapabilityEvent(PositionsEvent, [GetPos()]),
relocation=CapabilityExecute(SetRelocationState),
rooms=CapabilityEvent(RoomsEvent, [GetCachedMapInfo()]),
trace=CapabilityEvent(MapTraceEvent, [GetMapTrace()]),
),
network=CapabilityEvent(NetworkInfoEvent, [GetNetInfo()]),
play_sound=CapabilityExecute(PlaySound),
settings=CapabilitySettings(
advanced_mode=CapabilitySetEnable(
AdvancedModeEvent, [GetAdvancedMode()], SetAdvancedMode
),
carpet_auto_fan_boost=CapabilitySetEnable(
CarpetAutoFanBoostEvent,
[GetCarpetAutoFanBoost()],
SetCarpetAutoFanBoost,
),
true_detect=CapabilitySetEnable(
TrueDetectEvent, [GetTrueDetect()], SetTrueDetect
),
volume=CapabilitySet(VolumeEvent, [GetVolume()], SetVolume),
),
state=CapabilityEvent(StateEvent, [GetChargeState(), GetCleanInfo()]),
stats=CapabilityStats(
clean=CapabilityEvent(StatsEvent, [GetStats()]),
report=CapabilityEvent(ReportStatsEvent, []),
total=CapabilityEvent(TotalStatsEvent, [GetTotalStats()]),
),
water=CapabilityWater(
amount=CapabilitySetTypes(
event=water_info.WaterAmountEvent,
get=[GetWaterInfo()],
set=SetWaterInfo,
types=(
water_info.WaterAmount.LOW,
water_info.WaterAmount.MEDIUM,
water_info.WaterAmount.HIGH,
water_info.WaterAmount.ULTRAHIGH,
),
),
mop_attached=CapabilityEvent(water_info.MopAttachedEvent, [GetWaterInfo()]),
),
),
)
```