         #      called when we are already invalid
         @log 'error', "Could not discover nodes; abandoning"
       .done()
+
+  poll: ->
+    # XXX Notice additions or removals of devices?
+    return unless @isValid()
+    @_api.getNodes()
+      .then (nodes) =>
+        count = 0
+        for node in nodes
+          child = @children.get(node.address)
+          if child?
+            count += 1
+            child.processData node.properties
+        @log 'verbose', "Poll updated status of #{count} node(s)"
+      .fail (err) => @log 'warn', "Failed polling: #{err}"
+      .done()

      else
        @log 'verbose', "Unexpected property update #{JSON.stringify(update)}"
    @discover()
    # TODO There is an "ERR" property!! We should use it

  executeCommand: (node, command, args, expectResponse = true) ->

  # Required: host, username, password
  defaults:
    devices: {}
    pollInterval: 60 # seconds between complete data refreshes

  initialize: ->
    super
