Page 1 of 1

C-API help

Posted: 05 Apr 2014 11:49
by maros
Hi,
I'm currently experimenting with the z-way C-API and somehow cannot manage to get any meaningful events. Since I'm a C-novice a little push into the right direction is very much appreciated :-) Basically I'm trying to get callbacks for key-push events from my z-wave.me FOB (deviceID=3,instance=0). I picked command class 45 (SceneController) and configured all group actions on the FOB to "send scenes".

Code: Select all

#include <stdio.h>
#include <ZWayLib.h>
#include <errno.h>
#include <signal.h>

typedef int bool;
enum { false, true };

volatile sig_atomic_t stop;

void dataChangeCallback(ZWay aZWay, ZWDataChangeType aType, ZDataHolder aData, void * apArg) {
    printf("Got callback\n");
}

void inthand(int signum) {
    stop = 1;
}

int main(int argc, char ** argv) {
      ZWay aZWay;
      ZWError result;
      int mDeviceId;

      memset(&aZWay, 0, sizeof(aZWay));
      result = zway_init(&aZWay, "/dev/ttyAMA0",
                "/opt/z-way-server/config",
                "/opt/z-way-server/translations",
                "/opt/z-way-server/ZDDX", stdout, Warning);

      if (result == NoError) {
           result = zway_start(aZWay,NULL);
           if (result == NoError) {
                printf("Discovering...\n");
                zway_data_acquire_lock(aZWay);
                for (mDeviceId = 0; mDeviceId <= 4; mDeviceId++) {
                    printf("Trying device %i",mDeviceId);
                    ZDataHolder dataHolder = zway_find_device_instance_cc_data(aZWay, mDeviceId, 0, 45, "");
                    if (dataHolder != NULL) {
                        zway_data_add_callback_ex(aZWay, dataHolder, &dataChangeCallback, TRUE, "");
                    } else {
                        printf("No data holder for deviceId=%i\n",mDeviceId);
                    }
                }
                zway_data_release_lock(aZWay);
                signal(SIGINT, inthand);
                while (!stop) pause();

                printf("Stopping ZWay...\n");
                result = zway_stop(aZWay);
           }
      }
      if (result != NoError) {
           printf("Error: %d\n", result);
      }
      zway_terminate(&aZWay);
      return 0;
 }
When i run this program and push some FOB-buttons i get the following output

Code: Select all

Discovering...
Trying device 0No data holder for deviceId=0
Trying device 1No data holder for deviceId=1
Trying device 2No data holder for deviceId=2
Trying device 3No data holder for deviceId=3
Trying device 4No data holder for deviceId=4
[2014-04-05 10:41:38.177] RECEIVED UNKNOWN PACKET TYPE: 0x00
[2014-04-05 10:41:38.188] RECEIVED UNKNOWN PACKET TYPE: 0x07
^CStopping ZWay...
[2014-04-05 10:41:42.908] SaveData will not save data since it wasn't loaded. This is to prevent data loss.
make: *** [run] Interrupt
Cheers
Maroš

Re: C-API help

Posted: 05 Apr 2014 17:16
by Vincentoo
Hi,

I have been doing some similar experiments with the C API. I posted a few examples (using binary sensors) on my blog at http://yetanotherdeveloperblog.blogspot.be/.
The key is to figure out the right arguments (device ID, instance number, command class and path). Best check the ZWay logs while generating these events. That will give you all the information you need.

V

Re: C-API help

Posted: 06 Apr 2014 09:13
by maros
Yes I know your blog and it has been a great help to understand how to create a callback (and also a big chunk of this program was copied from your blog). It would be great if you could publish some working examples at github. Mines are at https://github.com/maros/Homely/ (however at the current state this repo does not contain a single bit of z-wave code, but this should be added in the next couple of weeks)

I looked at the log as you recommended and it actually turned out that the events are called on the razberry (device=1) and the basic command class (32). Seems a little bit strange to me (especially the use of the generic command-class) but so be it.

Cheers
Maros

Re: C-API help

Posted: 14 Apr 2014 01:12
by PoltoS
SceneActivation CC is not supported by the Key Fob, but controlled. Don't mind what it means, but for you: it means it is not created until a command comes from the Fob. And this created Command Class (as not supported) was not saved. Now this was changed - we now save them too. This is changed in our developer tree and will become available in the next release.

Please check next changelog.

Re: C-API help

Posted: 14 Apr 2014 07:02
by pofs
zway_find_device_instance_cc_data() returns NULL because device tree is not rendered yet after zway_start().

You need to call zway_discover() after zway_start() to fetch controller information and devices list. Z-Way will load your saved device configuration only after successful discovery.

Re: C-API help

Posted: 29 Apr 2014 22:14
by maros
thank you for your help so far, but unfortunately i still can't get any event callbacks from the zway api. Zway always fails with returnvalue -9 during discovery.

That's my code
https://github.com/maros/Homely/blob/master/play/test.c
And that's what i get on stdout:
https://github.com/maros/Homely/blob/ma ... ay/run.log

Even if i choose to ignore the returnvalue of zway_discover i don't get any data holders from zway_find_device_instance_cc_data (i have tried to call this function with multiple *path params such as "", "1.level", "level", "mylevel", ... ) and thus cannon add any callbacks

And idea what might be wrong here?

Cheers
Maroš

Re: C-API help

Posted: 30 Apr 2014 09:59
by pofs
You should stop z-way-server before running your custom program.
There's a known bug (scheduled to be fixed in the next version) that device is not opened in exclusive mode, so both your program and z-way-server struggle for data from device, and both read junk and corrupted packets.