<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://i3detroit.com/wi/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://i3detroit.com/wi/index.php?title=Twitter_DiscoBot&amp;feed=atom&amp;action=history</id>
		<title>Twitter DiscoBot - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://i3detroit.com/wi/index.php?title=Twitter_DiscoBot&amp;feed=atom&amp;action=history"/>
		<link rel="alternate" type="text/html" href="http://i3detroit.com/wi/index.php?title=Twitter_DiscoBot&amp;action=history"/>
		<updated>2013-05-24T18:50:57Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.18.1</generator>

	<entry>
		<id>http://i3detroit.com/wi/index.php?title=Twitter_DiscoBot&amp;diff=3510&amp;oldid=prev</id>
		<title>Cmounts at 21:34, 24 June 2012</title>
		<link rel="alternate" type="text/html" href="http://i3detroit.com/wi/index.php?title=Twitter_DiscoBot&amp;diff=3510&amp;oldid=prev"/>
				<updated>2012-06-24T21:34:26Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Older revision&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Revision as of 21:34, 24 June 2012&lt;/td&gt;
		&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 290:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 290:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Category:Projects]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;[[Category:Projects&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;]][[Category:Member Projects]][[Category:Facility Information&lt;/ins&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Cmounts</name></author>	</entry>

	<entry>
		<id>http://i3detroit.com/wi/index.php?title=Twitter_DiscoBot&amp;diff=1227&amp;oldid=prev</id>
		<title>Kc8nod: Created page with 'This was a demonstration and learning exercise to help generate some excitement for the Space Automation project.  ==What It Does== There is a multi-colored, spinning, disco-...'</title>
		<link rel="alternate" type="text/html" href="http://i3detroit.com/wi/index.php?title=Twitter_DiscoBot&amp;diff=1227&amp;oldid=prev"/>
				<updated>2010-12-22T17:29:56Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;#039;This was a demonstration and learning exercise to help generate some excitement for the &lt;a href=&quot;/wi/index.php?title=Space_Automation&quot; title=&quot;Space Automation&quot;&gt;Space Automation&lt;/a&gt; project.  ==What It Does== There is a multi-colored, spinning, disco-...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;This was a demonstration and learning exercise to help generate some excitement for the [[Space Automation]] project.&lt;br /&gt;
&lt;br /&gt;
==What It Does==&lt;br /&gt;
There is a multi-colored, spinning, disco-light-thingy sitting on top of the network rack. Every time the string 'i3detroit' gets mentioned on twitter, the thigy lights up an spins for 30 seconds.&lt;br /&gt;
&lt;br /&gt;
==How it works==&lt;br /&gt;
A python script on the debian server talks to one of [http://www.oceancontrols.com.au/KIT-223.html these things] over RS485. Relay 0 on the i/o box controls power to the disco-light-thingy.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
twitter_disco.py&lt;br /&gt;
&amp;lt;pre&amp;gt;import twitter&lt;br /&gt;
import RelayDuino&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
twitter = twitter.Api()&lt;br /&gt;
relay = RelayDuino.RelayDuino('/dev/ttyUSB0').relay[0]&lt;br /&gt;
relay.set('off')&lt;br /&gt;
last_id = twitter.Search('i3detroit').max_id&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
    &lt;br /&gt;
    result_set = twitter.Search('i3detroit', since_id=last_id)&lt;br /&gt;
    &lt;br /&gt;
    print &amp;quot;got %d new statuses&amp;quot; % len(result_set.results)&lt;br /&gt;
&lt;br /&gt;
    for status in result_set.results:&lt;br /&gt;
        &lt;br /&gt;
        print &amp;quot;Got a mention, let's party!&amp;quot;&lt;br /&gt;
        print status.from_user_id&lt;br /&gt;
        print status.text&lt;br /&gt;
        &lt;br /&gt;
        relay.set('on')&lt;br /&gt;
        time.sleep(30)&lt;br /&gt;
        relay.set('off')&lt;br /&gt;
        time.sleep(30)&lt;br /&gt;
            &lt;br /&gt;
    last_id = result_set.max_id&lt;br /&gt;
    print &amp;quot;last_id == %s&amp;quot; % str(last_id)&lt;br /&gt;
    &lt;br /&gt;
    time.sleep(30)&lt;br /&gt;
    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
RelayDuino.py&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import sys&lt;br /&gt;
import serial&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RelayDuinoErr(Exception):&lt;br /&gt;
    pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RelayState(object):&lt;br /&gt;
    def __init__(self, value):&lt;br /&gt;
        if isinstance(value, bool):&lt;br /&gt;
            self.value = value&lt;br /&gt;
        elif value in ('ON', 'On', 'on', 'TRUE', 'True', 'true', '1', 1):&lt;br /&gt;
            self.value = True&lt;br /&gt;
        elif value in ('OFF', 'Off', 'off', 'FALSE', 'False', 'false', '0', 0):&lt;br /&gt;
            self.value = False&lt;br /&gt;
        else:&lt;br /&gt;
            raise ValueError(&amp;quot;'%s' is not a valid relay state&amp;quot; % value)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        if self.value:&lt;br /&gt;
            return 'ON'&lt;br /&gt;
        else:&lt;br /&gt;
            return 'OFF'&lt;br /&gt;
            &lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        return self.value == RelayState(other).value&lt;br /&gt;
    &lt;br /&gt;
    def __ne__(self, other): return not self == other&lt;br /&gt;
&lt;br /&gt;
    def __nonzero__(self): return self.value&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    class Relay(object):&lt;br /&gt;
    def __init__(self, relayduino, index):&lt;br /&gt;
        self.relayduino = relayduino&lt;br /&gt;
        self.index = index&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
        def get_state(self):&lt;br /&gt;
        response = self.relayduino.command(&amp;quot;RS %d&amp;quot; % self.index)&lt;br /&gt;
        return RelayState(response)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def set_state(self, state):&lt;br /&gt;
        if RelayState(state):&lt;br /&gt;
            self.relayduino.command(&amp;quot;ON %d&amp;quot; % self.index)&lt;br /&gt;
        else:&lt;br /&gt;
            self.relayduino.command(&amp;quot;OFF %d&amp;quot; % self.index)&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
    get = get_state&lt;br /&gt;
    set = set_state&lt;br /&gt;
    state = property(get_state, set_state)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def toggle(self):&lt;br /&gt;
        self.state = not self.state&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class DigitalInputState(object):&lt;br /&gt;
    def __init__(self, value):&lt;br /&gt;
        if value in (1, 0, '1', '0', True, False):&lt;br /&gt;
            self.value = int(value)&lt;br /&gt;
        elif isinstance(value, str):&lt;br /&gt;
            if value.lower() in ('hi', 'high', 'set'):&lt;br /&gt;
                self.value = 1&lt;br /&gt;
            elif value.lower() in ('lo', 'low', 'clear'):&lt;br /&gt;
                self.value = 0&lt;br /&gt;
            else:&lt;br /&gt;
                raise ValueError(&amp;quot;'%s' is not a valid relay state&amp;quot; % value)&lt;br /&gt;
        else:&lt;br /&gt;
            raise ValueError(&amp;quot;'%s' is not a valid relay state&amp;quot; % value)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def __eq__(self, other):&lt;br /&gt;
        return self.value == DigitalInputState(other).value&lt;br /&gt;
    &lt;br /&gt;
    def __ne__(self, other):&lt;br /&gt;
        return not self == other&lt;br /&gt;
&lt;br /&gt;
    def __nonzero__(self):&lt;br /&gt;
        return self.value&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
class DigitalInput(object):&lt;br /&gt;
    def __init__(self, relayduino, index):&lt;br /&gt;
        self.relayduino = relayduino&lt;br /&gt;
        self.index = index&lt;br /&gt;
        &lt;br /&gt;
    def get_state(self):&lt;br /&gt;
        response = self.relayduino.command(&amp;quot;IS %d&amp;quot; % self.index)&lt;br /&gt;
        return DigitalInputState(response)&lt;br /&gt;
&lt;br /&gt;
    get = get_state&lt;br /&gt;
    state = property(get_state)&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class AnalogInput(object):&lt;br /&gt;
    def __init__(self, relayduino, index):&lt;br /&gt;
        self.relayduino = relayduino&lt;br /&gt;
        self.index = index&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
    def get_value(self):&lt;br /&gt;
        response = self.relayduino.command(&amp;quot;IS %d&amp;quot; % self.index)&lt;br /&gt;
        return float(response)&lt;br /&gt;
&lt;br /&gt;
    get = get_value&lt;br /&gt;
    value = property(get_value)&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
class FractionalAnalogInput(AnalogInput):&lt;br /&gt;
        &lt;br /&gt;
    def get_value(self):&lt;br /&gt;
        raw = super(FractionalAnalogInput, self).get_value()&lt;br /&gt;
        return float(raw) / 1024&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
class RelayDuino(object):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Library with handy functions to connect an Ocean Controls KTA-223 Relay Box&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    delim = '\x0D'&lt;br /&gt;
    default_baudrate = 115200&lt;br /&gt;
&lt;br /&gt;
    def autobaud(self):&lt;br /&gt;
        &lt;br /&gt;
        if self.is_open: self.port.close()&lt;br /&gt;
        &lt;br /&gt;
        for rate in (1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200):&lt;br /&gt;
            try:&lt;br /&gt;
                self._open(rate)&lt;br /&gt;
                print &amp;quot;connected at %d&amp;quot; % rate&lt;br /&gt;
                break&lt;br /&gt;
            except RelayDuinoErr, ex:&lt;br /&gt;
                print &amp;quot;failed to connect at %d\n    %s&amp;quot; % (rate, str(ex))&lt;br /&gt;
                if self.port: self.port.close()&lt;br /&gt;
            &lt;br /&gt;
            time.sleep(0.500)         &lt;br /&gt;
                &lt;br /&gt;
    &lt;br /&gt;
    def __init__ (self, comport_name=None , device_address=0, debug=False):&lt;br /&gt;
&lt;br /&gt;
        self.comport_name = comport_name&lt;br /&gt;
        self.device_address = device_address&lt;br /&gt;
        self.port = None&lt;br /&gt;
        self.debug_flag = debug&lt;br /&gt;
        &lt;br /&gt;
        self.relay  = tuple([Relay(self, idx+1) for idx in range(8)])&lt;br /&gt;
        self.input  = tuple([DigitalInput(self, idx+1) for idx in range(4)])&lt;br /&gt;
        self.analog = tuple([AnalogInput(self, idx+1) for idx in range(3)])&lt;br /&gt;
        self.analog_fractional = tuple([FractionalAnalogInput(self, idx+1) for idx in range(3)])&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    def _open(self, rate=None):&lt;br /&gt;
        &lt;br /&gt;
        if rate==None:&lt;br /&gt;
            rate = self.default_baudrate&lt;br /&gt;
        try:&lt;br /&gt;
            self.port = serial.Serial(self.comport_name, baudrate=rate, timeout=0.100, dsrdtr=False, rtscts=False)&lt;br /&gt;
            self.port.flushInput()&lt;br /&gt;
            self.port.write(&amp;quot;@00 RS 0&amp;quot; + self.delim)&lt;br /&gt;
            self.port.setRTS(False)&lt;br /&gt;
            response = self.port.readline(None, self.delim)&lt;br /&gt;
            pass&lt;br /&gt;
        except Exception, ex:&lt;br /&gt;
            raise RelayDuinoErr(&amp;quot;Can't talk to relay box on port '%s' (%s)&amp;quot; % (self.comport_name, str(ex)))&lt;br /&gt;
        else:&lt;br /&gt;
            pass&lt;br /&gt;
        &lt;br /&gt;
        if response.startswith('#'):&lt;br /&gt;
            pass&lt;br /&gt;
        else:&lt;br /&gt;
            raise RelayDuinoErr(&amp;quot;Can't talk to relay box on port '%s' response=(%s)(%d) port=&amp;lt;%s&amp;gt;&amp;quot; % (self.comport_name, response,  len(response), str(self.port)))&lt;br /&gt;
            pass&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
    def command(self, cmd):&lt;br /&gt;
        if not self.is_open:&lt;br /&gt;
            self._open()&lt;br /&gt;
            &lt;br /&gt;
        send_str = (&amp;quot;@%02d %s&amp;quot; + self.delim) % (self.device_address, cmd)&lt;br /&gt;
        if self.debug_flag:&lt;br /&gt;
            sys.stderr.write((&amp;quot;tx: %s\n&amp;quot;) % repr(send_str))&lt;br /&gt;
        &lt;br /&gt;
        self.port.setRTS(True)&lt;br /&gt;
        self.port.write(send_str)&lt;br /&gt;
        &lt;br /&gt;
        self.port.setRTS(False)&lt;br /&gt;
        response = self.port.readline(None, self.delim)&lt;br /&gt;
        if self.debug_flag:&lt;br /&gt;
            sys.stderr.write(&amp;quot;rx: %s\n&amp;quot; % repr(response))&lt;br /&gt;
        return response[5:-1]&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    &lt;br /&gt;
    def __del__(self):&lt;br /&gt;
        try:&lt;br /&gt;
            self.port.close()&lt;br /&gt;
        except:&lt;br /&gt;
            pass&lt;br /&gt;
        &lt;br /&gt;
    @property&lt;br /&gt;
    def is_open(self):&lt;br /&gt;
        return self.port != None and self.port.isOpen()&lt;br /&gt;
&lt;br /&gt;
    def ss(self):&lt;br /&gt;
        return self.command(&amp;quot;SS&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    import time&lt;br /&gt;
    &lt;br /&gt;
    kta223 = RelayDuino(sys.argv[1], 0)&lt;br /&gt;
    &lt;br /&gt;
    #kta223.autobaud()&lt;br /&gt;
    #if not kta223.is_open: sys.exit()    &lt;br /&gt;
&lt;br /&gt;
    for io_list in (kta223.relay, kta223.input, kta223.analog):&lt;br /&gt;
        for n in range(len(io_list)):&lt;br /&gt;
            print &amp;quot;%s number %d is %s&amp;quot; % (type(io_list[n]), n, io_list[n].get())&lt;br /&gt;
&lt;br /&gt;
    kta223.relay[0].set('on')&lt;br /&gt;
    &lt;br /&gt;
    time.sleep(1)&lt;br /&gt;
    &lt;br /&gt;
    kta223.relay[0].set('off')&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Projects]]&lt;/div&gt;</summary>
		<author><name>Kc8nod</name></author>	</entry>

	</feed>