ZHA Coordinator 如何控制不同scene的Light,
灯有几种scene,协调器如何控制灯在不同的scene之间切换?
协调器 zstack home 1.2.2 CC2538
YiKai Chen:
透過 zclGeneral_SendSceneRecall
user5367314:
回复 YiKai Chen:
1.灯是买的成品的,zclGeneral_SendSceneRecall的参数groupID和 sceneID是从哪里获取的?
2.协调器控制灯,是一个协调器控制多个灯,应该是广播的形式发送指令吧?
YiKai Chen:
回复 user5367314:
1. 可以是你從协调器透過zclGeneral_SendSceneStore設置過去的
2. 應該說是group cast但也可歸類成广播的形式
user5367314:
回复 YiKai Chen:
按照我的理解相同的灯应该是加入相同的组里,
相同的灯在初次入网的时候都加入相同的组,
协调器控制的时候直接按照组ID合场景ID去控制就可以了
不知理解的是否正确?
现在有个问题就是相同的灯怎么弄到同一个组里面?
不同的场景ID厂家提供 了(总共有1-6六个场景)
YiKai Chen:
回复 user5367314:
用zclGeneral_SendGroupAdd去設定组
user5367314:
回复 YiKai Chen:
ZLL的例程里有SampleBridge和SampleRemote,
1.我参考这个例程,作为协调器,参考哪个例程?SampleBridge还是SampleRemote?
2.关于组的添加例程里有按键添加和if ( events & SAMPLEREMOTE_SEND_GRP_ADD_EVT )方式添加,
不知事件方式添加是怎么添加的?节点入网的时候触发的事件还是?
Alvin Chen:
回复 user5367314:
建议你按键操作,你应该参考remote 那个例程,里面 recall 和Store 分别对应了等的call back。
YiKai Chen:
回复 user5367314:
1. zll沒有协调器,如果你是要參考如何設定组,你可以參考SampleRemote
2. 不知事件方式添加是怎么添加的?–>节点入网的时候触发的事件,在zllSampleRemote_ProcessTL
user5367314:
回复 YiKai Chen:
协调器去控制灯,协调器代码添加如下:
第一步:
if ( keys == GROUP_ADD_KEY ) { uint8 emptyGroupName[2] = {0}; if ( groupSelId == 0 ) { groupSelId = 1; } zclGeneral_SendGroupAdd( SAMPLEREMOTE_ENDPOINT, &zllSampleRemote_DstAddr, groupSelId, emptyGroupName, FALSE, sampleRemoteSeqNum++ ); }
第二步:
if ( keys == GROUP_1_SEL_KEY ) { zllSampleRemote_DstAddr.addr.shortAddr = 1; groupSelId = 1; zllSampleRemote_DstAddr.addrMode = (afAddrMode_t)AddrGroup;
zclGeneral_SendIdentify( SAMPLEREMOTE_ENDPOINT, &zllSampleRemote_DstAddr, SAMPLEREMOTE_CMD_IDENTIFY_TIME, FALSE, sampleRemoteSeqNum++ ); }
第三步:
if ( keys == SCENE_1_SEL_KEY ) { sceneSelId = 1; if ( ( RELEASE_KEY ) && ( !SCENE_RECALL_KEY ) ) { sceneKeyPressTime = osal_getClock(); } }
最后:
if ( keys == SCENE_STORE_KEY ) { if ( groupSelId == 0 ) { groupSelId = 1; } zclGeneral_SendSceneStore( SAMPLEREMOTE_ENDPOINT, &zllSampleRemote_DstAddr, groupSelId, sceneSelId, FALSE, sampleRemoteSeqNum++ ); }
if ( keys == SCENE_RECALL_KEY ) { if ( groupSelId == 0 ) { groupSelId = 1; } zclGeneral_SendSceneRecall( SAMPLEREMOTE_ENDPOINT, &zllSampleRemote_DstAddr, groupSelId, sceneSelId, FALSE, sampleRemoteSeqNum++ ); }
这个步骤对吗?另外请问SCENE_STORE和SCENE_RECALL是什么区别?
YiKai Chen:
回复 user5367314:
基本上看來步骤是对的,但是要注意 dstAddr內容是不是对的,SCENE_STORE是把目前的scene存起來和SCENE_RECALL是執行指定的scene