diff --git a/pilight/pilight.py b/pilight/pilight.py index 399368c..f2c2de4 100644 --- a/pilight/pilight.py +++ b/pilight/pilight.py @@ -8,6 +8,8 @@ import json import logging +from pilight import protocol_schema + class Client(threading.Thread): @@ -103,6 +105,11 @@ def __init__(self, host='127.0.0.1', port=5000, timeout=1, answer_1, answer_2) self.callback = None + self.protocol_registry = self._load_protocol_schema() + + def _load_protocol_schema(self): + # Use static protocol schema dump until we have PR #322 merged. + return protocol_schema.ProtocolRegistry() def set_callback(self, function): """Function to be called when data is received.""" diff --git a/pilight/protocol_list.json b/pilight/protocol_list.json new file mode 100644 index 0000000..9df7ade --- /dev/null +++ b/pilight/protocol_list.json @@ -0,0 +1,2638 @@ +{ + "protocols": [ + { + "devices": [ + "ping" + ], + "name": "ping", + "options": [ + { + "vartype": [ + "string" + ], + "name": "ip" + }, + { + "vartype": [ + "string" + ], + "name": "disconnected" + }, + { + "vartype": [ + "string" + ], + "name": "connected" + } + ] + }, + { + "devices": [ + "arping" + ], + "name": "arping", + "options": [ + { + "vartype": [ + "string" + ], + "name": "ip" + }, + { + "vartype": [ + "string" + ], + "name": "mac" + }, + { + "vartype": [ + "string" + ], + "name": "disconnected" + }, + { + "vartype": [ + "string" + ], + "name": "connected" + } + ] + }, + { + "devices": [ + "generic_webcam" + ], + "name": "generic_webcam", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "string" + ], + "name": "url" + } + ] + }, + { + "devices": [ + "generic_weather" + ], + "name": "generic_weather", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "battery" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + } + ] + }, + { + "devices": [ + "generic_switch" + ], + "name": "generic_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "generic_screen" + ], + "name": "generic_screen", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "string" + ], + "name": "down" + }, + { + "vartype": [ + "string" + ], + "name": "up" + } + ] + }, + { + "devices": [ + "generic_label" + ], + "name": "generic_label", + "options": [ + { + "vartype": [ + "string" + ], + "name": "color" + }, + { + "vartype": [ + "string", + "number" + ], + "name": "label" + }, + { + "vartype": [ + "number" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "generic_dimmer" + ], + "name": "generic_dimmer", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "dimlevel" + } + ] + }, + { + "devices": [ + "raw" + ], + "name": "raw", + "options": [ + { + "vartype": [ + "number" + ], + "name": "repeats" + }, + { + "vartype": [ + "string" + ], + "name": "code" + } + ] + }, + { + "devices": [ + "pilight_firmware" + ], + "name": "pilight_firmware", + "options": [ + { + "vartype": [ + "number" + ], + "name": "hpf" + }, + { + "vartype": [ + "number" + ], + "name": "lpf" + }, + { + "vartype": [ + "number" + ], + "name": "version" + } + ] + }, + { + "devices": [ + "pilight_firmware" + ], + "name": "pilight_firmware", + "options": [ + { + "vartype": [ + "number" + ], + "name": "hpf" + }, + { + "vartype": [ + "number" + ], + "name": "lpf" + }, + { + "vartype": [ + "number" + ], + "name": "version" + } + ] + }, + { + "devices": [ + "relay" + ], + "name": "relay", + "options": [ + { + "vartype": [ + "number" + ], + "name": "gpio" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "lm76" + ], + "name": "lm76", + "options": [ + { + "vartype": [ + "string" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "lm75" + ], + "name": "lm75", + "options": [ + { + "vartype": [ + "string" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "gpio_switch" + ], + "name": "gpio_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "gpio" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "ds18s20" + ], + "name": "ds18s20", + "options": [ + { + "vartype": [ + "string" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "ds18b20" + ], + "name": "ds18b20", + "options": [ + { + "vartype": [ + "string" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "am2302", + "dht22" + ], + "name": "dht22", + "options": [ + { + "vartype": [ + "number" + ], + "name": "gpio" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "dht11" + ], + "name": "dht11", + "options": [ + { + "vartype": [ + "number" + ], + "name": "gpio" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "bmp085", + "bmp180" + ], + "name": "bmp180", + "options": [ + { + "vartype": [ + "number" + ], + "name": "temperature" + }, + { + "vartype": [ + "number" + ], + "name": "pressure" + }, + { + "vartype": [ + "number" + ], + "name": "oversampling" + }, + { + "vartype": [ + "string" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "kodi", + "xbmc" + ], + "name": "xbmc", + "options": [ + { + "vartype": [ + "number" + ], + "name": "port" + }, + { + "vartype": [ + "string" + ], + "name": "server" + }, + { + "vartype": [ + "string" + ], + "name": "media" + }, + { + "vartype": [ + "string" + ], + "name": "action" + } + ] + }, + { + "devices": [ + "wunderground" + ], + "name": "wunderground", + "options": [ + { + "vartype": [ + "number" + ], + "name": "update" + }, + { + "vartype": [ + "string" + ], + "name": "sun" + }, + { + "vartype": [ + "number" + ], + "name": "sunset" + }, + { + "vartype": [ + "number" + ], + "name": "sunrise" + }, + { + "vartype": [ + "string" + ], + "name": "country" + }, + { + "vartype": [ + "string" + ], + "name": "location" + }, + { + "vartype": [ + "string" + ], + "name": "api" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "sunriseset" + ], + "name": "sunriseset", + "options": [ + { + "vartype": [ + "string" + ], + "name": "sun" + }, + { + "vartype": [ + "number" + ], + "name": "sunset" + }, + { + "vartype": [ + "number" + ], + "name": "sunrise" + }, + { + "vartype": [ + "number" + ], + "name": "latitude" + }, + { + "vartype": [ + "number" + ], + "name": "longitude" + } + ] + }, + { + "devices": [ + "program" + ], + "name": "program", + "options": [ + { + "vartype": [ + "string" + ], + "name": "stopped" + }, + { + "vartype": [ + "string" + ], + "name": "pending" + }, + { + "vartype": [ + "string" + ], + "name": "running" + }, + { + "vartype": [ + "string" + ], + "name": "arguments" + }, + { + "vartype": [ + "number" + ], + "name": "pid" + }, + { + "vartype": [ + "string" + ], + "name": "program" + }, + { + "vartype": [ + "string" + ], + "name": "stop-command" + }, + { + "vartype": [ + "string" + ], + "name": "start-command" + }, + { + "vartype": [ + "string" + ], + "name": "name" + } + ] + }, + { + "devices": [ + "openweathermap" + ], + "name": "openweathermap", + "options": [ + { + "vartype": [ + "number" + ], + "name": "update" + }, + { + "vartype": [ + "string" + ], + "name": "sun" + }, + { + "vartype": [ + "number" + ], + "name": "sunset" + }, + { + "vartype": [ + "number" + ], + "name": "sunrise" + }, + { + "vartype": [ + "string" + ], + "name": "country" + }, + { + "vartype": [ + "string" + ], + "name": "location" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "lirc" + ], + "name": "lirc", + "options": [ + { + "vartype": [ + "string" + ], + "name": "remote" + }, + { + "vartype": [ + "string" + ], + "name": "button" + }, + { + "vartype": [ + "number" + ], + "name": "repeat" + }, + { + "vartype": [ + "string" + ], + "name": "code" + } + ] + }, + { + "devices": [ + "datetime" + ], + "name": "datetime", + "options": [ + { + "vartype": [ + "number" + ], + "name": "dst" + }, + { + "vartype": [ + "number" + ], + "name": "second" + }, + { + "vartype": [ + "number" + ], + "name": "minute" + }, + { + "vartype": [ + "number" + ], + "name": "hour" + }, + { + "vartype": [ + "number" + ], + "name": "weekday" + }, + { + "vartype": [ + "number" + ], + "name": "day" + }, + { + "vartype": [ + "number" + ], + "name": "month" + }, + { + "vartype": [ + "number" + ], + "name": "year" + }, + { + "vartype": [ + "number" + ], + "name": "latitude" + }, + { + "vartype": [ + "number" + ], + "name": "longitude" + } + ] + }, + { + "devices": [ + "cpu_temp" + ], + "name": "cpu_temp", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "x10" + ], + "name": "x10", + "options": [ + { + "vartype": [ + "string" + ], + "name": "id" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "tfa30" + ], + "name": "tfa30", + "options": [ + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "GT-WT-01", + "NC7104", + "soens", + "conrad_weather", + "tfa" + ], + "name": "tfa", + "options": [ + { + "vartype": [ + "number" + ], + "name": "battery" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "channel" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "teknihall" + ], + "name": "teknihall", + "options": [ + { + "vartype": [ + "number" + ], + "name": "battery" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "techlico_switch" + ], + "name": "techlico_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "tcm" + ], + "name": "tcm", + "options": [ + { + "vartype": [ + "number" + ], + "name": "battery" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "silvercrest" + ], + "name": "silvercrest", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "selectremote" + ], + "name": "selectremote", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "secudo_smoke_sensor" + ], + "name": "secudo_smoke_sensor", + "options": [ + { + "vartype": [ + "string" + ], + "name": "alarm" + }, + { + "vartype": [ + "number" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "sc2262" + ], + "name": "sc2262", + "options": [ + { + "vartype": [ + "string" + ], + "name": "closed" + }, + { + "vartype": [ + "string" + ], + "name": "opened" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "promax", + "rsl366" + ], + "name": "rsl366", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "programcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "rev3_switch" + ], + "name": "rev3_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "rev2_switch" + ], + "name": "rev2_switch", + "options": [ + { + "vartype": [ + "string" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "rev1_switch" + ], + "name": "rev1_switch", + "options": [ + { + "vartype": [ + "string" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "rc102", + "rc101" + ], + "name": "rc101", + "options": [ + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "number" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "quigg_screen" + ], + "name": "quigg_screen", + "options": [ + { + "vartype": [ + "number" + ], + "name": "learn" + }, + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "down" + }, + { + "vartype": [ + "string" + ], + "name": "up" + } + ] + }, + { + "devices": [ + "quigg_gt9000" + ], + "name": "quigg_gt9000", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "quigg_gt7000" + ], + "name": "quigg_gt7000", + "options": [ + { + "vartype": [ + "number" + ], + "name": "learn" + }, + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "quigg_gt1000" + ], + "name": "quigg_gt1000", + "options": [ + { + "vartype": [ + "number" + ], + "name": "num" + }, + { + "vartype": [ + "number" + ], + "name": "super" + }, + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "pollin" + ], + "name": "pollin", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "ninjablocks_weather" + ], + "name": "ninjablocks_weather", + "options": [ + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + } + ] + }, + { + "devices": [ + "mumbi" + ], + "name": "mumbi", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "logilink_switch" + ], + "name": "logilink_switch", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "impuls" + ], + "name": "impuls", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "programcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "heitech" + ], + "name": "heitech", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "ev1527" + ], + "name": "ev1527", + "options": [ + { + "vartype": [ + "string" + ], + "name": "closed" + }, + { + "vartype": [ + "string" + ], + "name": "opened" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + } + ] + }, + { + "devices": [ + "eurodomest_switch" + ], + "name": "eurodomest_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "learn" + }, + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "maxitronic", + "brennenstuhl", + "elro_800_switch" + ], + "name": "elro_800_switch", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "elro_800_contact" + ], + "name": "elro_800_contact", + "options": [ + { + "vartype": [ + "string" + ], + "name": "closed" + }, + { + "vartype": [ + "string" + ], + "name": "opened" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "elro_400_switch" + ], + "name": "elro_400_switch", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "elro_300_switch" + ], + "name": "elro_300_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unitcode" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + } + ] + }, + { + "devices": [ + "ehome" + ], + "name": "ehome", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "daycom" + ], + "name": "daycom", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "systemcode" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "conrad_rsl_switch" + ], + "name": "conrad_rsl_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "learn" + }, + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "number" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "conrad_rsl_contact" + ], + "name": "conrad_rsl_contact", + "options": [ + { + "vartype": [ + "string" + ], + "name": "closed" + }, + { + "vartype": [ + "string" + ], + "name": "opened" + }, + { + "vartype": [ + "number" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "cleverwatts" + ], + "name": "cleverwatts", + "options": [ + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "clarus_switch" + ], + "name": "clarus_switch", + "options": [ + { + "vartype": [ + "string" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "beamish_switch" + ], + "name": "beamish_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "auriol" + ], + "name": "auriol", + "options": [ + { + "vartype": [ + "number" + ], + "name": "battery" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + }, + { + "vartype": [ + "number" + ], + "name": "channel" + }, + { + "vartype": [ + "number" + ], + "name": "id" + } + ] + }, + { + "devices": [ + "duwi", + "byebyestandby", + "intertechno_old", + "cogex", + "kaku_switch_old" + ], + "name": "arctech_switch_old", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "intertechno_switch", + "coco_switch", + "nexa_switch", + "dio_switch", + "kaku_switch" + ], + "name": "arctech_switch", + "options": [ + { + "vartype": [ + "number" + ], + "name": "learn" + }, + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + } + ] + }, + { + "devices": [ + "kaku_screen_old" + ], + "name": "arctech_screen_old", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "down" + }, + { + "vartype": [ + "string" + ], + "name": "up" + } + ] + }, + { + "devices": [ + "dio_screen", + "kaku_screen" + ], + "name": "arctech_screen", + "options": [ + { + "vartype": [ + "number" + ], + "name": "learn" + }, + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "string" + ], + "name": "down" + }, + { + "vartype": [ + "string" + ], + "name": "up" + } + ] + }, + { + "devices": [ + "kaku_motion" + ], + "name": "arctech_motion", + "options": [ + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + } + ] + }, + { + "devices": [ + "kaku_dusk" + ], + "name": "arctech_dusk", + "options": [ + { + "vartype": [ + "string" + ], + "name": "dawn" + }, + { + "vartype": [ + "string" + ], + "name": "dusk" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + } + ] + }, + { + "devices": [ + "kaku_dimmer" + ], + "name": "arctech_dimmer", + "options": [ + { + "vartype": [ + "number" + ], + "name": "learn" + }, + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "string" + ], + "name": "off" + }, + { + "vartype": [ + "string" + ], + "name": "on" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + }, + { + "vartype": [ + "number" + ], + "name": "dimlevel" + } + ] + }, + { + "devices": [ + "dio_contact", + "kaku_contact" + ], + "name": "arctech_contact", + "options": [ + { + "vartype": [ + "number" + ], + "name": "all" + }, + { + "vartype": [ + "string" + ], + "name": "closed" + }, + { + "vartype": [ + "string" + ], + "name": "opened" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "unit" + } + ] + }, + { + "devices": [ + "balance_rf_ws105", + "meteoscan_w1XX", + "hama_ews1500", + "ventus_wsxxx", + "auriol_h13726", + "alecto_wx500" + ], + "name": "alecto_wx500", + "options": [ + { + "vartype": [ + "number" + ], + "name": "windgust" + }, + { + "vartype": [ + "number" + ], + "name": "winddir" + }, + { + "vartype": [ + "number" + ], + "name": "windavg" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "battery" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "alecto_wsd17" + ], + "name": "alecto_wsd17", + "options": [ + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "iboutique", + "alecto_ws1700" + ], + "name": "alecto_ws1700", + "options": [ + { + "vartype": [ + "number" + ], + "name": "battery" + }, + { + "vartype": [ + "number" + ], + "name": "humidity" + }, + { + "vartype": [ + "number" + ], + "name": "id" + }, + { + "vartype": [ + "number" + ], + "name": "temperature" + } + ] + }, + { + "devices": [ + "process" + ], + "name": "process", + "options": [ + { + "vartype": [ + "number" + ], + "name": "ram" + }, + { + "vartype": [ + "number" + ], + "name": "cpu" + } + ] + } + ] +} diff --git a/pilight/protocol_schema.py b/pilight/protocol_schema.py new file mode 100644 index 0000000..7c3793d --- /dev/null +++ b/pilight/protocol_schema.py @@ -0,0 +1,98 @@ +import json +import logging +import voluptuous as vol + +from os import path + + +KEY_PROTOCOLS = "protocols" +KEY_DEVICES = "devices" +KEY_NAME = "name" +KEY_DATA_TYPE = "vartype" +KEY_OPTIONS = "options" +KEY_PROTOCOL = "protocol" + + +logger = logging.getLogger(__name__) + + +_types = {"string" : str, + "number": vol.Any(int, float)} + + +def _default_schema(): + """Load the fefault schema. + + This is necessary until we have proper runtime protocol reporting support + in the pilight daemon. + """ + with open(path.join(path.dirname(__file__), "protocol_list.json")) as fp: + return json.load(fp) + + +def _convert_datatype(type_data): + if isinstance(type_data, (list, tuple)): + if len(type_data) == 1: + return _convert_datatype(type_data[0]) + return vol.Any([_convert_datatype(t) for t in type_data]) + + return _types.get(type_data) + + +def _make_vol_schema(protocol_name, option_data): + option_schema = {vol.Required(KEY_PROTOCOL): protocol_name} + for option in option_data: + option_schema[vol.Optional(option.get(KEY_NAME))] =\ + _convert_datatype(option.get(KEY_DATA_TYPE)) + + return vol.Schema(option_schema) + + +class ProtocolSchema(object): + def __init__(self, schema_data): + self.name = schema_data.get(KEY_NAME) + self.devices = schema_data.get(KEY_DEVICES) + self.schema = _make_vol_schema(self.name, schema_data.get(KEY_OPTIONS)) + + def validate(self, data): + return self.schema(data) + + def __repr__(self): + return "ProtocolSchema(name={}, schema={})".format(self.name, + self.schema) + + +class ProtocolRegistry(object): + def __init__(self, schema=None): + if schema is None: + logger.info("Use default protocol data") + schema = _default_schema() + + self._protocols = {} + + for protocol in schema.get("protocols"): + protocol_schema = ProtocolSchema(protocol) + self._protocols[protocol_schema.name] = protocol_schema + logger.debug("Added protocol '{}'".format(protocol_schema.name)) + + def validate(self, data, protocol_as_list=True): + protocol = data.get(KEY_PROTOCOL) + + if protocol is None: + raise RuntimeError("No protocol specified in data!") + + if isinstance(protocol, list): + protocol = protocol[0] + + if protocol not in self._protocols: + raise RuntimeError("Unknown protocol '{}'".format(protocol)) + + protocol_schema = self._protocols[protocol] + validated = protocol_schema.schema(data) + + if protocol_as_list: + validated[KEY_PROTOCOL] = [protocol] + + return validated + + diff --git a/setup.py b/setup.py index c599399..4b1412c 100644 --- a/setup.py +++ b/setup.py @@ -19,5 +19,6 @@ packages=find_packages(), include_package_data=True, # Accept all data files and directories matched by MANIFEST.in or found in source control keywords=['pilight', '433', 'light'], - platforms='any' + platforms='any', + install_requires=["voluptuous"] )