Changeset 842a04


Ignore:
Timestamp:
02/27/12 11:27:52 (6 years ago)
Author:
Micke Prag <micke.prag@…>
Branches:
('master', 'cc326285c5d9e5d35ef50c97ddab57539e602594')
Children:
bdd95b8d78f734f173120e8f48ed792716e89b52
Parents:
d51e301f6b2d0befeb95948044b5dc4538c18d2f
git-author:
Lauri Aarnio <Lauri.Aarnio@iki.fi>2012-02-25 23:35:41+02:00
git-committer:
Micke Prag <micke.prag@telldus.se>2012-02-27 11:27:52+01:00
Message:

tdtool: Added an alternative listing format (new options --list-sensors and --list-devices)

  • These options list devices and sensors in a more machine-readable-friendly format: tab-separated key=value fields, one line/device, and no header lines, percent- or degree signs. Additionally, for sensors, age (in seconds) of the collected data is also printed.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • telldus-core/tdtool/main.cpp

    rd51e30 r842a04  
    2626        printf("Options:\n"); 
    2727        printf("         -[bdefhlnrv] [ --list ] [ --help ]\n"); 
     28        printf("                      [ --list-sensors ] [ --list-devices ]\n"); 
    2829        printf("                      [ --on device ] [ --off device ] [ --bell device ]\n"); 
    2930        printf("                      [ --learn device ]\n"); 
     
    3334        printf("       --list (-l short option)\n"); 
    3435        printf("             List currently configured devices and all discovered sensors.\n"); 
     36        printf("\n"); 
     37        printf("       --list-sensors\n"); 
     38        printf("       --list-devices\n"); 
     39        printf("             Alternative devices/sensors listing:\n"); 
     40        printf("             Shows devices and/or sensors using key=value format (with tabs as\n"); 
     41        printf("             separators, one device/sensor per line, no header lines.)\n"); 
    3542        printf("\n"); 
    3643        printf("       --help (-h short option)\n"); 
     
    170177} 
    171178 
     179/* list sensors using key=value format, one sensor/line, no header lines 
     180 * and no degree or percent signs attached to the numbers - just 
     181 * plain values. */ 
     182int list_kv_sensors() { 
     183        char protocol[DATA_LENGTH], model[DATA_LENGTH]; 
     184 
     185        tdInit(); 
     186        int sensorId = 0, dataTypes = 0; 
     187        time_t now = 0; 
     188        int sensorStatus; 
     189 
     190        time(&now); 
     191        while(1) { 
     192                sensorStatus = tdSensor(protocol, DATA_LENGTH, model, DATA_LENGTH, &sensorId, &dataTypes); 
     193                if (sensorStatus != 0) break; 
     194 
     195                printf("type=sensor\tprotocol=%s\tmodel=%s\tid=%d", 
     196                        protocol, model, sensorId); 
     197 
     198                time_t timestamp = 0; 
     199 
     200                if (dataTypes & TELLSTICK_TEMPERATURE) { 
     201                        char tempvalue[DATA_LENGTH]; 
     202                        tdSensorValue(protocol, model, sensorId, TELLSTICK_TEMPERATURE, tempvalue, DATA_LENGTH, (int *)&timestamp); 
     203                        printf("\ttemperature=%s", tempvalue); 
     204                } 
     205 
     206                if (dataTypes & TELLSTICK_HUMIDITY) { 
     207                        char humidityvalue[DATA_LENGTH]; 
     208                        tdSensorValue(protocol, model, sensorId, TELLSTICK_HUMIDITY, humidityvalue, DATA_LENGTH, (int *)&timestamp); 
     209                        printf("\thumidity=%s", humidityvalue); 
     210                } 
     211 
     212                if (dataTypes & (TELLSTICK_TEMPERATURE | TELLSTICK_HUMIDITY)) { 
     213                        /* timestamp has been set, print time & age */ 
     214                        /* (age is more useful on e.g. embedded systems 
     215                         * which may not have real-time clock chips => 
     216                         * time is useful only as a relative value) */ 
     217                        char timeBuf[80]; 
     218                        strftime(timeBuf, sizeof(timeBuf), "%Y-%m-%d %H:%M:%S", localtime(&timestamp)); 
     219                        printf("\ttime=%s\tage=%d", timeBuf, (int)(now - timestamp)); 
     220                } 
     221                printf("\n"); 
     222 
     223        } 
     224        if(sensorStatus != TELLSTICK_ERROR_DEVICE_NOT_FOUND){ 
     225                char *errorString = tdGetErrorString(sensorStatus); 
     226                fprintf(stderr, "Error fetching sensors: %s\n", errorString); 
     227                tdReleaseString(errorString); 
     228                return sensorStatus; 
     229        } 
     230        return TELLSTICK_SUCCESS; 
     231} 
     232 
     233/* list devices using key=value format, one device/line, no header lines */ 
     234int list_kv_devices() { 
     235        tdInit(); 
     236        int intNum = tdGetNumberOfDevices(); 
     237        if (intNum < 0) { 
     238                char *errorString = tdGetErrorString(intNum); 
     239                fprintf(stderr, "Error fetching devices: %s\n", errorString); 
     240                tdReleaseString(errorString); 
     241                return intNum; 
     242        } 
     243        int index = 0; 
     244        while (index < intNum) { 
     245                tdInit(); 
     246                int intId = tdGetDeviceId(index); 
     247                char *name = tdGetName(intId); 
     248                printf("type=device\tid=%i\tname=%s", intId, name); 
     249                tdReleaseString(name); 
     250 
     251                int lastSentCommand = tdLastSentCommand(intId, SUPPORTED_METHODS); 
     252                char *level = 0; 
     253                switch(lastSentCommand) { 
     254                        case TELLSTICK_TURNON: 
     255                                printf("\tlastsentcommand=ON"); 
     256                                break; 
     257                        case TELLSTICK_TURNOFF: 
     258                                printf("\tlastsentcommand=OFF"); 
     259                                break; 
     260                        case TELLSTICK_DIM: 
     261                                level = tdLastSentValue(intId); 
     262                                printf("\tlastsentcommand=DIMMED\tdimlevel=%s", level); 
     263                                tdReleaseString(level); 
     264                                break; 
     265                        /* default: state is unknown, print nothing. */ 
     266                } 
     267                printf("\n"); 
     268                index++; 
     269        } 
     270} 
     271 
     272 
    172273int find_device( char *device ) { 
    173274        tdInit(); 
     
    297398} 
    298399 
     400#define LIST_KV_SENSORS 1 
     401#define LIST_KV_DEVICES 2 
     402 
    299403int main(int argc, char **argv) 
    300404{ 
     
    303407        static struct option long_opts[] = { 
    304408                { "list", 0, 0, 'l' }, 
     409                { "list-sensors", 0, 0, LIST_KV_SENSORS }, 
     410                { "list-devices", 0, 0, LIST_KV_DEVICES }, 
    305411                { "on", 1, 0, 'n' }, 
    306412                { "off", 1, 0, 'f' }, 
     
    350456                                success = list_devices(); 
    351457                                break; 
     458                        case LIST_KV_SENSORS: 
     459                                success = list_kv_sensors(); 
     460                                break; 
     461                        case LIST_KV_DEVICES: 
     462                                success = list_kv_devices(); 
     463                                break; 
    352464                        case 'n' : 
    353465                                success = switch_device(true, &optarg[0]); 
Note: See TracChangeset for help on using the changeset viewer.