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

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

[流程系列] 自适应灯光方案分享

[复制链接]

3

主题

40

帖子

497

积分

中级会员

Rank: 3Rank: 3

积分
497
金钱
457
HASS币
0
发表于 2024-4-29 11:20:11 | 显示全部楼层 |阅读模式
本帖最后由 hungheo 于 2024-4-30 10:12 编辑

之前有用自动调光的插件:adaptive-lighting,感觉不太习惯,所以自己写了一个,记录分享下

实现效果:
白天:根据HA自带sun.sun实体中的太阳高度角数据,自动调节灯的色温亮度模拟太阳光色温亮度
晚上:太阳下山到9点之间,为活动时间,采取明亮色温亮度
晚上:9点到凌晨1点,根据总时长,灯的色温亮度等比例调整到最暗
调整频率:每5分钟自动调整一次

中间可以调整灯的预设模式打断(我用的是乐式的V2S,设备可以生成light和select两个实体)自动调光


用到的实体:
1、色温灯:light.************
2、色温灯预设模式:select.*********
3、太阳:sun.sun
4、HA新建辅助元素,input_number.max_number

其他:
每个地方,不同季节的最大高度角是不一样的,这里用前一天的最大高度角作为正午的高度角来设置


2个附件,1个是自动调光调色,1个是获取前一天的最大高度角

function如下:
//获取当前时间:小时和分钟数
const currentHour = new Date().getHours();
const currentMinute = new Date().getMinutes();
// 太阳是否在升起状态,当前高度角
const { rising: sunRising, elevation: nowSunHeight } = msg.sdata.attributes;
// 前一天最大高度角
const backSunHeight = parseFloat(msg.zdpayload).toFixed(2);
//前一天最大高度角和当前高度角对比,选用大者
const maxSunHeight = Math.max(nowSunHeight, backSunHeight);

//设置常量
const LIGHT_SETTING = {
    MAX_KELVIN: 6500,   //最大色温
    MID_KELVIN: 4600,   // 最亮色温
    MIN_KELVIN: 2700,   //最小色温
    MAX_BRIGHTNESS: 100,   //最大亮度
    MORNING_START_HEIGHT: -5,   //凌晨太阳升起高度角
    EVENING_END_HEIGHT: 5,  //傍晚太阳落下高度角
    DIMMING_START_TIME: 21,  //晚上开始调光时间
    DIMMING_END_TIME: 1  //凌晨结束调光时间
};

let targetKelvin, targetBrightness;

// 黎明到中午
if (nowSunHeight >= LIGHT_SETTING.MORNING_START_HEIGHT && sunRising) {
    const Ratio = (nowSunHeight - LIGHT_SETTING.MORNING_START_HEIGHT) / (maxSunHeight - LIGHT_SETTING.MORNING_START_HEIGHT);
    targetKelvin = Math.round(LIGHT_SETTING.MIN_KELVIN + (LIGHT_SETTING.MAX_KELVIN - LIGHT_SETTING.MIN_KELVIN) * Ratio);
    targetBrightness = Math.min(Math.round(LIGHT_SETTING.MAX_BRIGHTNESS * Ratio), LIGHT_SETTING.MAX_BRIGHTNESS);
    targetBrightness = Math.max(targetBrightness, 1);
} 
// 中午到傍晚
else if (nowSunHeight > LIGHT_SETTING.EVENING_END_HEIGHT && !sunRising) {
    const Ratio = 1 - (nowSunHeight - LIGHT_SETTING.EVENING_END_HEIGHT)/(maxSunHeight - LIGHT_SETTING.EVENING_END_HEIGHT);
    targetKelvin = Math.min(Math.round(LIGHT_SETTING.MID_KELVIN + (LIGHT_SETTING.MAX_KELVIN - LIGHT_SETTING.MID_KELVIN) * Ratio), LIGHT_SETTING.MAX_KELVIN);
    targetBrightness = 100;
} 
// 傍晚到晚上
else if (nowSunHeight < LIGHT_SETTING.EVENING_END_HEIGHT && !sunRising && currentHour < LIGHT_SETTING.DIMMING_START_TIME) {
    targetKelvin = LIGHT_SETTING.MID_KELVIN;
    targetBrightness = 100;
} 
// 晚上到深夜,横跨第二天
else if ((currentHour >= LIGHT_SETTING.DIMMING_START_TIME || currentHour < LIGHT_SETTING.DIMMING_END_TIME) && nowSunHeight <= LIGHT_SETTING.EVENING_END_HEIGHT) {
    const totalTimeMinutes = (24 + LIGHT_SETTING.DIMMING_END_TIME - LIGHT_SETTING.DIMMING_START_TIME) * 60;
    const currentTimeMinutes = ((currentHour - LIGHT_SETTING.DIMMING_START_TIME + 24) % 24) * 60 + currentMinute;
    const Ratio = 1 - currentTimeMinutes / totalTimeMinutes;
    targetKelvin = Math.round(LIGHT_SETTING.MIN_KELVIN + (LIGHT_SETTING.MID_KELVIN - LIGHT_SETTING.MIN_KELVIN) * Ratio);
    targetBrightness = Math.min(Math.round(LIGHT_SETTING.MAX_BRIGHTNESS * Ratio), LIGHT_SETTING.MAX_BRIGHTNESS);
    targetBrightness = Math.max(targetBrightness, 1);
} 
// 深夜到黎明
else {
    targetKelvin = LIGHT_SETTING.MIN_KELVIN;
    targetBrightness = 1;
}

msg.data = {
    Brightness: targetBrightness,
    Kelvin: targetKelvin
};

return msg;

flows.zip

2.72 KB, 下载次数: 0

售价: 1 金钱  [记录]  [购买]

获取前一天最大高度角.zip

1.56 KB, 下载次数: 0

回复

使用道具 举报

8

主题

172

帖子

1159

积分

金牌会员

Rank: 6Rank: 6

积分
1159
金钱
987
HASS币
0
发表于 2024-4-29 11:35:09 | 显示全部楼层
回复

使用道具 举报

8

主题

172

帖子

1159

积分

金牌会员

Rank: 6Rank: 6

积分
1159
金钱
987
HASS币
0
发表于 2024-4-29 11:36:50 | 显示全部楼层
adaptive-lighting 集成
集成
回复

使用道具 举报

3

主题

40

帖子

497

积分

中级会员

Rank: 3Rank: 3

积分
497
金钱
457
HASS币
0
 楼主| 发表于 2024-4-29 11:58:15 | 显示全部楼层
hhh. 发表于 2024-4-29 11:35
adaptive-lighting 集成
https://github.com/basnijholt/adaptive-lighting#readme

用过,不习惯
回复

使用道具 举报

1

主题

24

帖子

212

积分

中级会员

Rank: 3Rank: 3

积分
212
金钱
188
HASS币
0
发表于 2024-4-29 12:37:56 | 显示全部楼层
我自己也写了一个。是采集家里温度和光照来改变色温的。
回复

使用道具 举报

1

主题

24

帖子

212

积分

中级会员

Rank: 3Rank: 3

积分
212
金钱
188
HASS币
0
发表于 2024-4-29 12:39:25 | 显示全部楼层
[
    {
        "id": "af54bc4aac4eaa99",
        "type": "switch",
        "z": "524fd291281a4058",
        "name": "",
        "property": "payload",
        "propertyType": "msg",
        "rules": [
            {
                "t": "eq",
                "v": "on",
                "vt": "str"
            },
            {
                "t": "eq",
                "v": "off",
                "vt": "str"
            }
        ],
        "checkall": "true",
        "repair": false,
        "outputs": 2,
        "x": 270,
        "y": 260,
        "wires": [
            [
                "c0e5494756cea2b5"
            ],
            [
                "29707c1bf4ae40fc"
            ]
        ]
    },
    {
        "id": "1572bcf5589e7b06",
        "type": "server-state-changed",
        "z": "524fd291281a4058",
        "name": "客厅存在",
        "server": "dc22e9ed00108105",
        "version": 5,
        "outputs": 1,
        "exposeAsEntityConfig": "",
        "entityId": "binary_sensor.unknown_still_target_2",
        "entityIdType": "exact",
        "outputInitially": false,
        "stateType": "str",
        "ifState": "",
        "ifStateType": "str",
        "ifStateOperator": "is",
        "outputOnlyOnStateChange": false,
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "ignorePrevStateNull": false,
        "ignorePrevStateUnknown": false,
        "ignorePrevStateUnavailable": false,
        "ignoreCurrentStateUnknown": false,
        "ignoreCurrentStateUnavailable": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "eventData"
            },
            {
                "property": "topic",
                "propertyType": "msg",
                "value": "",
                "valueType": "triggerId"
            }
        ],
        "x": 100,
        "y": 260,
        "wires": [
            [
                "af54bc4aac4eaa99"
            ]
        ]
    },
    {
        "id": "c0e5494756cea2b5",
        "type": "api-current-state",
        "z": "524fd291281a4058",
        "name": "室内光照度",
        "server": "dc22e9ed00108105",
        "version": 3,
        "outputs": 2,
        "halt_if": "10",
        "halt_if_type": "num",
        "halt_if_compare": "lte",
        "entity_id": "sensor.ke_ting_hong_wai_chuan_gan_qi_illuminance_lux",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 770,
        "y": 200,
        "wires": [
            [
                "3611ff9203772f2b"
            ],
            []
        ]
    },
    {
        "id": "3611ff9203772f2b",
        "type": "time-switch",
        "z": "524fd291281a4058",
        "name": "",
        "lat": "28.1821",
        "lon": "113.1055",
        "startTime": "09:00",
        "endTime": "22:00",
        "startOffset": 0,
        "endOffset": 0,
        "x": 950,
        "y": 200,
        "wires": [
            [
                "69bb695928bd5409"
            ],
            [
                "3e0d42523cb396b8"
            ]
        ]
    },
    {
        "id": "69bb695928bd5409",
        "type": "api-current-state",
        "z": "524fd291281a4058",
        "name": "温度",
        "server": "dc22e9ed00108105",
        "version": 3,
        "outputs": 1,
        "halt_if": "",
        "halt_if_type": "str",
        "halt_if_compare": "is",
        "entity_id": "sensor.cleargrass_dk1_a682_temperature_humidity_sensor",
        "state_type": "str",
        "blockInputOverrides": false,
        "outputProperties": [
            {
                "property": "payload",
                "propertyType": "msg",
                "value": "",
                "valueType": "entityState"
            },
            {
                "property": "data",
                "propertyType": "msg",
                "value": "",
                "valueType": "entity"
            }
        ],
        "for": "0",
        "forType": "num",
        "forUnits": "minutes",
        "override_topic": false,
        "state_location": "payload",
        "override_payload": "msg",
        "entity_location": "data",
        "override_data": "msg",
        "x": 1130,
        "y": 200,
        "wires": [
            [
                "7fd57fcab85ce752"
            ]
        ]
    },
    {
        "id": "7fd57fcab85ce752",
        "type": "range",
        "z": "524fd291281a4058",
        "minin": "10",
        "maxin": "30",
        "minout": "350",
        "maxout": "150",
        "action": "scale",
        "round": true,
        "property": "payload",
        "name": "",
        "x": 1280,
        "y": 200,
        "wires": [
            [
                "9acbb18f2ebabcf8"
            ]
        ]
    },
    {
        "id": "9acbb18f2ebabcf8",
        "type": "api-call-service",
        "z": "524fd291281a4058",
        "name": "客厅灯日常",
        "server": "dc22e9ed00108105",
        "version": 5,
        "debugenabled": false,
        "domain": "light",
        "service": "turn_on",
        "areaId": [],
        "deviceId": [],
        "entityId": [
            "light.tian_hua_deng_dai"
        ],
        "data": "{\t   \"brightness\": 255,\t    \"color_temp\": msg.payload\t}",
        "dataType": "jsonata",
        "mergeContext": "",
        "mustacheAltTags": false,
        "outputProperties": [],
        "queue": "none",
        "x": 1470,
        "y": 200,
        "wires": [
            [
                "bed30ea4c416280c"
            ]
        ]
    },
    {
        "id": "dc22e9ed00108105",
        "type": "server",
        "name": "Home Assistant",
        "version": 5,
        "addon": false,
        "rejectUnauthorizedCerts": true,
        "ha_boolean": "y|yes|true|on|home|open",
        "connectionDelay": true,
        "cacheJson": true,
        "heartbeat": false,
        "heartbeatInterval": "30",
        "areaSelector": "friendlyName",
        "deviceSelector": "friendlyName",
        "entitySelector": "friendlyName",
        "statusSeparator": "at: ",
        "statusYear": "hidden",
        "statusMonth": "short",
        "statusDay": "numeric",
        "statusHourCycle": "h23",
        "statusTimeFormat": "h:m",
        "enableGlobalContextStore": true
    }
]
回复

使用道具 举报

1

主题

97

帖子

569

积分

高级会员

Rank: 4

积分
569
金钱
472
HASS币
0
发表于 2024-4-29 15:56:41 | 显示全部楼层
感觉很强大
回复

使用道具 举报

30

主题

968

帖子

4385

积分

论坛元老

Rank: 8Rank: 8

积分
4385
金钱
3402
HASS币
90
发表于 2024-4-29 16:44:21 | 显示全部楼层
本帖最后由 relliky 于 2024-4-29 16:45 编辑

你说不习惯adaptive lighting,我的理解是你觉得有些你的需求它没有满足,你觉得自己上面写的办法有哪一个adaptive lightiing不能满足呢?
我家全屋智能的HA设置 https://github.com/relliky/Tais_Home_Assistant_Config
回复

使用道具 举报

110

主题

1621

帖子

5112

积分

元老级技术达人

积分
5112
金钱
3486
HASS币
30
发表于 2024-4-29 16:59:41 | 显示全部楼层
家里的筒灯,不知道有没有什么配件,能实现调光的,并且能接入ha的,最好是能刷esphome
回复

使用道具 举报

2

主题

368

帖子

2999

积分

金牌会员

Rank: 6Rank: 6

积分
2999
金钱
2631
HASS币
0
发表于 9 小时前 | 显示全部楼层
学习学习!!
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-15 20:27 , Processed in 0.058327 second(s), 35 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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