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, avoid]) | 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.
Legge 32 byte dalla stazione meteo.
Se la lettura non riesce per qualche motivo, None viene restituito.
Parametri: | address (int) – Indirizzo di lettura da. |
---|---|
Ritorna: | I dati della stazione meteo. |
Tipo di ritorno: | |
elenco(int) |
Scrive un singolo byte sulla stazione meteo.
Parametri: |
|
---|---|
Ritorna: | eseguito con successo. |
Tipo di ritorno: | |
bool |
Classe che rappresenta la stazione meteorologica nel programma utente.
Connettersi alla stazione metereologica e preparare per la lettura dei dati.
Ottenere il puntatore ai dati successivi del buffer circolare.
Ottenere il puntatore ai dati precedenti nel buffer circolare.
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 la posizione del buffer circolare dove sono scritti dati correnti.
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).