Ottenere i dati da stazioni meteo compatibili con WH1080/WH3080.
Derivato da wwsr.c by Michael Pendec (michael.pendec@gmail.com), wwsrdump.c by Svend Skafte (svend@skafte.net), modificato da Dave Wells, e altre fonti.
Questo è il modulo che in realtà comunica con l’unità di base della stazione meteo. Non ho molta comprensione dell’ USB, quindi copiato molto dal programma in C wwsr di Michael Pendec’s
La memoria della stazione meteo è divisa in due parti: “fixed block” di 256 byte e un buffer circolare di 65280 byte. Siccome ogni stringa prende 16 byte la stazione può immagazzinare 4080 letture, o 14 giorni di letture di intervallo di 5 minuti. (Le stazioni tipo 3080 memorizzano 20 byte per la stringa, quindi memorizzano un massimo di 3264). Siccome lettura dei dati è in blocchi di 32 byte, ma ogni lettura meteo è 16 o 20 byte, una piccola cache viene utilizzata per ridurre il traffico USB. Il comportamento di memorizzazione nella cache può essere esclusa con il parametro unbuffered in get_data e get_raw_data.
La decodifica dei dati è controllato da dizionari statici reading_format, lo_fix_format e fixed_format. Le chiavi sono i nomi di elementi di dati e i valori possono essere di tipo (offset, type, multiplier) o un altro dizionario. Così, per esempio, la voce del dizionario reading_format 'rain' : (13, 'us', 0.3) significa che il valore di pioggia è un breve short senza segno (due byte), 13 byte dall’inizio del blocco e deve essere moltiplicato per 0,3 per ottenere un valore utile.
L’uso di dizionari annidati nel dizionario fixed_format permette utili sottoinsiemi di dati per essere decodificati. Ad esempio, per decodificare l’intero blocco get_fixed_block viene chiamato senza parametri
ws = WeatherStation.weather_station()
print ws.get_fixed_block()
Per ottenere la temperatura esterna minima memorizzata, è chiamato get_fixed_block con una sequenza di comandi:
ws = WeatherStation.weather_station()
print ws.get_fixed_block(['min', 'temp_out', 'val'])
Spesso non non c’è nessun obbligo di leggere e decodificare l’intero blocco, siccome i primi 64 byte contengono i dati più utili: l’intervallo dei valori memorizzati, l’indirizzo del buffer dove è memorizzata la lettura corrente e l’ora della data corrente. Il metodo get_lo_fix_block fornisce facile accesso a questi dati.
Per ulteriori esempi di utilizzo del modulo WeatherStation, consultare il programma TestWeatherStation.
Funzioni
decode_status(status) |
Classi
CUSBDrive() | Interfaccia di basso livello della stazione meteo tramite USB. |
USBDevice(vendor_id, product_id) | Basso livello di accesso al dispositivo USB tramite la libreria hidapi. |
datetime | datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]) |
weather_station([ws_type, params, status]) | Classe che rappresenta la stazione meteorologica nel programma utente. |
Interfaccia di basso livello della stazione meteo tramite USB.
Liberamente ispirato su una classe C++ ottenuta da http://site.ambientweatherstore.com/easyweather/ws_1080_2080_protocol.zip.Non so la provenienza di questo, ma sembra che siano venuti dal produttore.
Classe che rappresenta la stazione meteorologica nel programma utente.
Connettersi alla stazione metereologica e preparare per la lettura dei dati.
Ottiene i dati grezzi (raw) dal buffer circolare.
Se ‘unbuffered’ è false, potrebbe essere restituito un valore memorizzato nella cache, che è stato ottenuto in precedenza.
Ottiene i dati decodificati dal buffer circolare.
Se ‘unbuffered’ è false, potrebbe essere restituito un valore memorizzato nella cache, che è stato ottenuto in precedenza.
Ottiene il grezzo (raw) “fixed block” di impostazioni e dati di min/max.
Ottiene decodificato “fixed block” di impostazioni e dati di min/max.
Per selezionare un sottoinsieme di tutto il blocco tasti.
Scrive una serie di byte singoli sulla stazione meteo. Dati devono essere una matrice di coppie (ptr, value).