<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><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 href="mailto:thomas.darimont@googlemail.com">thomas.darimont@googlemail.com</a>>:<br><br></div><blockquote type="cite"><div><div dir="ltr">Hallo zusammen,<div><br></div><div style="">hier noch für die, die es interessiert ein "kleiner" Twitter-Client für Pflanzen und sonstige Mitteilungsfreudigen Erdbewohner. </div><div style=""><br></div><div style="">
Dazu benötigt man folgende dependencies:</div><div style=""><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 style=""><br></div><div style="">
[code]</div><div style=""><div>__author__ = 'Tom'</div><div><br></div><div>import sys</div><div>import time</div><div>import twitter</div><div>import simplejson</div><div>import datetime</div><div><br></div><div><br>
</div><div>class PlantTwitterClient(object):</div><div>    PLANT_STATE_NEED_WATER = "need_water"</div><div>    PLANT_STATE_FINE = "fine"</div><div><br></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><br></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><br></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><br></div><div><br></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><br></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><br></div><div>    def readPlantState(self):</div><div>        #insert code for real sensor reading here :)</div><div><br></div><div>        #faking random sensor values...</div><div>        import random</div><div><br>
</div><div>        plantState = random.choice((self.PLANT_STATE_NEED_WATER, self.PLANT_STATE_FINE))</div><div>        return plantState</div><div><br></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><br></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><br></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><br></div><div>    def run(self):</div><div>        oldPlantState = None</div>
<div>        while True:</div><div>            try:</div><div>                newPlantState = self.readPlantState()</div><div><br></div><div>                if oldPlantState != newPlantState:</div><div>                    self.handlePlantStateChange(oldPlantState, newPlantState)</div>
<div><br></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><br></div><div><br></div><div>if __name__ == "__main__":</div>
<div>    if len(sys.argv) < 2:</div><div>        print "Missing config path argument is required!"</div><div><br></div><div>        print '''Usage:</div><div>        python PlantTwitterClient.py path/to/config.json</div>
<div>        '''</div><div>        sys.exit(0)</div><div><br></div><div>    plantTwitterClient = PlantTwitterClient(configPath=str(sys.argv[1]))</div><div>    plantTwitterClient.run()</div><div><br></div><div style="">
[/code]</div></div><div><br></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 href="mailto:thomas.darimont@googlemail.com" target="_blank">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"><br></div><div class="gmail_quote">
wenn du mir mal Bertas Twitter-Credentials schickst kann ich mal danach schauen.</div>
<div class="gmail_quote"><br></div><div class="gmail_quote">Gruß Thomas<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">Am 13.06.2013 21:27 schrieb "Michael Ganster" <<a href="mailto:mganster@freenet.de" target="_blank">mganster@freenet.de</a>>:<div>
<div class="h5"><br type="attribution">
<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 href="mailto:Public@lists.hacksaar.de" target="_blank">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><br></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Public mailing list</span><br><span><a href="mailto:Public@lists.hacksaar.de">Public@lists.hacksaar.de</a></span><br><span><a href="http://lists.hacksaar.de/cgi-bin/mailman/listinfo/public">http://lists.hacksaar.de/cgi-bin/mailman/listinfo/public</a></span><br></div></blockquote></body></html>