<!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;">das mit den Sensoren sollte gehen. Thomas, danke schonmal dafür. Kannst du mir in etwa sagen, was ich falsch gemacht habe? Da muss dann noch ein bisschen dran gedreht werden, das Ding soll ja Statements aus dem Space raushauen. Und wofür ist die config.json? Was muss da rein?</p>
<p style="margin:0px;padding:0px;"> </p>
<p style="margin:0px;padding:0px;">Grüße</p>
<p style="margin:0px;padding:0px;">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: "Dr Holger Hewener" [<a href="mailto:holger@hewener.net">holger@hewener.net</a>]<br /> Gesendet: Fr. 14.06.2013 08:13<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>...ohne groß da rein geschaut zu haben fände ich es cool ein Hygrometer und einen Helligkeitssensor mit einzubinden. Kann man die da mit auswerten? Hardware könnte per COM Port die Infos senden..</div>
<div>Holger</div>
<div><br />Am 13.06.2013 um 23:24 schrieb Thomas Darimont <<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>>:<br /><br /></div>
<blockquote>
<div>
<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>
</div>
</blockquote>
<blockquote>
<div><span>_______________________________________________</span><br /><span>Public mailing list</span><br /><span><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></span><br /><span><a href="http://lists.hacksaar.de/cgi-bin/mailman/listinfo/public" target="_blank">http://lists.hacksaar.de/cgi-bin/mailman/listinfo/public</a></span></div>
</blockquote>
</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>