Htu21d.py: Difference between revisions
From Federal Burro of Information
Jump to navigationJump to search
No edit summary |
No edit summary |
||
Line 130: | Line 130: | ||
make a service that exports the data via /metric web service, then tell prometheus to eat it . | make a service that exports the data via /metric web service, then tell prometheus to eat it . | ||
Also See: | |||
[[Category | * https://github.com/drthornt/htu21d-exporter | ||
[[Category:Script]] |
Revision as of 15:21, 20 June 2020
Script
run this on your raspberry pi.
#!/usr/bin/python # From: https://www.raspberrypi.org/forums/viewtopic.php?f=44&t=76688 import struct, array, time, io, fcntl I2C_SLAVE=0x0703 HTU21D_ADDR = 0x40 CMD_READ_TEMP_HOLD = "\xE3" CMD_READ_HUM_HOLD = "\xE5" CMD_READ_TEMP_NOHOLD = "\xF3" CMD_READ_HUM_NOHOLD = "\xF5" CMD_WRITE_USER_REG = "\xE6" CMD_READ_USER_REG = "\xE7" CMD_SOFT_RESET= "\xFE" class i2c(object): def __init__(self, device, bus): self.fr = io.open("/dev/i2c-"+str(bus), "rb", buffering=0) self.fw = io.open("/dev/i2c-"+str(bus), "wb", buffering=0) # set device address fcntl.ioctl(self.fr, I2C_SLAVE, device) fcntl.ioctl(self.fw, I2C_SLAVE, device) def write(self, bytes): self.fw.write(bytes) def read(self, bytes): return self.fr.read(bytes) def close(self): self.fw.close() self.fr.close() class HTU21D(object): def __init__(self): self.dev = i2c(HTU21D_ADDR, 1) #HTU21D 0x40, bus 1 self.dev.write(CMD_SOFT_RESET) #soft reset time.sleep(.1) def ctemp(self, sensorTemp): tSensorTemp = sensorTemp / 65536.0 return -46.85 + (175.72 * tSensorTemp) def chumid(self, sensorHumid): tSensorHumid = sensorHumid / 65536.0 return -6.0 + (125.0 * tSensorHumid) def crc8check(self, value): # Ported from Sparkfun Arduino HTU21D Library: https://github.com/sparkfun/HTU21D_Breakout remainder = ( ( value[0] << 8 ) + value[1] ) << 8 remainder |= value[2] # POLYNOMIAL = 0x0131 = x^8 + x^5 + x^4 + 1 # divsor = 0x988000 is the 0x0131 polynomial shifted to farthest left of three bytes divsor = 0x988000 for i in range(0, 16): if( remainder & 1 << (23 - i) ): remainder ^= divsor divsor = divsor >> 1 if remainder == 0: return True else: return False def read_tmperature(self): self.dev.write(CMD_READ_TEMP_NOHOLD) #measure temp time.sleep(.1) data = self.dev.read(3) buf = array.array('B', data) if self.crc8check(buf): temp = (buf[0] << 8 | buf [1]) & 0xFFFC return self.ctemp(temp) else: return -255 def read_humidity(self): self.dev.write(CMD_READ_HUM_NOHOLD) #measure humidity time.sleep(.1) data = self.dev.read(3) buf = array.array('B', data) if self.crc8check(buf): humid = (buf[0] << 8 | buf [1]) & 0xFFFC return self.chumid(humid) else: return -255 if __name__ == "__main__": obj = HTU21D() print "Temp:", obj.read_tmperature(), "C" print "Humid:", obj.read_humidity(), "% rH"
Also see Arduino Projects of note/datalogger sdcard
gnuplot sutff:
http://www.kleerekoper.co.uk/2014/05/how-to-create-heatmap-in-gnuplot.html
Take 2
use i2c libs
use smbus libs.
https://www.instructables.com/id/Raspberry-Pi-I2C-Python/
https://pypi.org/project/smbus2/
https://learn.sparkfun.com/tutorials/htu21d-humidity-sensor-hookup-guide/all
great project: https://github.com/rieder91/pi-co2
idea / plan:
make a service that exports the data via /metric web service, then tell prometheus to eat it .
Also See: