<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//DE"><HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><TITLE></TITLE></HEAD><BODY><div style="font-family:arial,helvetica,sans-serif;font-size:10pt;"><p style="margin:0px;padding:0px;">okay, ich nehm alles zurück und behaupte das Gegenteil, config.json ist ja okay, aber irgendwie steig ich noch nicht überall durch. Können wir uns am Mittwoch mal noch kurz zusammensetzen, Thomas?</p>
<p style="margin:0px;padding:0px;"> </p>
<p style="margin:0px;padding:0px;">LG<br />Micha</p>
<p style="margin:0px;padding:0px;"> </p>
<table style="padding-left: 10px;" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="font-family: Arial; font-size: 11px;" colspan="2">-----Ursprüngliche Nachricht-----<br /> Von: "Thomas Darimont" [<a href="mailto:thomas.darimont@googlemail.com">thomas.darimont@googlemail.com</a>]<br /> Gesendet: Do. 13.06.2013 23:24<br /> An: "Öffentliche Liste Technik Kultur Saar e.V." [<a href="mailto:public@lists.hacksaar.de">public@lists.hacksaar.de</a>]<br /> Betreff: Re: [Public] Python und Twitter, ein Trauerspiel<br /><br /></td>
</tr>
<tr>
<td style="padding-left: 20px;" colspan="2" width="100%">
<div dir="ltr">Hallo zusammen,
<div>hier noch für die, die es interessiert ein "kleiner" Twitter-Client für Pflanzen und sonstige Mitteilungsfreudigen Erdbewohner. </div>
<div>Dazu benötigt man folgende dependencies:</div>
<div>
<div>httplib2-0.8</div>
<div>python-oauth2</div>
<div>python-twitter-1.0</div>
<div>setuptools-0.7.2</div>
<div>simplejson-3.3.0</div>
</div>
<div>[code]</div>
<div>
<div>__author__ = 'Tom'</div>
<div>import sys</div>
<div>import time</div>
<div>import twitter</div>
<div>import simplejson</div>
<div>import datetime</div>
<div>class PlantTwitterClient(object):</div>
<div>    PLANT_STATE_NEED_WATER = "need_water"</div>
<div>    PLANT_STATE_FINE = "fine"</div>
<div>    STATE_TO_TWEET_MAP = {</div>
<div>        PLANT_STATE_NEED_WATER: "%s hat Durst!"</div>
<div>        , PLANT_STATE_FINE: "%s geht es gut!"</div>
<div>    }</div>
<div>    def __init__(self, configPath):</div>
<div>        self.loadConfig(configPath)</div>
<div>        self.plantName = self.config["plant"]["name"]</div>
<div>        self.plantHealthCheckIntervalInSeconds = self.config["plant"]["healthCheckIntervalInSeconds"]</div>
<div>        self.twitterClient = self.newTwitterClient()</div>
<div>    def log(self, msg):</div>
<div>        now = datetime.datetime.now()</div>
<div>        print "[%s]: %s" % (now.strftime("%Y-%m-%d %H:%M"), msg)</div>
<div>    def loadConfig(self, configPath):</div>
<div>        try:</div>
<div>            self.log("Load config from %s" % configPath)</div>
<div>            self.config = simplejson.load(open(configPath))</div>
<div>        except:</div>
<div>            self.log("Could not load config from: %s -> Problem was: %s" % (configPath, sys.exc_info()[0]))</div>
<div>            sys.exit(-1)</div>
<div>    def newTwitterClient(self):</div>
<div>        twitterClient = twitter.Api(consumer_key=self.config["twitter"]["consumer_key"]</div>
<div>            , consumer_secret=self.config["twitter"]["consumer_secret"]</div>
<div>            , access_token_key=self.config["twitter"]["access_token_key"]</div>
<div>            , access_token_secret=self.config["twitter"]["access_token_secret"])</div>
<div>        return twitterClient</div>
<div>    def readPlantState(self):</div>
<div>        #insert code for real sensor reading here :)</div>
<div>        #faking random sensor values...</div>
<div>        import random</div>
<div>        plantState = random.choice((self.PLANT_STATE_NEED_WATER, self.PLANT_STATE_FINE))</div>
<div>        return plantState</div>
<div>    def composeTweet(self, state):</div>
<div>        tweet = self.STATE_TO_TWEET_MAP[state] % (self.plantName)</div>
<div>        now = datetime.datetime.now()</div>
<div>        return "[%s] %s" % (now.strftime("%H:%M:%S"), tweet)</div>
<div>    def sendTweetForState(self, state):</div>
<div>        now = datetime.datetime.now()</div>
<div>        tweet = self.composeTweet(state)</div>
<div>        if self.config["twitter"]["enabled"]:</div>
<div>            self.log("Sending Twitter Update: %s" % tweet)</div>
<div>            self.twitterClient.PostUpdate(tweet)</div>
<div>        else:</div>
<div>            self.log("Twitter is disabled - just logging tweet instead: %s" % tweet)</div>
<div>    def handlePlantStateChange(self, oldPlantState, newPlantState):</div>
<div>        self.log("Plant State Changed! %s -> %s" % (oldPlantState, newPlantState))</div>
<div>        self.sendTweetForState(newPlantState)</div>
<div>    def run(self):</div>
<div>        oldPlantState = None</div>
<div>        while True:</div>
<div>            try:</div>
<div>                newPlantState = self.readPlantState()</div>
<div>                if oldPlantState != newPlantState:</div>
<div>                    self.handlePlantStateChange(oldPlantState, newPlantState)</div>
<div>                oldPlantState = newPlantState</div>
<div>                time.sleep(self.plantHealthCheckIntervalInSeconds)</div>
<div>            except KeyboardInterrupt:</div>
<div>                self.log("Exit [ctrl+c]")</div>
<div>                sys.exit(0)</div>
<div>            except:</div>
<div>                self.log("Unknown Error occured: %s" % sys.exc_info()[0])</div>
<div>if __name__ == "__main__":</div>
<div>    if len(sys.argv) < 2:</div>
<div>        print "Missing config path argument is required!"</div>
<div>        print '''Usage:</div>
<div>        python PlantTwitterClient.py path/to/config.json</div>
<div>        '''</div>
<div>        sys.exit(0)</div>
<div>    plantTwitterClient = PlantTwitterClient(configPath=str(sys.argv[1]))</div>
<div>    plantTwitterClient.run()</div>
<div>[/code]</div>
</div>
<div>Gruß Thomas</div>
</div>
<div class="gmail_extra"><br /><br />
<div class="gmail_quote">Am 13. Juni 2013 21:54 schrieb Thomas Darimont <span dir="ltr"><<a onclick="parent.EMO.popup('/Email/View/MsgEdit?account=mganster@freenet.de&to=thomas.darimont@googlemail.com',675,560,false,false,false);" href="#">thomas.darimont@googlemail.com</a>></span>:<br />
<blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;">
<div dir="ltr">
<div class="gmail_quote">Hallo Michael,</div>
<div class="gmail_quote">wenn du mir mal Bertas Twitter-Credentials schickst kann ich mal danach schauen.</div>
<div class="gmail_quote">Gruß Thomas</div>
<div class="gmail_quote">Am 13.06.2013 21:27 schrieb "Michael Ganster" <<a onclick="parent.EMO.popup('/Email/View/MsgEdit?account=mganster@freenet.de&to=mganster@freenet.de',675,560,false,false,false);" href="#">mganster@freenet.de</a>>:
<div>
<div class="h5"><br />
<blockquote class="gmail_quote" style="margin: 0 0 0 .8ex; border-left: 1px #ccc solid; padding-left: 1ex;">Heyho alle miteinander,<br /> <br /> wie einige schon wissen, hat unser Space eine neue Bewohnerin, Bertha,<br /> ein Bogenhanf. Bertha hat auch Twitter. Leider aber keine Arme samt<br /> Händen und daran hängenden Fingern zum tippen. Also ist Bertha auf<br /> unsere Hilfe angewiesen. Da unter Umständen immer wieder jemand Anderes<br /> anwesend ist, wenn Bertha den Zwitscherbefehl erteilt, ist es nicht<br /> praktikabel, sich immer bei Twitter anzumelden. Es soll also eine<br /> Bertha-Base her, die nach Antriggern postet, was auch immer gepostet<br /> werden muss. Realisierbar ist das wohl ganz nett in Python mittels<br /> Twitter-Modul.<br /> <br /> Nunja, im Moment bin ich an den ersten Tests und ich bin sowohl in<br /> Sachen Twitter als auch in Python ein Anfänger. Daher mal schnell die<br /> Webtutorials gewälzt, die alle auf die gleiche Quelle verweisen und<br /> daher alle gleich aussehen und die ich soweit übernommen hab. Alle<br /> zwischendurch aufgetretenen Fehler sind behoben, das Ding läuft ohne<br /> Fehler ab. Nur leider erscheint kein Tweet für unseren Bogenhanf. Hier<br /> mal, was ich so abgesetzt hab:<br /> <br /> >>> import twitter<br /> >>> api = twitter.Api(consumer_key='key_censored', consumer_secret='so<br /> is this one', access_token_key='no one should care about this',<br /> access_token_secret='look anywhere else, it's my secret!')<br /> >>>out = bertha.PostUpdate('Python knows triggering twitter!')<br /> >>> print out.text<br /> None<br /> >>> print out<br /> {}<br /> <br /> <br /> Es erscheint also weder ein Tweet noch eine Fehlermeldung. Hat<br /> irgendjemand eine Idee?<br /> <br /> LG<br /> Micha<br /> <br /> _______________________________________________<br /> Public mailing list<br /> <a onclick="parent.EMO.popup('/Email/View/MsgEdit?account=mganster@freenet.de&to=Public@lists.hacksaar.de',675,560,false,false,false);" href="#">Public@lists.hacksaar.de</a><br /> <a href="http://lists.hacksaar.de/cgi-bin/mailman/listinfo/public" target="_blank">http://lists.hacksaar.de/cgi-bin/mailman/listinfo/public</a><br /></blockquote>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</td>
</tr>
</tbody>
</table>
<p style="margin:0px;padding:0px;"><span style="font-family: Arial; font-size: 11px;">-----Ursprüngliche Nachricht Ende-----</span></p></div><br><br>---<br><div style="font-family:arial;font-size:10pt;">Alle Postfächer an einem Ort. Jetzt wechseln und E-Mail-Adresse mitnehmen! <a style="font-family:arial;font-size:10pt;" href="http://email.freenet.de/produkte/basic/index.html" target="_blank">Rundum glücklich mit freenetMail</a></div>
</BODY></HTML>