annotate weatherlog/types.py @ 14:c01f9929ae38

Make logger and HTTP writer more general and resilient. This makes the logger and HTTP writer more general, by removing any dependency upon the exact data type they are writing. They can now handle any type of BSON-serializable dict, and track what they have sent by keeping track of the last *byte*, not the last timestamp.
author Paul Fisher <paul@pfish.zone>
date Tue, 15 Oct 2019 22:40:24 -0400
parents 885bff085edf
children b5625b531d2d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
1 """Basic datatypes for the weather station.
0
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
2 """
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
3
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
4 import datetime
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
5
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
6 import attr
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
7 import pytz
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
8
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
9
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
10 def _utc_now() -> datetime.datetime:
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
11 """utcnow, but timezone-aware."""
14
c01f9929ae38 Make logger and HTTP writer more general and resilient.
Paul Fisher <paul@pfish.zone>
parents: 5
diff changeset
12 return datetime.datetime.now(tz=pytz.UTC)
0
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
13
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
14
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
15 @attr.s(frozen=True, slots=True)
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
16 class Reading(object):
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
17 """A single reading from a temperature/humidity sensor."""
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
18
5
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
19 # The timestamp of the reading.
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
20 sample_time = attr.ib(type=datetime.datetime)
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
21
0
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
22 # The temperature, in degrees Celsius.
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
23 temp_c = attr.ib(type=float)
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
24
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
25 # The relative humidity, in percent.
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
26 rh_pct = attr.ib(type=float)
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
27
5
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
28 @classmethod
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
29 def from_now(cls, **kwargs) -> 'Reading':
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
30 """Creates a new reading taken at the current time."""
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
31 return cls(sample_time=_utc_now(), **kwargs)
0
18dc6245c91a Create initial version of weather sensor reader.
Paul Fisher <paul@pfish.zone>
parents:
diff changeset
32
5
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
33 def as_dict(self):
885bff085edf Add remote logger class for eventual HTTP writer.
Paul Fisher <paul@pfish.zone>
parents: 3
diff changeset
34 return attr.asdict(self, recurse=False)