Python loop for posting data to web - Printable Version +- Python Forum (https://python-forum.io) +-- Forum: Python Coding (https://python-forum.io/forum-7.html) +--- Forum: General Coding Help (https://python-forum.io/forum-8.html) +--- Thread: Python loop for posting data to web (/thread-40365.html) Pages:
1
2
|
Python loop for posting data to web - marciokoko - Jul-17-2023 I got this code for posting data to thingspeak from a raspberry pi (zero): #!/usr/local/bin/python3 from envirophat import light, motion, weather, leds import thingspeak import time from datetime import datetime # Structure of the record - semicolon separated: # UNIX timestamp;ISO date; light; rgb; motion; heading; temp (celsius); pressure (hPa) # your ThnkSpeak Channel and API Write Key channel_id="123" api_key="456" thingspeak_data = {} try: now = datetime.now() ch = thingspeak.Channel(channel_id, api_key) timestamp = round(datetime.timestamp(now)) cas = now.isoformat() leds.off() lux = light.light() print('%s;%s;%.1f' % (timestamp,cas,lux)) thingspeak_data['field1'] = cas thingspeak_data['field2'] = lux response = ch.update(thingspeak_data) leds.off() except KeyboardInterrupt: leds.off()When I run the script from the terminal using the python command it works and posts once of course. But I need it to post every few minutes, so I did this. Replaced try: with while True: and added time.sleep(1800): #!/usr/local/bin/python3 from envirophat import light, motion, weather, leds import thingspeak import time from datetime import datetime # Structure of the record - semicolon separated: # UNIX timestamp;ISO date; light; rgb; motion; heading; temp (celsius); pressure (hPa) # your ThnkSpeak Channel and API Write Key channel_id="123" api_key="456" thingspeak_data = {} #try: while True: now = datetime.now() ch = thingspeak.Channel(channel_id, api_key) timestamp = round(datetime.timestamp(now)) cas = now.isoformat() leds.off() lux = light.light() print('%s;%s;%.1f' % (timestamp,cas,lux)) thingspeak_data['field1'] = cas thingspeak_data['field2'] = lux response = ch.update(thingspeak_data) leds.off() time.sleep(1800) #except KeyboardInterrupt: # leds.off()It works, but only runs a few times and then stops after about the 3rd time. Why? Mars RE: Python loop for posting data to web - deanhystad - Jul-17-2023 I think you want to move this outside the loop. ch = thingspeak.Channel(channel_id, api_key)I wouldn't be surprised if disposing of a channel object is messing up your connection. I also think you should remove this from the loop and have it only happen when the loop is done. leds.off()You should also put the keyboard interrupt exception handler back in. I don't know what you want to do with the LED's, so I turn them on for as long as the program is running. #!/usr/local/bin/python3 from envirophat import light, motion, weather, leds import thingspeak from datetime import datetime import time channel_id="123" api_key="456" ch = thingspeak.Channel(channel_id, api_key) leds.on() # ?? try: while True: cas = datetime.now().isoformat() lux = light.light() print(cas, lux) print(ch.update({'field1': cas, 'field2': lux})) # Maybe the reply has useful info time.sleep(20) # Speed up for testing except KeyboardInterrupt: pass leds.off() RE: Python loop for posting data to web - marciokoko - Jul-18-2023 Ok here is how I run the script on reboot: @reboot python3 /home/mkzero/envirophat2.py &And here is the code I ended up with based on your suggestion: #!/usr/local/bin/python3 from envirophat import light, motion, weather, leds import thingspeak import time from datetime import datetime # Structure of the record - semicolon separated: # UNIX timestamp;ISO date; light; rgb; motion; heading; temp (celsius); pressure (hPa) channel_id="123" api_key="456" thingspeak_data = {} leds.on() ch = thingspeak.Channel(channel_id, api_key) try: while True: now = datetime.now() #ch = thingspeak.Channel(channel_id, api_key) timestamp = round(datetime.timestamp(now)) cas = now.isoformat() #leds.off() lux = light.light() rgb = str(light.rgb())[1:-1].replace(' ', '') #leds.on() acc = str(motion.accelerometer())[1:-1].replace(' ', '') heading = motion.heading() temp = weather.temperature() press = round(weather.pressure()/100) print('%s;%s;%.1f;%s;%s;%.1f;%.1f;%.1f' % (timestamp,cas,lux, rgb, acc, heading, temp, press)) thingspeak_data['field1'] = cas thingspeak_data['field2'] = lux thingspeak_data['field3'] = rgb thingspeak_data['field4'] = acc thingspeak_data['field5'] = heading thingspeak_data['field6'] = temp thingspeak_data['field7'] = press response = ch.update(thingspeak_data) #leds.off() time.sleep(18) except KeyboardInterrupt: pass leds.off()But when i run it from the terminal like so: python3 envirophat2.pyIt runs fine, begins logging to the cloud and the terminal. ut when i reboot the pi so that it runs the crontab command with that script, nothing gets logged. Is my crontab command right? What am I missing? (Jul-17-2023, 08:39 PM)deanhystad Wrote: I think you want to move this outside the loop. RE: Python loop for posting data to web - deanhystad - Jul-19-2023 To schedule with crontab you should get rid of the loop and the sleep. Let crontab schedule how often you update the channel. From what I can find online, the way to run a python script using crontab is make he python file executable (chmod +x) and add a shebang to the python file. You already have the shebang. Your crontab entry to run you script every 30 minutes would look like "/30 * * * * /home/mkzero/envirophat2.py" RE: Python loop for posting data to web - marciokoko - Jul-19-2023 Ok I’ll try that but it’s weird because I have animo their script that runs fine without making the file executable. (Jul-19-2023, 05:17 PM)deanhystad Wrote: To schedule with crontab you should get rid of the loop and the sleep. Let crontab schedule how often you update the channel. RE: Python loop for posting data to web - deanhystad - Jul-20-2023 Where is your python3? Maybe you need to provide complete path? RE: Python loop for posting data to web - marciokoko - Jul-20-2023 Ok and how do I do that? I believe I have installed both 2.7 and 3. How do I get the path for each? I know i have 3.9.2 from doing python -V and this: mkzero@raspberrypi:~ $ which python /usr/bin/python mkzero@raspberrypi:~ $ which python2 /usr/bin/python2 mkzero@raspberrypi:~ $ which python3 /usr/bin/python3 RE: Python loop for posting data to web - marciokoko - Jul-20-2023 Ok sorry to jump around but i decided to move it to rc.local because i remember reading (might be wrong though) that sometimes crontab starts up too fast and scripts arent run because certain "things" arent yet loaded or something along those lines. So i decided to move it to rc.local and did this plus added a logging bit I found and got this in the txt file: rc.local: #added jul20 2023 sudo python /home/mkzero/envirophat2.py > /home/mkzero/logrc.txt 2>&1 exit 0results: Traceback (most recent call last): Quote: File "/home/mkzero/envirophat2.py", line 3, in <module> which is weird because im pretty sure it DID log results at some point. Of course then I noticed i was using python instead of python3, so i changed the command line to: #added jul20 2023 sudo python3 /home/mkzero/envirophat2.py > /home/mkzero/logrc.txt 2>&1 exit 0and the logrc file is now empty but Im still not getting any logged data on the cloud. But when I run the command from the terminal directly using python (and python3) it works, logging data to the cloud & terminal. (Jul-20-2023, 10:25 PM)marciokoko Wrote: Ok and how do I do that? I believe I have installed both 2.7 and 3. How do I get the path for each? RE: Python loop for posting data to web - marciokoko - Jul-27-2023 Hi guys, just wanted to bump this thread because I've made no progress on this situation. For some reason the script isnt running at the start in rc.local but it does run from the terminal using the python command. Any ideas why that might happen? Thx RE: Python loop for posting data to web - marciokoko - Aug-25-2023 bump again...help anyone? I still havent been able to figure this out... |