Arexx – BS-1000 data uitlezen met Python
Met dit script kun je data uitlezen van een Arexx BS-1000 datalogger door middel van een Python script, de gegevens worden opgeslagen in een CSV bestand.
Wat we doen is een XML bestand genaamd “[arexx logger ip]\cdata.xml” inladen, parsen en verwerken, het bestand ziet er zo uit:
1 2 3 4 5 6 7 8 9 10 |
<measurements> <value id="57432" type="11" rssi="-51" uid="5743211" t="487868113">31.000</value> <name id="57432" type="11" unit="">57432counts</name> <value id="19168" type="1" rssi="-51" uid="191681" t="487868108">23.640</value> <name id="19168" type="1" unit="°C">19168</name> <value id="9707" type="1" rssi="-77" uid="97071" t="487868104">24.742</value> <name id="9707" type="1" unit="°C">9707</name> <value id="19168" type="3" rssi="-51" uid="191683" t="487868051">50.450</value> <name id="19168" type="3" unit="RH%">19168RH</name> </measurements> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# Arexx data pull script in python. # # Getest met Arexx BS-1000 firmware v1.0.5.9 # # Geschreven door: S. Ebeltjes @ Domoticx.nl # Datum: 2015-06-19 # # INFO: # - Opslag gegevens: # De gegevens worden opgeslagen in een CSV bestand per maand met als format: AREXX_LOGGER_DATA_[YYYY]_[MM].csv # - CSV kolommen: # DY, DM, DD, TH, TM, loggerid, loggertype, loggerwaarde # Importeren van bibliotheken import urllib2 # Bibliotheek om data te ontvangen en te versturen via het HTTP protocol. # Importeer bibliotheek voor systeemfuncties. import sys # Importeer bibliotheek voor tijdfuncties. import time # Importeer bibliotheek voor CSV functies. import csv try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET ####################################### # Instellingen arexxloggerip = "http://192.168.X.X" arexxloggerdata = "cdata.xml" csvbestandpad = "/home/pi/" ####################################### # Definieer variabelen. DY = time.strftime("%Y") DM = time.strftime("%m") DD = time.strftime("%d") TH = time.strftime("%H") TM = time.strftime("%M") xmladres = arexxloggerip + "/" + arexxloggerdata httphandle = urllib2.Request(xmladres) try: httpdata = urllib2.urlopen(httphandle) except: print "IP adres niet gevonden!" exit() xml = ET.parse(httpdata) for x in xrange(1, 101): try: # Zoek de waarden in de XML structuur. loggerid = xml.find("value[" + str(x) + "]").attrib.get('id') loggertype = xml.find("value[" + str(x) + "]").attrib.get('type') loggerwaarde = xml.find("value[" + str(x) + "]").text loggernaam = xml.find("name[" + str(x) + "]").text data = [DY, DM, DD, TH, TM, loggernaam, loggerwaarde] # Sla gegevens op in een bestand (per maand) csvbestand = csvbestandpad + "AREXX_LOGGER_DATA_" + DY + "_" + DM + ".csv" # Open het csv bestand en schijf door achter de bestaande inhoud. with open(csvbestand, "a") as output: writer = csv.writer(output, delimiter=";", lineterminator='\n') writer.writerow(data) except: pass |
Inhoud CSV bestand:
1 2 3 4 5 6 7 8 9 10 11 12 |
2015;06;19;08;34;9707;23.117 2015;06;19;08;34;19168RH;58.023 2015;06;19;08;34;57432counts;31.000 2015;06;19;08;34;19168;21.930 2015;06;19;08;34;9707;23.117 2015;06;19;08;34;19168RH;58.023 2015;06;19;08;34;57432counts;31.000 2015;06;19;08;34;19168;21.930 2015;06;19;08;34;9707;23.117 2015;06;19;08;34;19168RH;58.023 2015;06;19;08;34;57432counts;31.000 2015;06;19;08;34;19168;21.930 |
Per sensor een bestand
Hier volgt een andere methode om per sensor een bestand aan te maken, de gegevens worden opgeslagen in diverse CSV bestanden met de format:Â AREXX_[LOGGERNAAM].csv
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# Arexx data pull script in python. # # Getest met Arexx BS-1000 firmware v1.0.5.9 # # Geschreven door S. Ebeltjes @ Domoticx.nl # Datum: 2015-06-19 # # INFO: # - Opslag gegevens: # De gegevens worden opgeslagen in CSV bestanden met als format: AREXX_[LOGGERNAAM].csv # - CSV kolommen: # DY, DM, DD, TH, TM, loggerwaarde # Importeren van bibliotheken # Bibliotheek om data te ontvangen en te versturen via het HTTP protocol. import urllib2 # Importeer bibliotheek voor systeemfuncties. import sys # Importeer bibliotheek voor tijdfuncties. import time # Importeer bibliotheek voor CSV functies. import csv try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET ####################################### # Instellingen arexxloggerip = "http://192.168.X.X" arexxloggerdata = "cdata.xml" csvbestandpad = "/home/pi/" ####################################### # Definieer variabelen. DY = time.strftime("%Y") DM = time.strftime("%m") DD = time.strftime("%d") TH = time.strftime("%H") TM = time.strftime("%M") xmladres = arexxloggerip + "/" + arexxloggerdata httphandle = urllib2.Request(xmladres) try: httpdata = urllib2.urlopen(httphandle) except: print "IP adres niet gevonden!" exit() xml = ET.parse(httpdata) for x in xrange(1, 101): try: # Zoek de waarden in de XML structuur. loggerid = xml.find("value[" + str(x) + "]").attrib.get('id') loggertype = xml.find("value[" + str(x) + "]").attrib.get('type') loggerwaarde = xml.find("value[" + str(x) + "]").text loggernaam = xml.find("name[" + str(x) + "]").text data = [DY, DM, DD, TH, TM, loggerwaarde] # Sla gegevens op in een CSV bestand. csvbestand = csvbestandpad + "AREXX_" + loggernaam + ".csv" # Open het csv bestand en schijf door achter de bestaande inhoud. with open(csvbestand, "a") as output: writer = csv.writer(output, delimiter=";", lineterminator='\n') writer.writerow(data) except: pass |
Maakt deze bestanden aan:
1 2 3 4 |
AREXX_9707_1.csv AREXX_19168.csv AREXX_19168RH.csv AREXX_57432counts.csv |
Voorbeeld inhoud:
1 2 3 4 |
2015;06;17;20;33;54.104 2015;06;17;20;42;54.419 2015;06;17;20;42;54.419 2015;06;17;20;42;54.419 |
Data pushen naar andere databron
Hieronder volgt een opzet om data te kunnen pushen naar een nadere bron, bijvoorbeeld internet, de data wordt vanuit de XML omgezet naar een array, welke je kan gebruiken om waarden weer te geven.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
# Arexx data pull script in python. # # Getest met Arexx BS-1000 firmware v1.0.5.9 # # Geschreven door: S. Ebeltjes @ Domoticx.nl # Datum: 2015-06-19 # # INFO: # - Met dit script kun je de sensor waarden van de BS-1000 pushen naar andere databronnen (bijvoorbeeld internet) # Importeren van bibliotheken # Bibliotheek om data te ontvangen en te versturen via het HTTP protocol. import urllib2 try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET ####################################### # Instellingen arexxloggerip = "http://192.168.X.X" arexxloggerdata = "cdata.xml" ####################################### loggerarray = {} xmladres = arexxloggerip + "/" + arexxloggerdata httphandle = urllib2.Request(xmladres) try: httpdata = urllib2.urlopen(httphandle) except: print "IP adres niet gevonden!" exit() xml = ET.parse(httpdata) for x in xrange(1, 101): try: # Zoek de waarden in de XML structuur. loggerwaarde = xml.find("value[" + str(x) + "]").text loggernaam = xml.find("name[" + str(x) + "]").text # Maak een array aan om per sensor de waarde op te slaan. loggerarray[loggernaam] = loggerwaarde except: pass # Voorbeeld van debug stukje om te testen of data goed word opgeslagen/weergegeven. print "- de waarde van sensor 9707 is " + loggerarray["9707"] print "- de waarde van sensor 19168 is " + loggerarray["19168"] print "- de waarde van sensor 19168RH is " + loggerarray["19168RH"] print "- de waarde van sensor 57432counts is " + loggerarray["57432counts"] |
voorbeeld console output:
1 2 3 4 |
- de waarde van sensor 9707 is 23.367 - de waarde van sensor 19168 is 22.150 - de waarde van sensor 19168RH is 57.777 - de waarde van sensor 57432counts is 31.000 |