#!/usr/bin/env python3 """ OSC/Random Example: send random numbers to OSC. This example sends a pseudo-random number between 0 and 1024 to the OSC receiver on UDP port 2222. """ from pythonosc import udp_client from pythonosc import osc_message_builder import time import os import time # import urllib library import urllib.request import urllib.error # import json import json # import argparse import argparse debug_p = False debug_flag = True debug_args = True debug_working_directory = os.path.dirname(os.path.realpath(__file__)) prod_flag = False prod_working_directory = "/usr/local/com.fup.anemometre_daemon" meteobridge_template = "cgi-bin/template.cgi?template={%22time%22:%22[DD][MM][YYYY][hh][mm][ss]%22,%22speed%22:[wind0wind-act],%22lastspeed%22:[wind0wind-lastval],%22battery%22:[wind0lowbat-act.0],%22wind-age%22:[wind0wind-age],%22signal%22:[wind0signal-act.0]}" def main(meteobridge_url, meteobridge_user, meteobridge_passwd, max_host, max_port): oscSender = udp_client.UDPClient(max_host, max_port) # http log to meteobridge passman = urllib.request.HTTPPasswordMgrWithDefaultRealm() passman.add_password(None, meteobridge_url, meteobridge_user, meteobridge_passwd) authhandler = urllib.request.HTTPBasicAuthHandler(passman) opener = urllib.request.build_opener(authhandler) urllib.request.install_opener(opener) try: res = urllib.request.urlopen(meteobridge_url) except urllib.error.HTTPError as e: print('HTTP Error code: ', e.code) raise SystemExit(e) except urllib.error.URLError as e: print('URL Error Reason: ', e.reason) raise SystemExit(e) else: res_body = res.read() print(res_body.decode('utf-8')) meteobridge_sensor_req = meteobridge_url + meteobridge_template while True: # logger.debug("this is a DEBUG message") # logger.info("this is an INFO message") # logger.error("this is an ERROR message") # store the response of URL try: response = urllib.request.urlopen(meteobridge_sensor_req) except urllib.error.HTTPError as e: print('HTTP Error code: ', e.code) raise SystemExit(e) except urllib.error.URLError as e: print('URL Error Reason: ', e.reason) raise SystemExit(e) # storing the JSON response # from url in data try: data_json = json.loads(response.read()) print(data_json) wind_speed = float(data_json["speed"]) wind_lastspeed = float(data_json["lastspeed"]) wind_batt = int(data_json["battery"]) wind_age = int(data_json["wind-age"]) wind_signal = int(data_json["signal"]) except json.JSONDecodeError as e: print("Invalid JSON syntax:", e) msg = osc_message_builder.OscMessageBuilder(address = "/env_sensors/anemometer/error") msg.add_arg(1) oscSender.send(msg.build()) # print the json response # print(data_json) else: msg = osc_message_builder.OscMessageBuilder(address = "/env_sensors/anemometer/speed") msg.add_arg(wind_lastspeed) oscSender.send(msg.build()) msg = osc_message_builder.OscMessageBuilder(address = "/env_sensors/anemometer/battery") msg.add_arg(wind_batt) oscSender.send(msg.build()) msg = osc_message_builder.OscMessageBuilder(address = "/env_sensors/anemometer/age") msg.add_arg(wind_age) oscSender.send(msg.build()) msg = osc_message_builder.OscMessageBuilder(address = "/env_sensors/anemometer/signal") msg.add_arg(wind_signal) oscSender.send(msg.build()) msg = osc_message_builder.OscMessageBuilder(address = "/env_sensors/anemometer/error") msg.add_arg(0) oscSender.send(msg.build()) time.sleep(1) if __name__ == "__main__": parser = argparse.ArgumentParser(description="FUP anemometer for OSC") parser.add_argument('-url', '--url-meteobridge', default='http://192.168.0.39/') parser.add_argument('-u', '--user-meteobridge', default='meteobridge') parser.add_argument('-p', '--passwd-meteobridge',default='meteobridge') parser.add_argument('-mh', '--max-host', default='localhost') parser.add_argument('-mp','--max-port', default=2222) args = parser.parse_args() # if debug_args is True, print arguments if debug_args: print('Meteobridge URL:', args.url_meteobridge) print('Meteobridge User:', args.user_meteobridge) print('Meteobridge Password:', args.passwd_meteobridge) print('OSC host:', args.max_host) print('OSC port:', args.max_port) main(meteobridge_url=args.url_meteobridge, meteobridge_user=args.user_meteobridge, meteobridge_passwd=args.passwd_meteobridge, max_host=args.max_host, max_port=args.max_port)