Note
pywws documentation is now located at http://pywws.readthedocs.org/fr/. This copy is no longer being updated and may be out of date.
pywws.WeatherStation¶
Obtient les données des stations météorologiques WH1080/WH3080 et compatibles.
Dérivé de wwsr.c par Michael Pendec (michael.pendec@gmail.com), wwsrdump.c par Svend Skafte (svend@skafte.net), modifié par Dave Wells, et d’autres sources.
Introduction¶
C’est le module qui parle à l’unité de base de la station météo. Je n’ai pas beaucoup de compréhension de l’USB, donc j’ai copié beaucoup du programme C wwsr de Michael Pendec.
La mémoire de la station météorologique comporte deux parties: un “bloc fixe” de 256 octets et une mémoire tampon circulaire de 65280 octets. Comme chaque lecture météo prend 16 octets, la station peut stocker 4080 lectures, ou 14 jours de lectures intervalle de 5 minutes. (Les stations de type 3080 stockent 20 octets par la lecture, pour un maximum de 3264 lectures) Comme les données sont lues en bloc de 32 octets, mais chaque lecture météorologique est de 16 ou 20 octets, un petit cache est utilisé pour réduire le trafic USB. Le comportement de mise en cache mémoire peut être contourné avec le paramètre unbuffered
de get_data
et get_raw_data
.
Le décodage des données est contrôlé par les dictionnaires statiques reading_format
, lo_fix_format
, fixed_format
. Les clés sont les noms des éléments de données et les valeurs peuvent être un tulpe (décalage, type, multiplicateur) `` ou un autre dictionnaire. Ainsi, par exemple, l'entrée du dictionnaire ``reading_format
'rain' : (13, 'us', 0.3)
signifie que la valeur de ‘rain’ est un entier court non signé (deux octets), à 13 octets à partir du début du bloc, et devrait être multiplié par 0,3 à obtenir une valeur utile.
L’utilisation de dictionnaires imbriqués dans le dictionnaire fixed_format
permet de décoder des sous-ensembles de données utiles . Par exemple, pour décoder le bloc entier get_fixed_block
celui-ci est appelée sans paramètres:
ws = WeatherStation.weather_station()
print ws.get_fixed_block()
Pour obtenir la température extérieure minimale stockées, get_fixed_block
est appelée avec une séquence de clés:
ws = WeatherStation.weather_station()
print ws.get_fixed_block(['min', 'temp_out', 'val'])
Souvent, il n’est pas nécessaire de lire et décoder l’ensemble du bloc fixe, comme ses 64 premiers octets contiennent les données les plus utiles: l’intervalle entre les lectures enregistrées, l’adresse du tampon où la lecture en cours est mémorisée, ainsi que la date et l’heure courante. La méthode get_lo_fix_block
offre un accès facile à ces données.
Pour d’autres exemples de l’utilisation du module WeatherStation, voir le programme TestWeatherStation.
API détaillé¶
Fonctions
decode_status (status) |
Classes
CUSBDrive () |
Interface de bas niveau de la station météo via USB. |
weather_station ([ws_type, params, status]) |
Classe qui représente la station météo pour le programme utilisateur. |
-
class
pywws.WeatherStation.
CUSBDrive
[source]¶ Interface de bas niveau de la station météo via USB.
Vaguement calqué sur une classe C + + obtenue à partir http://site.ambientweatherstore.com/easyweather/ws_1080_2080_protocol.zip. Je n’en sais pas la provenance, mais il semble que cela pourrait provenir du fabricant.
-
EndMark
= 32¶
-
ReadCommand
= 161¶
-
WriteCommand
= 160¶
-
WriteCommandWord
= 162¶
-
-
class
pywws.WeatherStation.
weather_station
(ws_type='1080', params=None, status=None)[source]¶ Classe qui représente la station météo pour le programme utilisateur.
Connecte à la station météo et prépare à lire les données.
-
avoid
= 3.0¶
-
min_pause
= 0.5¶
-
get_raw_data
(ptr, unbuffered=False)[source]¶ Obtient les données brutes à partir d’un tampon circulaire.
Si ‘unbuffered’ est faux, une valeur mise en cache, obtenu précédemment, peut être retourné.
-
get_data
(ptr, unbuffered=False)[source]¶ Obtenir les données décodées à partir du tampon circulaire.
Si ‘unbuffered’ est faux, une valeur mise en cache, obtenu précédemment, peut être retourné.
-
current_pos
()[source]¶ Obtenir l’emplacement du tampon circulaire lorsque les données actuelles sont en cours d’écriture.
-
get_raw_fixed_block
(unbuffered=False)[source]¶ Obtenir le “bloc fixe” brut des paramètres et des données MIN/MAX.
-
get_fixed_block
(keys=[], unbuffered=False)[source]¶ Obtient le “bloc fixe” décodé des paramètres et des données MIN/MAX.
Un sous-ensemble du bloc complet pouvant être sélectionné par clés.
-
write_data
(data)[source]¶ Écrit un ensemble d’octets unique vers la station météo. Les données doivent être un tableau de (ptr, valeur) paires.
-
reading_format
= {'3080': {'status': (15, 'pb', None), 'hum_out': (4, 'ub', None), 'wind_gust': (10, 'wg', 0.1), 'uv': (19, 'ub', None), 'wind_ave': (9, 'wa', 0.1), 'rain': (13, 'us', 0.3), 'temp_in': (2, 'ss', 0.1), 'illuminance': (16, 'u3', 0.1), 'abs_pressure': (7, 'us', 0.1), 'delay': (0, 'ub', None), 'hum_in': (1, 'ub', None), 'temp_out': (5, 'ss', 0.1), 'wind_dir': (12, 'ub', None)}, '1080': {'status': (15, 'pb', None), 'wind_ave': (9, 'wa', 0.1), 'rain': (13, 'us', 0.3), 'hum_in': (1, 'ub', None), 'temp_out': (5, 'ss', 0.1), 'wind_dir': (12, 'ub', None), 'hum_out': (4, 'ub', None), 'wind_gust': (10, 'wg', 0.1), 'temp_in': (2, 'ss', 0.1), 'delay': (0, 'ub', None), 'abs_pressure': (7, 'us', 0.1)}}¶
-
lo_fix_format
= {'alarm_1': (21, 'bf', ('bit0', 'time', 'wind_dir', 'bit3', 'hum_in_lo', 'hum_in_hi', 'hum_out_lo', 'hum_out_hi')), 'alarm_3': (23, 'bf', ('temp_in_lo', 'temp_in_hi', 'temp_out_lo', 'temp_out_hi', 'wind_chill_lo', 'wind_chill_hi', 'dew_point_lo', 'dew_point_hi')), 'alarm_2': (22, 'bf', ('wind_ave', 'wind_gust', 'rain_hour', 'rain_day', 'pressure_abs_lo', 'pressure_abs_hi', 'pressure_rel_lo', 'pressure_rel_hi')), 'data_changed': (26, 'ub', None), 'settings_1': (17, 'bf', ('temp_in_F', 'temp_out_F', 'rain_in', 'bit3', 'bit4', 'pressure_hPa', 'pressure_inHg', 'pressure_mmHg')), 'settings_2': (18, 'bf', ('wind_mps', 'wind_kmph', 'wind_knot', 'wind_mph', 'wind_bft', 'bit5', 'bit6', 'bit7')), 'read_period': (16, 'ub', None), 'unknown_01': (25, 'pb', None), 'timezone': (24, 'sb', None), 'data_count': (27, 'us', None), 'current_pos': (30, 'us', None), 'display_2': (20, 'bf', ('temp_out_temp', 'temp_out_chill', 'temp_out_dew', 'rain_hour', 'rain_day', 'rain_week', 'rain_month', 'rain_total')), 'display_3': (29, 'bf', ('illuminance_fc', 'bit1', 'bit2', 'bit3', 'bit4', 'bit5', 'bit6', 'bit7')), 'display_1': (19, 'bf', ('pressure_rel', 'wind_gust', 'clock_12hr', 'date_mdy', 'time_scale_24', 'show_year', 'show_day_name', 'alarm_time'))}¶
-
fixed_format
= {'alarm_1': (21, 'bf', ('bit0', 'time', 'wind_dir', 'bit3', 'hum_in_lo', 'hum_in_hi', 'hum_out_lo', 'hum_out_hi')), 'alarm_3': (23, 'bf', ('temp_in_lo', 'temp_in_hi', 'temp_out_lo', 'temp_out_hi', 'wind_chill_lo', 'wind_chill_hi', 'dew_point_lo', 'dew_point_hi')), 'alarm_2': (22, 'bf', ('wind_ave', 'wind_gust', 'rain_hour', 'rain_day', 'pressure_abs_lo', 'pressure_abs_hi', 'pressure_rel_lo', 'pressure_rel_hi')), 'data_changed': (26, 'ub', None), 'max': {'windchill': {'date': (181, 'dt', None), 'val': (110, 'ss', 0.1)}, 'dewpoint': {'date': (191, 'dt', None), 'val': (114, 'ss', 0.1)}, 'wind_ave': {'date': (221, 'dt', None), 'val': (126, 'us', 0.1)}, 'rain': {'week': {'date': (241, 'dt', None), 'val': (134, 'us', 0.3)}, 'total': {'date': (251, 'dt', None), 'val': (138, 'us', 0.3)}, 'day': {'date': (236, 'dt', None), 'val': (132, 'us', 0.3)}, 'hour': {'date': (231, 'dt', None), 'val': (130, 'us', 0.3)}, 'month': {'date': (246, 'dt', None), 'val': (136, 'us', 0.3)}}, 'rel_pressure': {'date': (211, 'dt', None), 'val': (122, 'us', 0.1)}, 'hum_in': {'date': (141, 'dt', None), 'val': (98, 'ub', None)}, 'temp_out': {'date': (171, 'dt', None), 'val': (106, 'ss', 0.1)}, 'hum_out': {'date': (151, 'dt', None), 'val': (100, 'ub', None)}, 'wind_gust': {'date': (226, 'dt', None), 'val': (128, 'us', 0.1)}, 'uv': {'val': (93, 'ub', None)}, 'temp_in': {'date': (161, 'dt', None), 'val': (102, 'ss', 0.1)}, 'illuminance': {'val': (94, 'u3', 0.1)}, 'abs_pressure': {'date': (201, 'dt', None), 'val': (118, 'us', 0.1)}}, 'settings_1': (17, 'bf', ('temp_in_F', 'temp_out_F', 'rain_in', 'bit3', 'bit4', 'pressure_hPa', 'pressure_inHg', 'pressure_mmHg')), 'settings_2': (18, 'bf', ('wind_mps', 'wind_kmph', 'wind_knot', 'wind_mph', 'wind_bft', 'bit5', 'bit6', 'bit7')), 'read_period': (16, 'ub', None), 'rel_pressure': (32, 'us', 0.1), 'unknown_01': (25, 'pb', None), 'unknown_18': (97, 'pb', None), 'timezone': (24, 'sb', None), 'display_1': (19, 'bf', ('pressure_rel', 'wind_gust', 'clock_12hr', 'date_mdy', 'time_scale_24', 'show_year', 'show_day_name', 'alarm_time')), 'date_time': (43, 'dt', None), 'data_count': (27, 'us', None), 'min': {'hum_out': {'date': (156, 'dt', None), 'val': (101, 'ub', None)}, 'dewpoint': {'date': (196, 'dt', None), 'val': (116, 'ss', 0.1)}, 'abs_pressure': {'date': (206, 'dt', None), 'val': (120, 'us', 0.1)}, 'windchill': {'date': (186, 'dt', None), 'val': (112, 'ss', 0.1)}, 'hum_in': {'date': (146, 'dt', None), 'val': (99, 'ub', None)}, 'temp_out': {'date': (176, 'dt', None), 'val': (108, 'ss', 0.1)}, 'rel_pressure': {'date': (216, 'dt', None), 'val': (124, 'us', 0.1)}, 'temp_in': {'date': (166, 'dt', None), 'val': (104, 'ss', 0.1)}}, 'display_2': (20, 'bf', ('temp_out_temp', 'temp_out_chill', 'temp_out_dew', 'rain_hour', 'rain_day', 'rain_week', 'rain_month', 'rain_total')), 'display_3': (29, 'bf', ('illuminance_fc', 'bit1', 'bit2', 'bit3', 'bit4', 'bit5', 'bit6', 'bit7')), 'alarm': {'windchill': {'lo': (62, 'ss', 0.1), 'hi': (60, 'ss', 0.1)}, 'dewpoint': {'lo': (66, 'ss', 0.1), 'hi': (64, 'ss', 0.1)}, 'wind_ave': {'ms': (77, 'ub', 0.1), 'bft': (76, 'ub', None)}, 'rain': {'day': (85, 'us', 0.3), 'hour': (83, 'us', 0.3)}, 'rel_pressure': {'lo': (74, 'us', 0.1), 'hi': (72, 'us', 0.1)}, 'hum_in': {'lo': (49, 'ub', None), 'hi': (48, 'ub', None)}, 'temp_out': {'lo': (58, 'ss', 0.1), 'hi': (56, 'ss', 0.1)}, 'wind_dir': (82, 'ub', None), 'hum_out': {'lo': (55, 'ub', None), 'hi': (54, 'ub', None)}, 'wind_gust': {'ms': (80, 'ub', 0.1), 'bft': (79, 'ub', None)}, 'uv': (92, 'ub', None), 'temp_in': {'lo': (52, 'ss', 0.1), 'hi': (50, 'ss', 0.1)}, 'illuminance': (89, 'u3', 0.1), 'abs_pressure': {'lo': (70, 'us', 0.1), 'hi': (68, 'us', 0.1)}, 'time': (87, 'tt', None)}, 'current_pos': (30, 'us', None), 'lux_wm2_coeff': (36, 'us', 0.1), 'abs_pressure': (34, 'us', 0.1)}¶
-
data_start
= 256¶
-
reading_len
= {'3080': 20, '1080': 16}¶
-