2016-09-22 61 views
0

次のコードをループで連続して実行しようとしています。しかし、次のコードは1回だけ実行され、1つのメッセージエントリしか使用しません。paho mqttクライアントを実行するloop_forever

私はon_message関数の中で何をしようとしているのですが、python apschedulerを使ってcronタスクを実行します。

def on_message(mqttc, obj, msg): 
     global val 
     val = str(msg.payload) 
     print val 
     dow = val[0:3] 
     print dow 
     hr = val[4:6] 
     print hr 
     min = val[7:9] 
     print min 
     status = val[10:11] 
     print status 
     def plugON(): 
       publish.single("plug/status","0", hostname="localhost") 
     def plugOFF(): 
       publish.single("plug/status","1", hostname="localhost") 
     def cronon(): 
       print "cron on" 
     def cronoff(): 
       print "cron off" 
     if status == '0': 
       sched.add_job(plugON, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=min, id='plugon') 
       sched.add_job(cronon, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=min) 

     if status == '1': 
       sched.add_job(plugOFF, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=min, id='plugoff') 
       sched.add_job(cronoff, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=min) 

     sched.start() 

MQTTスクリプト接続:実行中

mqttc = mqtt.Client() 
mqttc.on_message = on_message 
mqttc.on_connect = on_connect 
mqttc.on_publish = on_publish 
mqttc.on_subscribe = on_subscribe 
mqttc.connect("localhost", 1883, 60) 
mqttc.subscribe("plug/#", 0) 

#mqtt loop 
mqttc.loop_forever() 

を、それは、localhostに接続して単一のエントリを取ります。 thu:05:47:0のようなものを送って、5:47までplugins/plugOFFを実行するのを待ちます。 5:47で、関数を実行し、ローカルホストとの接続を切断します。

コードを取得して別のエントリを取得し、ループを続けることはできますか?

+0

してください詳細にスケジューラを起動しているモード

  • をブロッキングapshedulerを使用しています – 2114L3

  • 答えて

    -1

    いくつかの問題。

    あなたのpython、apscheduler、MQTTとあなたは私があなたのことを考えるのpython3とapscheduler3.2でこれをテストしon_connect

    のようなトラブルシューティングのために、あなたの輸入、いくつかの有用な機能を省略しているのバージョンを詳細に説明していません。

    1. BackgroundSchedulerの代わりにBlockingSchedulerを使用しています(これは、最初のmsgですべて停止している可能性があります)。 bgschedulerは停止せず、イベントを待機します。
    2. スケジューラを関数内で開始しています。スケジューリングを宣言するときにこれを一度実行してください。後で心配する必要はありません。
    3. あなたはschedを宣言していません(またはあなたのペーストをカットしました)
    4. 宣言されたmqttインスタンスで正しく呼び出すことができませんでした。あなたのペーストされたコードで見ることができない何か他のことをしている。
    5. paho publishには 'single'というメソッドはありませんか?
    6. add_jobで静的IDを使用すると、2番目のジョブのスケジュール設定に問題が発生します。あなたは再利用されているIDから例外をスローします。しかし、私はあなたの使用の詳細を知らない。

    あなたは、あなたが「スタンドアローンモード」の概念がなくなっているstandalone=false

    を設定することができるはずthisを見APS < 3を使用している場合。 standalone = Trueの場合は、代わりに BlockingSchedulerを使用し、standalone = Falseの場合は BackgroundSchedulerを使用してください。 BackgroundSchedulerは古いデフォルトの セマンティクスと一致します。

    #!/usr/bin/env python 
    import paho.mqtt.client as mqtt 
    #from apscheduler.schedulers.blocking import BlockingScheduler 
    from apscheduler.schedulers.background import BackgroundScheduler 
    
    # Start the scheduler 
    sched = BackgroundScheduler() 
    sched.start() 
    
    def on_message(mqttc, obj, msg): 
         global val 
         val = str(msg.payload.decode('utf-8')) 
         dow = val[0:3] 
         hr = val[4:6] 
         minu = val[7:9] 
         status = val[10:11] 
    
         print(str(val) +" "+ dow +" "+ hr +" "+ minu +" "+ status) 
    
         def plugON(): 
           mqttc.publish("plug/status","0") 
         def plugOFF(): 
           mqttc.publish("plug/status","1") 
         def cronon(): 
           print("cron on") 
         def cronoff(): 
           print("cron off") 
    
         try: 
           if status == '0': 
             sched.add_job(plugON, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=minu, id='plugon') 
             sched.add_job(cronon, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=minu) 
    
           if status == '1': 
             sched.add_job(plugOFF, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=minu, id='plugoff') 
             sched.add_job(cronoff, trigger='cron', year='*', month='*', day='*', week='*', day_of_week=dow, hour=hr, minute=minu) 
         except: 
           print("whoops") 
           sched.print_jobs() 
    
    
    
    
    mqttc = mqtt.Client() 
    mqttc.on_message = on_message 
    #mqttc.on_connect = on_connect 
    #mqttc.on_publish = on_publish 
    #mqttc.on_subscribe = on_subscribe 
    mqttc.connect("local", 1883, 60) 
    mqttc.subscribe("plug/#") 
    
    #mqtt loop 
    mqttc.loop_forever() 
    

    コードはpython3.5.2とapschedulerv3.2とPAHO-mqttv1で作業としてを試験しました。2

    TL:DR

    • あなたはあなたの質問が正しく回答されていない場合は、すべてのON_MESSAGEコール
    関連する問題