the ambient sensing gestalt optimizer for the n900

dwimd works by sampling sensors and taking user-defined actions based on a user-written config file.


  1. Look at how a config file should look like.
  2. Write your own config file. Every function is executed every 30 seconds. You can use the values and actions explained below.
  3. Copy your config file to /etc/dwimd/dwimd_plugins/configs. It should have a .py extension.


dwimd ships the following sensors:
  • history: Not really a sensor, it buffers data and returns the buffered
    data as a list.
  • load: Provides the system load as load.
  • locationcheck: Provides the current location as location. Such location
    objects then have a near method that should be called with the name of a location that was previously defined with define_location. define_location takes a name and either network_in_sight="network_name" for wifi sensing or coordinates=(50, 8, 100) for an 100m circle around the GPS coordinates 50N 8E.
  • moving: Provides moving and not_moving_for_5min. The latter is useful
    for autoaway.
  • orientation: Provides orientation, face_up and on_stand. orientation
    either contains "portrait" or "landscape" or the same string with " (inverse)" appended (XXX check). The other two variables are booleans.
  • time: Provides time which supports time.between("12:00", "15:00") like
It ships the following actions. These are activatable by using the verbs explained below.
  • availability: Should be activated with a status like "online" or "away". Additionally,
    availability_message can be activated with the status message.
  • lock: If activated with off, avoids that the screen locks.
  • profile: Can be activated with a profile name that should be switched to (like
    "silent" or "general").
  • wifi: Should be activated with a network name as the value.
These verbs are provided to activate an action:
  • require(object, value) triggers an error if somebody votes against it
  • suggest(object, value) is a weak vote (defaults values but does not count in votes)
  • vote(object, value, votes) is used for voting
  • force(object, value) overwrites requires and votes

where object is a gestalt name or an action.

Gestalts can be defined like this:
availability="available", profile="general")

They group similar action values.


  • Adjustable sample rate for every plugin.
  • Planned inputs: gps, time, weekday, load, location, orientation charging, playing, display, locked, noise level, ringing
  • planned outputs: availability, profile, cellular, secure, lock, wifi os.system