TomFaulkner / SenseMe

Python Library for Haiku SenseMe app controlled fans/lights
GNU General Public License v3.0
21 stars 10 forks source link

_get_all_request() is not handling two sections in one line correctly. #22

Closed mikelawrence closed 6 years ago

mikelawrence commented 6 years ago

I am using SenseMe with monitoring enabled and get_attribute(). I have had a lot of problems get_attribute() causing key errors for say 'FAN;SPD;ACTUAL'. Note it doesn't always cause a key error only sometimes. What I think is happening is _get_all_request() is mishandling two sections in one string.

Running following code pprint.pprint(device._get_all_request()) produces the following results:

['Studio Beam Fan;DEVICE;BEEPER;ON',
 'Studio Beam Fan;DEVICE;INDICATORS;ON',
 'Studio Beam Fan;DEVICE;LIGHT;PRESENT',
 'Studio Beam Fan;DEVICE;SERVER;PRODUCTION',
 'Studio Beam Fan;ERRORLOG;ENTRIES;NUM;10',
 'Studio Beam Fan;ERRORLOG;ENTRIES;MAX;10',
 'Studio Beam Fan;FAN;AUTO;OFF',
 'Studio Beam Fan;FAN;DIR;FWD',
 'Studio Beam Fan;FAN;PWR;ON',
 'Studio Beam Fan;FAN;SPD;ACTUAL;5Studio Beam Fan;FAN;SPD;MAX;7',
 'Studio Beam Fan;FAN;SPD;MIN;1',
 'Studio Beam Fan;FAN;BOOKENDS;1;7',
 'Studio Beam Fan;FAN;TIMER;CURR;0',
 'Studio Beam Fan;FAN;TIMER;MAX;7Studio Beam Fan;FAN;TIMER;MIN;1',
 'Studio Beam Fan;FAN;WHOOSH;STATUS;OFF',
 'Studio Beam Fan;FW;NAME;FW000003',
 'Studio Beam Fan;FW;FW000003;2.5.0',
 'Studio Beam Fan;GROUP;LIST;Studio',
 'Studio Beam Fan;GROUP;ROOM;TYPE;4',
 'Studio Beam Fan;LEARN;MAXSPEED;7',
 'Studio Beam Fan;LEARN;MINSPEED;0',
 'Studio Beam Fan;LEARN;ZEROTEMP;2209',
 'Studio Beam Fan;LIGHT;AUTO;OFF',
 'Studio Beam Fan;LIGHT;LEVEL;ACTUAL;0',
 'Studio Beam Fan;LIGHT;BOOKENDS;1;16',
 'Studio Beam Fan;LIGHT;LEVEL;MAX;16',
 'Studio Beam Fan;LIGHT;LEVEL;MIN;1',
 'Studio Beam Fan;LIGHT;PWR;OFF',
 'Studio Beam Fan;NAME;VALUE;Studio Beam Fan',
 'Studio Beam Fan;NW;AP;STATUS;OFF',
 'Studio Beam Fan;NW;DHCP;OFF',
 'Studio Beam Fan;NW;PARAMS;ACTUAL;removed',
 'Studio Beam Fan;NW;SSID;Bogus WiFi,
 'Studio Beam Fan;NW;TOKEN;Removed',
 'Studio Beam Fan;SCHEDULE;CAP;MAX EVENTS,29',
 'Studio Beam Fan;SCHEDULE;EVENT;LIST;NONE',
 'Studio Beam Fan;SLEEP;EVENT;OFF',
 'Studio Beam Fan;SLEEP;EVENT;ON',
 'Studio Beam Fan;SLEEP;STATE;OFF',
 'Studio Beam Fan;SMARTMODE;ACTUAL;COOLING',
 'Studio Beam Fan;SMARTMODE;STATE;FOLLOWTSTAT',
 'Studio Beam Fan;SMARTSLEEP;IDEALTEMP;1926',
 'Studio Beam Fan;SMARTSLEEP;MAXSPEED;7',
 'Studio Beam Fan;SMARTSLEEP;MINSPEED;0',
 'Studio Beam Fan;SNSROCC;TIMEOUT;CURR;600000',
 'Studio Beam Fan;SNSROCC;TIMEOUT;MAX;86400000',
 'Studio Beam Fan;SNSROCC;TIMEOUT;MIN;60000',
 'Studio Beam Fan;TIME;VALUE;2018-06-16T17:23:00Z',
 'Studio Beam Fan;WINTERMODE;HEIGHT;213',
 'Studio Beam Fan;WINTERMODE;STATE;OFF']

I think this shows 'FAN;SPD;ACTUAL' will never end up as a key. Note that the two sections on one line is not consistent so sometimes 'FAN;SPD;ACTUAL' will exist as a key.

Adding .replace(')(', ')||(') to your _get_all_request() fixes the problem for me.

def _get_all_request(self):
    """Get all parameters from device, returns as a list."""
    results = self.send_raw('<%s;GETALL>' % self.name)
    # sometimes this gets two sections in one string:
    # join list to str, clean up (), and split back to a list
    results = '||'.join(results).replace(')(', ')||(')
    return results.replace('(', '').replace(')', '').split('||')

Now pprint.pprint(device._get_all_request()) produces:

['Studio Beam Fan;DEVICE;BEEPER;ON',
 'Studio Beam Fan;DEVICE;INDICATORS;ON',
 'Studio Beam Fan;DEVICE;LIGHT;PRESENT',
 'Studio Beam Fan;DEVICE;SERVER;PRODUCTION',
 'Studio Beam Fan;ERRORLOG;ENTRIES;NUM;10',
 'Studio Beam Fan;ERRORLOG;ENTRIES;MAX;10',
 'Studio Beam Fan;FAN;AUTO;OFF',
 'Studio Beam Fan;FAN;DIR;FWD',
 'Studio Beam Fan;FAN;PWR;ON',
 'Studio Beam Fan;FAN;SPD;ACTUAL;5',
 'Studio Beam Fan;FAN;SPD;MAX;7',
 'Studio Beam Fan;FAN;SPD;MIN;1',
 'Studio Beam Fan;FAN;BOOKENDS;1;7',
 'Studio Beam Fan;FAN;TIMER;CURR;0',
 'Studio Beam Fan;FAN;TIMER;MAX;7',
 'Studio Beam Fan;FAN;TIMER;MIN;1',
 'Studio Beam Fan;FAN;WHOOSH;STATUS;OFF',
 'Studio Beam Fan;FW;NAME;FW000003',
 'Studio Beam Fan;FW;FW000003;2.5.0',
 'Studio Beam Fan;GROUP;LIST;Studio',
 'Studio Beam Fan;GROUP;ROOM;TYPE;4',
 'Studio Beam Fan;LEARN;MAXSPEED;7',
 'Studio Beam Fan;LEARN;MINSPEED;0',
 'Studio Beam Fan;LEARN;ZEROTEMP;2209',
 'Studio Beam Fan;LIGHT;AUTO;OFF',
 'Studio Beam Fan;LIGHT;LEVEL;ACTUAL;0',
 'Studio Beam Fan;LIGHT;BOOKENDS;1;16',
 'Studio Beam Fan;LIGHT;LEVEL;MAX;16',
 'Studio Beam Fan;LIGHT;LEVEL;MIN;1',
 'Studio Beam Fan;LIGHT;PWR;OFF',
 'Studio Beam Fan;NAME;VALUE;Studio Beam Fan',
 'Studio Beam Fan;NW;AP;STATUS;OFF',
 'Studio Beam Fan;NW;DHCP;OFF',
 'Studio Beam Fan;NW;PARAMS;ACTUAL;removed',
 'Studio Beam Fan;NW;SSID;Bogus WiFi',
 'Studio Beam Fan;NW;TOKEN;removed',
 'Studio Beam Fan;SCHEDULE;CAP;MAX EVENTS,29',
 'Studio Beam Fan;SCHEDULE;EVENT;LIST;NONE',
 'Studio Beam Fan;SLEEP;EVENT;OFF',
 'Studio Beam Fan;SLEEP;EVENT;ON',
 'Studio Beam Fan;SLEEP;STATE;OFF',
 'Studio Beam Fan;SMARTMODE;ACTUAL;COOLING',
 'Studio Beam Fan;SMARTMODE;STATE;FOLLOWTSTAT',
 'Studio Beam Fan;SMARTSLEEP;IDEALTEMP;1926',
 'Studio Beam Fan;SMARTSLEEP;MAXSPEED;7',
 'Studio Beam Fan;SMARTSLEEP;MINSPEED;0',
 'Studio Beam Fan;SNSROCC;TIMEOUT;CURR;600000',
 'Studio Beam Fan;SNSROCC;TIMEOUT;MAX;86400000',
 'Studio Beam Fan;SNSROCC;TIMEOUT;MIN;60000',
 'Studio Beam Fan;TIME;VALUE;2018-06-16T17:54:39Z',
 'Studio Beam Fan;WINTERMODE;HEIGHT;213',
 'Studio Beam Fan;WINTERMODE;STATE;OFF']
TomFaulkner commented 6 years ago

Unfortunately, the way the fan sends these makes it difficult to parse. I thought what I had always worked, but it seems that isn't the case.

I would be glad to look at a PR.

TomFaulkner commented 6 years ago

Closing as fix was merged. This output might be usable for #27 .