EvaluationEfficiencyOptimiz.../davisAPI/PyWeather/weather/services/_base.py

65 lines
1.8 KiB
Python
Raw Normal View History

2024-10-08 17:47:23 +04:00
'''
Common base classes for PyWeather pulication services.
'''
import logging
log = logging.getLogger(__name__)
class PublishException(Exception):
pass
class HttpPublisher(object):
'''
Abstract base class for creation generic HTTP publication services
'''
SOFTWARE = 'PyWeather'
STD_SERVER = None
REALTIME_SERVER = None
URI = None
def __init__(self, sid, password, rtfreq=None):
self.sid = sid
self.password = password
self.rtfreq = rtfreq
def set(self, *args, **kw):
'''
Useful for defining weather data published to the server. Each
publication service implements their own supported keyword args, but
should support any number of arguments.
'''
raise NotImplementedError("abstract method")
@staticmethod
def _publish(args, server, uri):
from http.client import HTTPConnection, HTTPSConnection
from urllib.parse import urlencode
args = {k: v for k, v in args.items() if v is not None and v != 'NA'}
uri = uri + "?" + urlencode(args)
log.debug('Connect to: https://%s' % server)
log.debug('GET %s' % uri)
conn = HTTPSConnection(server, timeout=5)
if not conn:
raise PublishException('Remote server connection timeout')
conn.request("GET", uri)
http = conn.getresponse()
data = (http.status, http.reason, http.read())
conn.close()
if not (data[0] == 200 and data[1] == 'OK'):
raise PublishException(
'Server returned invalid status: %d %s %s' % data)
return data
def publish(self):
'''
Perform HTTP session to transmit defined weather values.
'''
return self._publish(self.args, self.server, self.URI)