Desktop Command Execution Widget scripts

(Battery (via bq27200 chip))
(Adds new TFL bus departures script under new section 4, remote data)
Line 754: Line 754:
                 - search : print id of the given title"""
                 - search : print id of the given title"""
             print e
             print e
 +
 +
 +
== Scripts to pull data from remote web sites ==
 +
 +
 +
=== Transport for London - Live Bus Departures ===
 +
 +
Transport for London recently launched a mobile Web interface to their live bus departures information, and it's pretty good, but it can be a pain navigating to the bus stop that you want. This script uses DCEW to display data from multiple local bus stops, and to switch between them (by iterating over a list of them) on touching the widget.
 +
#!/bin/sh
 +
 +
BUS_STOPS="50713 48598 53221 74407"
 +
 +
if [ -r "/tmp/.bus_stops" ]; then
 +
BUS_STOPS=`cat /tmp/.bus_stops`;
 +
else
 +
echo $BUS_STOPS > /tmp/.bus_stops;
 +
chmod 777 /tmp/.bus_stops
 +
fi
 +
 +
LOOP=0
 +
if [ -r "/tmp/.countdown" ]; then
 +
LOOP=`cat /tmp/.countdown`;
 +
fi
 +
let LOOP=$LOOP+1;
 +
STOPCOUNT=`echo $BUS_STOPS | wc -w`;
 +
if [ "$LOOP" -gt "$STOPCOUNT" ]; then
 +
  LOOP=1;
 +
fi;
 +
echo $LOOP >/tmp/.countdown
 +
chmod 777 /tmp/.countdown
 +
 +
THISTIME=`echo $BUS_STOPS | cut -d" " -f $LOOP`;
 +
 +
lynx -dump -nolist http://m.countdown.tfl.gov.uk/arrivals/$THISTIME | grep -A10 "Buses dep" | sed -e "s/^  //g" | grep [a-z] | egrep -v "(Refresh|See\ map|Buses\ departing)"

Revision as of 20:45, 18 February 2012

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.

Scripts are also compatible with Queen BeeCon Widget which has extended graphic and cosmetic functionality, but is far more complicated.


Contents

Making your own scripts

Scripts without output

When there's no output (for example if you're using widget as a button and you use D-Bus call) the widget displays "Invalid Command". This can be most easily avoided if you pipe echo "" at the end of the command. This is also usable if your script produces unwanted output (D-Bus reply for example).

dbus-send -options -moreoptions | echo ""

Collection of D-Bus calls can be found on Phone control wiki page. The basic principle for making a script for DCEW is the same as above (D-Bus command and piping an echo).

Scripts with long output

Some scripts may create multiple lines which are too long to be displayed on a single line. The widget will not wrap these. In order to wrap them you can use the fold command:

command-that-produces-long-lines | fold -s -w 80

The 80 in that instance is the maximum length of the line, which you can change. The -s option makes fold word wrap with spaces. More information is available from the fold man page.

Scripts to display information

Battery (via Nokia's BME)

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

Battery (via bq27200 chip)

Percentage, current and last full charge, with TTE or TTF as appropriate

Install this as e.g. /usr/local/bin/bqbattery, make it executable and point DCEW to it. This is designed to work whether or not you have the bq27x00_battery module loaded, but if you don't, then you'll need to install the i2c-tools package, and then chmod 4755 /usr/sbin/i2cget (meaning i2cget runs as root even when we invoke it as user from DCEW).

#!/bin/sh

if [ -r "/sys/class/power_supply/bq27200-0/capacity" ]; then
# We have bq27x00_battery loaded - get the values from /sys/class/power_supply/bq27200-0/
CSOC=`cat /sys/class/power_supply/bq27200-0/capacity`;
NAC=$((`cat /sys/class/power_supply/bq27200-0/charge_now` / 1000));
LMD=$((`cat /sys/class/power_supply/bq27200-0/charge_full` / 1000));
STATUS=`cat /sys/class/power_supply/bq27200-0/status`;
if [ "$STATUS" == "Discharging" ]; then
       TTF=65535
       TTE=$((`cat /sys/class/power_supply/bq27200-0/time_to_empty_avg` / 60));
else
       TTF=$((`cat /sys/class/power_supply/bq27200-0/time_to_full_now` / 60));
       TTE=65535
fi
else
# We don't have bq27x00_battery - get the values using i2cget
NAC=$(($(/usr/sbin/i2cget -y 2 0x55 0x0c w) * 3570 / 20 / 1000));
LMD=$(($(/usr/sbin/i2cget -y 2 0x55 0x12 w) * 3570 / 20 / 1000));
CSOC=$(($(/usr/sbin/i2cget -y 2 0x55 0x2c)));
TTF=$(($(/usr/sbin/i2cget -y 2 0x55 0x18 w)));
TTE=$(($(/usr/sbin/i2cget -y 2 0x55 0x16 w)));
fi
echo "$CSOC% ($NAC/$LMD mAh)"
if [ "$TTF" -eq 65535 ]; then
        echo "$TTE minutes to empty"
else
        echo "$TTF min to full battery"
fi

Output example:

88% (1269/1439 mAh)

37 min to full battery

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 -t 2 -T 3 -q -O - api.myiptest.com | awk -F "\"" '{print $4}'`; echo LAN IP: `/sbin/ifconfig wlan0 | awk -F "[: ]" '/Bc/ {print $13}'`

Output example:

WAN IP: 1.2.3.4

LAN IP: 192.168.1.2


echo WAN IP: `wget -t 2 -T 3 -q -O - api.myiptest.com | awk -F "\"" '{print $4 " ("$12" "toupper($28)")"}'`; echo LAN IP: `/sbin/ifconfig wlan0 | awk -F "[: ]" '/Bc/ {print $13}'`

Output example:

WAN IP: 1.2.3.4 (ISP CountryCode)

LAN IP: 192.168.1.2


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

Output example:

WAN IP: 1.2.3.4 (ISP @ City, CountryCode)

LAN IP: 192.168.1.2

External (WAN)

wget -t 2 -T 3 -q -O - api.myiptest.com | awk -F "\"" '{print $4}'

Output example: 1.2.3.4


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

Output example: 1.2.3.4 (ISP CountryCode)


wget -t 2 -T 3 -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 wlan0 | awk -F "[: ]" '/Bc/ {print $13}'

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

Disk usage

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}'


Cellular signal

Quality

dbus-send --system --print-reply --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.get_signal_strength | awk 'NR==2 {print $2" %"}'

Strength

dbus-send --system --print-reply --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.get_signal_strength | awk 'NR==3 {print "-"$2" dBm"}'


Wi-Fi signal

Quality

awk -F "[. ]" '/0/ {print $6" %"}' /proc/net/wireless


RSSI

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


Noise

awk -F "[. ]" '/0/ {print $12" dBm"}' /proc/net/wireless


CPU frequency

awk '{print $1/1000" MHz"}' /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

Usage of each frequency

awk -v var=$(awk '{sum+=$2}; END {print sum};' /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state) '{arr[$3]=$2}{for (i in arr) {print $1/1000 " mhz " int(arr[i]*100/var)"%"}}' /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

Memory usage

RAM used

awk '/mT/ {memttl = $2}; /mF/ {memfre = $2}; /Bu/ {membff = $2}; $1 == "Cached:" {memcch = $2} END {printf ("%.1f MB\n",(memttl-memfre-membff-memcch)/1024)}' /proc/meminfo


RAM free

awk '/mF/ {memfre = $2}; /Bu/ {membff = $2}; $1 == "Cached:" {memcch = $2} END {printf ("%.1f MB\n",(memfre+membff+memcch)/1024)}' /proc/meminfo


Swap used

awk '/pT/ {swpttl = $2}; /pF/ {swpfre = $2} END {printf ("%.1f MB\n",(swpttl-swpfre)/1024)}' /proc/meminfo


Swap free

awk '/pF/ {printf ("%.1f MB\n",$2/1024)}' /proc/meminfo


Total memory used

awk '/mT/ {memttl = $2}; /mF/ {memfre = $2}; /Bu/ {membff = $2}; $1 == "Cached:" {memcch = $2}; /pT/ {swpttl = $2}; /pF/ {swpfre = $2} END {printf ("%.1f MB\n",(memttl+swpttl-memfre-membff-memcch-swpfre)/1024)}' /proc/meminfo


Total memory free

awk '/mF/ {memfre = $2}; /Bu/ {membff = $2}; $1 == "Cached:" {memcch = $2}; /pF/ {swpfre = $2} END {printf ("%.1f MB\n",(memfre+membff+memcch+swpfre)/1024)}' /proc/meminfo


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.

These scripts are now compatibile with PR1.2 (separate home and roaming counter), which means they won't work on previous versions.


Home counter (combined)

echo `gconftool-2 -g /system/osso/connectivity/network_type/GPRS/gprs_home_rx_bytes` `gconftool-2 -g /system/osso/connectivity/network_type/GPRS/gprs_home_tx_bytes` | awk '{printf ("%.1f MB\n",($1+$2)/1048576)}'


Home counter (separated)

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


Roaming counter (combined)

echo `gconftool-2 -g /system/osso/connectivity/network_type/GPRS/gprs_roaming_rx_bytes` `gconftool-2 -g /system/osso/connectivity/network_type/GPRS/gprs_roaming_tx_bytes` | awk '{printf ("%.1f MB\n",($1+$2)/1048576)}'


Roaming counter (separated)

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


Time and date

Date

date +"%a, %-d.%-m.%Y"

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


Time in different timezones

export TZ="Europe/London"; date +%R

This one shows two timezones in format London: 13:04 | Denver: 06:04

echo "London:" `export TZ="Europe/London"; date +%R` "| Denver:" `export TZ="America/Denver"; date +%R`

London and Denver are taken as an example. TZ values can be found on Wikipedia.


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 | sed -e 's/.*up */uptime: /' -e 's/ average//' -e 's/  / /'


Uptime

uptime | sed -e 's/.*p *//' -e 's/, l.*//' -e 's/  / /'


Load

uptime | sed 's/.*e: //'


Boot reason

cat /proc/bootreason


Boot count

cat /var/lib/dsme/boot_count


Temperature

CPU's thermal sensors are not accessible, but there is one near the battery. This commands displays output of its readings, but IT IS NOT RELIABLE, because it doesn't always work. Sometimes the value returned is wrong or constant. It needs to be tested further.

cat /sys/devices/platform/omap34xx_temp/temp1_input | awk '{ sub(/-/,""); print $1" °C"}'

There is a working way now to read the correct temperature, but it is working only on a newer titan's kernels (normal, overclock, undervoltage). The bq27x00_battery module has to be loaded first.

echo `cat /sys/class/power_supply/bq27200-0/temp` °C

with a comma :

echo `cat /sys/class/power_supply/bq27200-0/temp` °C | sed 's/\B[0-9]\{1\}/&,/'

Top processes

This script displays top N CPU consuming processes. It excludes top itself, which is quite processor intensive so you probably don't want this updating too often. Modify N=3 at the start to display different number of processes.

N=3; top -bn 1 | grep -v top | head -n $(($N+4)) | tail -n $(($N+1)) | awk '{OFS = "\t"} {print $7,$8}'


Random Number Generator

This script displays a random number between 0 and M (M included)

M=6; dd if=/dev/urandom bs=1 count=4 2>/dev/null | od -l | awk -v M=$M '{M++;print $2<0?-$2%M:$2%M;exit}'


Ping a Host

Preferred method. Install netcat from [1]

if (nc -zw1 192.168.2.1 80);then echo up;else echo down;fi

Alternate method. Ping has a long timeout when down. Warning: it will block the desktop while running.

if (echo 'ping -c1 192.168.2.1' | rootsh /bin/sh  2>&1 >/dev/null);then echo up;else echo down;fi

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.

There is a bug in version 0.9 or lower which prevents you from using DCEW widgets as buttons, because they get activated (pressed) automatically all the time. You have to make sure DCEW is at least version 1.0, to check which version you have installed do this: dpkg -l desktop-cmd-exec.


Networking

Connect/disconnect

sh /path/conn-disconn.sh | echo ""


conn-disconn.sh

#!/bin/sh
if [ `/sbin/route | awk '/au/ {print $1}'` = default ]; then
dbus-send --system --dest=com.nokia.icd /com/nokia/icd_ui com.nokia.icd_ui.disconnect boolean:true
else
dbus-send --system --type=method_call --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:"[ANY]" uint32:0
fi


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 ""


Connect to any saved connection

dbus-send --system --type=method_call --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:"[ANY]" uint32:0 | 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

echo "/path/to/script/wifi.sh" | sudo gainroot | echo ""


wifi.sh script:

#!/bin/sh
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

Don't forget to make it executable.


Wake On Lan

/path/to/script/wol.py | echo ""

wol.py script;

#! /usr/bin/python
# Wake-On-LAN
# Change ip range in the "s.sendto(msg" line 
# and the MAC of the pc to wakeup in the bottom line
import struct, socket
def WakeOnLan(ethernet_address):
 # Construct a six-byte hardware address
 addr_byte = ethernet_address.split(':')
 hw_addr = struct.pack('BBBBBB', int(addr_byte[0], 16),
   int(addr_byte[1], 16),
   int(addr_byte[2], 16),
   int(addr_byte[3], 16),
   int(addr_byte[4], 16),
   int(addr_byte[5], 16))
 # Build the Wake-On-LAN "Magic Packet"...
 msg = '\xff' * 6 + hw_addr * 16
 # ...and send it to the broadcast address using UDP
 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
 s.sendto(msg, ('192.168.1.255', 9))
 s.close()
# Example use
WakeOnLan('00:13:21:00:62:AE')

Don't forget to Chmod 755 wol.py


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 ""


Radio mode

2G/3G

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


2g3g.sh script:

#!/bin/sh
if [ `dbus-send --system --type=method_call --print-reply --dest=com.nokia.phone.net /com/nokia/phone/net Phone.Net.get_selected_radio_access_technology | awk '/b/ {print $2}'` -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

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 ""


Bluetooth

Enable

dbus-send --system --type=method_call --dest=org.bluez $(dbus-send --system --print-reply --dest=org.bluez / org.bluez.Manager.ListAdapters | awk -F "\"" '/at/ {print $2}') org.bluez.Adapter.SetProperty string:Powered variant:boolean:true | echo ""


Disable

dbus-send --system --type=method_call --dest=org.bluez $(dbus-send --system --print-reply --dest=org.bluez / org.bluez.Manager.ListAdapters | awk -F "\"" '/at/ {print $2}') org.bluez.Adapter.SetProperty string:Powered variant:boolean:false | echo ""

Profiles

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""


Toggle vibrating alert

There are far more things you can do with your profile. Please have a look at the profile values at the phone control page. This example disables vibrating alert for the active profile.


# Which profile is active?
if \
dbus-send --print-reply --type=method_call \
--dest=com.nokia.profiled /com/nokia/profiled \
com.nokia.profiled.get_profile | grep -q general
then
	# general profile is active
	dbus-send --type=method_call \
	--dest=com.nokia.profiled /com/nokia/profiled \
	com.nokia.profiled.set_value string:"general" \
	string:"vibrating.alert.enabled" string:"Off"
else
	# silent profile is active
	dbus-send --type=method_call \
	--dest=com.nokia.profiled /com/nokia/profiled \
	com.nokia.profiled.set_value string:"silent" \
	string:"vibrating.alert.enabled" string:"Off"
fi

You get the opposite behaviour (enable vibrating alert) simply by replacing "Off" two times by "On".

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:

The script connects to the internet and refreshes e-mail. Keep in mind that Modest e-mail client which N900 uses is very slow in this aspect and send and recive can take up to minute and a half. Make it executable.

#!/bin/sh
run-standalone.sh dbus-send --type=method_call --dest=org.freedesktop.Notifications /org/freedesktop/Notifications org.freedesktop.Notifications.SystemNoteInfoprint string:"Updating e-mail..."
run-standalone.sh dbus-send --system --type=method_call --dest=com.nokia.icd /com/nokia/icd com.nokia.icd.connect string:"[ANY]" uint32:0
sleep 10
run-standalone.sh dbus-send --type=method_call --dest=com.nokia.modest /com/nokia/modest com.nokia.modest.SendReceive


Set maximum CPU frequency

echo "echo 600000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq" | sudo gainroot | echo ""

Replace 600000 with desired maximum frequency. This is usable with the new overclocking kernels if you wish to manually change the maximum frequency to which processor can scale. Pay attention to the two exceptions in titan's kernels (124999 and 599000). The list of available frequencies on your device/kernel can be obtained with command:

awk '{print $1/1000" MHz"}' /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state


Reboot

echo "reboot" | sudo gainroot | 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.


FM transmitter

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

echo "echo 118 > /sys/class/i2c-adapter/i2c-2/2-0063/power_level" | sudo gainroot | echo ""


DBUS call to start browser

/usr/bin/browser_dbuscmd.sh load_url http://www.bbc.co.uk/iplayer/console/bbc_radio_fourfm

Display a Conboy Note

python /home/user/conboy_note_to_text.py print noteid

conboy_note_to_text.py Make sure to make this python script executable (chmod 755 /path/to/conboy_note_to_text.py). To list all notes with their title and id in xterm, just use the following commands: python /home/user/conboy_note_to_text.py list

Source : http://khertan.net/articles/maemo/conboy_note_to_text

Direct Script Link : http://khertan.net/_export/code/articles/maemo/conboy_note_to_text?codeblock=0

#!/usr/lib/python2.5

from xml.dom import minidom
import os.path
import glob
import sys
import re
from xml.sax.handler import ContentHandler
import xml.sax

class NoteList:
   def __init__(self,path):
       self.path = path
       self.noteList = {}
       for infile in glob.glob( os.path.join(self.path, '*.note') ):
         note = Reader(os.path.basename(infile)[:-5])
         if note.title != None:
             self.noteList[note.title]=note.note_id

   def get_note_id_by_title(self,title):
       try:
           return self.noteList[title]
       except:
           return None

class textHandler(ContentHandler):
   def __init__(self):
     ContentHandler.__init__(self)
     self.content = ""
     self.title = ""
     self.selector = None

   def startElement(self, element,attributes):
       if (element == 'note-content') and (self.selector == None):
           self.selector = element
       elif (element == 'title') and (self.selector == None):
           self.selector = element


   def endElement(self, element):
       if (element == self.selector):
           self.selector = None

   def characters(self, ch):
       if self.selector == 'note-content':
           self.content = self.content + unicode(ch)
       elif self.selector == 'title':
           self.title = self.title + unicode(ch)

class Reader:
   def __init__(self,note_id):
       self.note_id = note_id
       self.content = None
       self.title = None

       try:
           parser = xml.sax.make_parser()
           handler = textHandler()
           parser.setContentHandler(handler)
             parser.parse(os.path.join(os.path.expanduser("~"),'.conboy',self.note_id+'.note'))
           self.content = handler.content
           self.title = handler.title 
       except StandardError,e:
           print e



if __name__ == "__main__":
   try:
       if (sys.argv[1]=='print'):
           print Reader(unicode(sys.argv[2])).content
       elif (sys.argv[1]=='list'):
           nlist = NoteList('/home/user/.conboy/').noteList
           for key in nlist.keys():
               print key, ' : ', nlist[key]
       elif (sys.argv[1]=='search'):
           nlist = NoteList('/home/user/.conboy/')
           print nlist.get_note_id_by_title(sys.argv[2])
       else:
           raise
   except StandardError,e:
           print """Usage : python conboy_note_reader.py option [note_id or note title]
           Option : 
               - list : list all note by title with id
               - print : print content of note with the given id
               - search : print id of the given title"""
           print e


Scripts to pull data from remote web sites

Transport for London - Live Bus Departures

Transport for London recently launched a mobile Web interface to their live bus departures information, and it's pretty good, but it can be a pain navigating to the bus stop that you want. This script uses DCEW to display data from multiple local bus stops, and to switch between them (by iterating over a list of them) on touching the widget.

#!/bin/sh

BUS_STOPS="50713 48598 53221 74407"

if [ -r "/tmp/.bus_stops" ]; then
	BUS_STOPS=`cat /tmp/.bus_stops`;
else
	echo $BUS_STOPS > /tmp/.bus_stops;
	chmod 777 /tmp/.bus_stops
fi

LOOP=0
if [ -r "/tmp/.countdown" ]; then
LOOP=`cat /tmp/.countdown`;
fi
let LOOP=$LOOP+1;
STOPCOUNT=`echo $BUS_STOPS | wc -w`;
if [ "$LOOP" -gt "$STOPCOUNT" ]; then
  LOOP=1;
fi;
echo $LOOP >/tmp/.countdown
chmod 777 /tmp/.countdown

THISTIME=`echo $BUS_STOPS | cut -d" " -f $LOOP`;

lynx -dump -nolist http://m.countdown.tfl.gov.uk/arrivals/$THISTIME | grep -A10 "Buses dep" | sed -e "s/^   //g" | grep [a-z] | egrep -v "(Refresh|See\ map|Buses\ departing)"