Desktop Command Execution Widget scripts

Desktop Command Execution widget is one of the most useful widgets on your Maemo desktop. It can be used to show certain information (for example battery level in percentage) or as a button which can be used for example to disconnect active internet connection (you need to tap 3 times and also wait for menus to appear without this widget). Therefore it can replace many other applications/widgets/applets and you can also make something new. Here you'll find a collection of scripts that can be added to the widget. The discussion about the widget is on the forum.

Making your own scripts
When there's no output (for example if you're using widget as a button and you use dbus call), the widget displays "Invalid Command". This can be most easily avoided if you pipe echo "" at the end of the command. Example:

dbus-send -options -moreoptions | echo ""

This also works:

dbus-send -options -moreoptions; echo ""

...but the piping is preferred for buttons as it doesn't display ANY output (some dbus calls work only with reply). All of the dbus commands should be working in the same way. Collection of these can be found on Phone control wiki page. The basic principle is the same as above (dbus command and piping an echo).

Battery
All battery scripts are collected here. Pick the one which suits your needs. Examples of the output values are under each one.

There are 2 values for full battery capacity available. First one is design charge in mAh, which is always the same (1273 mAh). The second one is the one used in these scripts and it is the full charge from last charging. With displaying this one you can also monitor battery wear level.

Battery percentage level is calculated using first value and is therefore less accurate, that's why you cannot achieve 100% full battery, but only about 95%. After some time the full percentage will be even lower.

But last full charge value has one disadvantage. This is that after a reboot the phone forgets this value and the value returned is 0. It shows the proper value after next charging.

Percentage, current and last full charge
hal-device bme | awk '/l.p/ {perc = $3}; /g.c/ {curr = $3}; /g.la/ {last = $3}; /s_c/ {isch = $3} END if (isch == "false") {print perc" % ("curr"/"last" mAh)"} else {print "Charging"}'

Output example: 83 % (1000/1200 mAh), when charging Charging

Percentage and current charge
hal-device bme | awk '/l.p/ {perc = $3}; /g.c/ {curr = $3}; /s_c/ {isch = $3} END if (isch == "false") {print perc" % ("curr" mAh)"} else {print "Charging"}'

Output example: 83 % (1000 mAh), when charging Charging

Percentage
hal-device bme | awk '/l.p/ {perc = $3}; /s_c/ {isch = $3} END if (isch == "false") {print perc" %"} else {print "Chrg"}'

Output example: 83 %, when charging Chrg

Current and last full charge
hal-device bme | awk '/g.c/ {curr = $3}; /g.la/ {last = $3} END {print curr"/"last" mAh"}'

Output example: 1000/1200 mAh

Current charge
hal-device bme | awk '/g.c/ {print $3" mAh"}'

Output example: 1000 mAh

Last full charge
hal-device bme | awk '/g.la/ {print $3" mAh"}'

Output example: 1200 mAh

Date
date +"%d.%m.%Y"

This command will show the date in format (for example) 01.10.2010. You can define your own format (between the quotation marks). Possible options are described on manpage.

IP
Internal IPs are obtained from the ifconfig and external IPs are obtained from the internet, because gprs0 IP which you can get with ifconfig is often from private address range, because mobile operators like to use NAT.

External (WAN) and internal (LAN)
echo WAN IP: `wget -q -O - api.myiptest.com | awk -F"\"" '{print $4}'`; echo LAN IP: `/sbin/ifconfig | awk '/Bc/ {print $2}' | cut -c6-`

Output example:

WAN IP: 1.2.3.4

LAN IP: 192.168.1.2

wget -q -O - api.myiptest.com | awk -F"\"" '{print $4 " ("$12" "toupper($28)")"}'

Output example:

WAN IP: 1.2.3.4 (ISP CountryCode)

LAN IP: 192.168.1.2

echo WAN IP: `wget -q -O - api.myiptest.com | awk -F"\"" '{print $4" ("$12" @ "$20", "toupper($28)")"}'`; echo LAN IP: `/sbin/ifconfig | awk '/Bc/ {print $2}' | cut -c6-`

Output example:

WAN IP: 1.2.3.4 (ISP @ City, CountryCode)

LAN IP: 192.168.1.2

External (WAN)
wget -q -O - api.myiptest.com | awk -F"\"" '{print $4}'

Output example: 1.2.3.4

wget -q -O - api.myiptest.com | awk -F"\"" '{print $4 " ("$12" "toupper($28)")"}'

Output example: 1.2.3.4 (ISP CountryCode)

wget -q -O - api.myiptest.com | awk -F"\"" '{print $4" ("$12" @ "$20", "toupper($28)")"}'

Output example: 1.2.3.4 (ISP @ City, CountryCode)

Internal (LAN)
/sbin/ifconfig | awk '/Bc/ {print $2}' | cut -c6-

This one displays only wlan0 IP (used for SSH, WinSCP, VNC... in LAN).

rootfs (256MB /) percentage used
df | awk '$1 == "rootfs" {print $5}'

rootfs (256MB /) free space
df -h | awk '$1 == "rootfs" {print $4}'

Internal memory for user data (27GB /home/user/MyDocs) percentage used
df /home/user/MyDocs | awk '/My/ {print $5}'

Internal memory for user data (27GB /home/user/MyDocs) free space
df -h /home/user/MyDocs | awk '/My/ {print $4}'

Internal memory for application data (2GB /home) percentage used
df /home | awk '/ho/ {print $5}'

Internal memory for application data (2GB /home) free space
df -h /home | awk '/ho/ {print $4}'

Memory card (/media/mmc1) percentage used
df /media/mmc1 | awk '/mm/ {print $5}'

Memory card (/media/mmc1) free space
df -h /media/mmc1 | awk '/mm/ {print $4}'

Link quality
cat /proc/net/wireless | awk '/0/ {print $3}' | awk -F. '/./ {print $1" %"}'

RSSI
cat /proc/net/wireless | awk '/0/ {print $4" dBm"}'

Noise
cat /proc/net/wireless | awk '/0/ {print $5}' | awk -F. '/./ {print $1" dBm"}'

CPU frequency
echo $((`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq`/1000)) MHz

GPRS data usage
You can use this with scheduled reset of the GPRS data counter to display data usage for current month. Additional info can be found on fcron wiki page.

Download and upload combined
rx=`gconftool-2 -g /system/osso/connectivity/network_type/GPRS/gprs_rx_bytes`; tx=`gconftool-2 -g /system/osso/connectivity/network_type/GPRS/gprs_tx_bytes`; echo $(($tx + $rx)) | awk '{printf ("%.1f MB\n",$1/1048576)}'

Download and upload separated
echo `gconftool-2 -g /system/osso/connectivity/network_type/GPRS/gprs_rx_bytes | awk '{printf ("Download: %.1f MB\n",$1/1048576)}'`; echo `gconftool-2 -g /system/osso/connectivity/network_type/GPRS/gprs_tx_bytes | awk '{printf ("Upload: %.1f MB\n",$1/1048576)}'`

Uptime and load
These scripts are formatproof meaning that they display what they're supposed to no matter what format is command "uptime" outputting. Not all scripts found are like that, because "uptime" command is a little bit complicated for scripted text processing. For example when the system is running under one hour only "x min" is shown, when it is running under one day "hour:min:sec" is shown and after that it is shown in format "x days, hour:min:sec".

Both
uptime | cut -c14-

Uptime
uptime | sed -e 's/ ..:..:.. up //' -e 's/, load average: ...., ...., ....//'

Load
uptime | awk -F: '{print $5}' | cut -c2-

Boot reason
cat /proc/bootreason

Boot count
cat /var/lib/dsme/boot_count

Temperature
N900's processor does not have (or it is not accessible) thermal sensor but there is one near the battery. These two commands display output of its readings, but IT IS NOT RELIABLE. Some users report that the readings are accurate, some that they are not and for most the numbers returned are constant. It needs to be tested further.

echo `cat /sys/devices/platform/omap34xx_temp/temp1_input` °C

echo `cat /sys/devices/platform/omap34xx_temp/temp1_input_raw` °C

top
To display top $N programs (output of "top" command). This will always exclude top itself (which note is quite processor intensive, so you probably don't want this updating too often). Replace (3+$N) and $N with appropriate values -- for example, to show top two applications, 5 and 2. Alternately you can define $N, if you're up on shell scripting.

top -bn 1 | grep -v top | head -n (3+$N) | tail -n $N

World time
Time in a particular timezone can be shown with the date command; for example, for the current time in London use: export TZ="Europe/London" date "+%H:%M"

A more complex usage, showing London: 04:21 | Denver: 22:21

echo "London: " `/usr/bin/worldtime Europe/London` " | Denver: " `/usr/bin/worldtime America/Denver`

with a shell script /usr/bin/worldtime something like this:

if [ $# -gt 1 ] then DATEFORMAT="$2" else DATEFORMAT="%H:%M" fi if [ $# -gt 2 ] then TIMETOSHOW="-d \"$3\"" else TIMETOSHOW="" fi export TZ=$1 date "+$DATEFORMAT" $TIMETOSHOW
 * 1) !/bin/sh

Valid TZ values are taken from the zoneinfo (Olson) database.

Scripts for buttons
Make sure that update policy for button widgets is set only to "update when clicked". "Update when switched to desktop", "update interval" and "network presence" should be disabled to avoid automatic actions. Also keep in mind that widgets are executed at every boot so they can for example automatically disable Wi-Fi when phone boots.

Connect internet (show connections)
dbus-send --system --type=method_call --dest=com.nokia.icd_ui /com/nokia/icd_ui com.nokia.icd_ui.show_conn_dlg boolean:false | echo ""

Disconnect internet
dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true | echo ""

Enable/disable Wi-Fi
rootsh /path/to/script/wifi.sh | echo ""

wifi.sh script:

out=`ifconfig wlan0` if [ $? -eq "0" ] ; then if [ `echo "$out" | grep -c RUNNING` -gt "0" ] ; then run-standalone.sh dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true fi ifconfig wlan0 down rmmod wl12xx run-standalone.sh dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:'Wi-Fi disabled' exit 2 else modprobe wl12xx wl1251-cal stop wlancond start wlancond ifconfig wlan0 up run-standalone.sh dbus-send --system --type=method_call --dest=com.nokia.icd_ui /com/nokia/icd_ui com.nokia.icd_ui.show_conn_dlg boolean:false exit 0 fi
 * 1) !/bin/sh

Don't forget to make it executable.

Disconnect mobile network
dbus-send --system --type=method_call --dest=com.nokia.phone.SSC /com/nokia/phone/SSC com.nokia.phone.SSC.set_radio boolean:false | echo ""

Connect mobile network
dbus-send --system --type=method_call --dest=com.nokia.phone.SSC /com/nokia/phone/SSC com.nokia.phone.SSC.set_radio boolean:true | echo ""

Lock screen and keys
dbus-send --system --type=method_call --dest=com.nokia.mce /com/nokia/mce/request com.nokia.mce.request.req_tklock_mode_change string:"locked" | echo ""

2G/3G
sh /path/to/script/2g3g.sh | echo ""

2g3g.sh script:

get=`dbus-send --system --print-reply --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.get_selected_radio_access_technology | awk '/b/ {print $2}'` if [ `echo $get` -eq 1 ]; then dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:2 else dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:1 fi
 * 1) !/bin/sh

When 3G or Dual mode is active, the script will switch to 2G. And when 2G is active, it will switch to 3G.

Don't forget to make the script executable.

2G
dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:1 | echo ""

3G
dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:2 | echo ""

Dual
dbus-send --system --type=method_call --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.set_selected_radio_access_technology byte:0 | echo ""

General
dbus-send --type=method_call --dest=com.nokia.profiled /com/nokia/profiled com.nokia.profiled.set_profile string:"general" | echo ""

Silent
dbus-send --type=method_call --dest=com.nokia.profiled /com/nokia/profiled com.nokia.profiled.set_profile string:"silent" | echo""

Lock (secure) the device
dbus-send --system --type=method_call --dest=com.nokia.system_ui /com/nokia/system_ui/request com.nokia.system_ui.request.devlock_open string:"com.nokia.mce" string:"/com/nokia/mce/request" string:"com.nokia.mce.request" string:"devlock_callback" uint32:'3' | echo ""

Update e-mail
sh /path/to/script/email.sh | echo ""

email.sh script:

Make it executable and insert proper IAP_ID in the script. What it does is that it checks whether the phone is connected to the internet and if it is, send and receive is performed and if it is not, the defined connection (IAP_ID) is used to connect, then send and receive is performed and script waits about minute and a half (Modest e-mail client which N900 uses is slow in this aspect) and then disconnects internet.

get=`/sbin/route | awk '/au/ {print $1}'` if [ `echo $get` = default ]; then dbus-send --type=method_call --dest=com.nokia.modest /com/nokia/modest com.nokia.modest.SendReceive else dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Updating e-mail" dbus-send --system --type=method_call --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:"IAP_ID" uint32:0 sleep 10 dbus-send --type=method_call --dest=com.nokia.modest /com/nokia/modest com.nokia.modest.SendReceive sleep 90 dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"E-mail updated" fi
 * 1) !/bin/sh

Maximum CPU frequency
rootsh echo $((600*1000)) > /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

Replace 600 with desired maximum frequency. This is usable with new overclocking kernels if you wish to increase maximum frequency to which processor can scale on demand. The list of available frequencies on your device/kernel can be obtained with command:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies

The values returned are in kHz (that means you have to divide them by 1000 or remove last three zeroes).

Reboot
rootsh reboot | echo ""

Warning: Consult forums before you try this, because currently DCEW executes some (all?) commands at startup. This will be optional in next version. Making a reboot button on current DCEW version could result in endless reboot loop.

Enable/disable
/usr/bin/fmtx_client -p$(if [ $(cut -d. -f1 /proc/uptime ) -lt 100 ]; then echo 0; else /usr/bin/fmtx_client | /bin/grep -q '^state=enabled' ; echo $? ; fi) | /usr/bin/awk -F '=' '($1=="state") {print $2}'

Note: when you reboot the device, this script waits 100 seconds before you can turn the transmitter on/off again.

Increase power
rootsh echo 118 > /sys/class/i2c-adapter/i2c-2/2-0063/power_level | echo ""