#
# Python script to send MODBUS RTU to XY-MD01 to read Temperature and humidity
#
# This has examples of converting the bytes received.
# py_dhr_serial_XT_MD01.py reads temperature and humidity
# and ouputs to gbFat.js
# graphPiT.htm includes gbFat.js and plots it
# 
#data = ser.read( ser.in_waiting )
# print received bytes as list
#print( list( data ) )

# if you convert to string, it gets in a muddle
# ret=str(ser.read(ser.in_waiting))

from datetime import datetime
# Create a datetime object
current_time = datetime.now()
# Convert to ISO 8601 format
iso_formatted_time = current_time.isoformat()
print(iso_formatted_time)

temperature = str( 253433 )

#gbFa( "2025-03-14 06:15 t=15687" )
#gbFa( "2025-03-15 05:00 t=16750" )

opStr = "gbFa( \""

#opStr += iso_formatted_time + " "
#we want
opStr += iso_formatted_time[0:10] + " " + iso_formatted_time[11:16] + " "
opStr += "t="
opStr += temperature
opStr += " \" ) \n"


#with open("gbFat.js", "a") as f:
#  f.write("gbFa( \"2025-03-14 06:15 t=15687\" )")
#  f.write("gbFa( \" ")
   #f.write( "\n" )
   #f.write( opStr )


import time
import sys

#needed sudo apt install python3-serial
import serial

#time.sleep(10)
#sys.stdin.read(1)

# on windows port="comX"
# mode

# on RaspberryPi port="/dev/ttyUSB0"
# ls /dev to find out 

# 
ser = serial.Serial(
	#port="com15", baudrate=9600,
	port="/dev/ttyUSB0", baudrate=9600,
	#port="com4", baudrate=9600,
	parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE,
	bytesize=serial.EIGHTBITS, xonxoff=False,
#	rtscts=True, dsrdtr=True, timeout=3,	
	rtscts=False, dsrdtr=False, timeout=2 )

print(ser.name)

#sys.stdin.read(1)

cmd = b'\x01\x04\x00\x01\x00\x01\x60\x0A' # temperature
#cmd = b'\x01\x04\x00\x02\x00\x01\x90\x0A' # humidity

#ser.write(b'\x01\x04\x00\x01\x00\x01\x60\x0A')
#ser.write(b'\x01\x04\x00\x02\x00\x01\x90\x0A')

cmd = b'\x01\x04\x00\x01\x00\x01\x60\x0A' # temperature
#cmd = b'\x01\x04\x00\x02\x00\x01\x90\x0A' # humidity

ser.write( cmd )

# pause so that the data is available.
time.sleep(0.1)

#ret=str(ser.read(ser.in_waiting))
#print( ret )

data = ser.read( ser.in_waiting )
# print received bytes as list
print( list( data ) )
# print bytes 
print( data.hex('_') )

print( data[3], data[4] )


print( "temperature:" )
# Temperature
cmd = b'\x01\x04\x00\x01\x00\x01\x60\x0A' # temperature
ser.write( cmd )
time.sleep(0.1)
data = ser.read( ser.in_waiting )
# print received bytes as list
print( list( data ) )
print( list( data[3:5])  )
print( int.from_bytes( data[3:5], "big" )/10.0 , "C") 
temperature =  int.from_bytes( data[3:5], "big" )/10.0 



# Humidity
print( "Humidity:" )

cmd = b'\x01\x04\x00\x02\x00\x01\x90\x0A' # humidity
ser.write( cmd )
time.sleep(0.1)
data = ser.read( ser.in_waiting )

# print received bytes as list
print( list( data ) )
print( int.from_bytes( data[3:5], "big" )/10.0 , "%") 

humidity = int.from_bytes( data[3:5], "big" )/10.0 


# Create a datetime object
current_time = datetime.now()
# Convert to ISO 8601 format
iso_formatted_time = current_time.isoformat()
print(iso_formatted_time)

#gbFa( "2025-03-15 05:00 t=16750" )

opStr = "gbFa( \""

#opStr += iso_formatted_time + " "
#we want
opStr += iso_formatted_time[0:10] + " " + iso_formatted_time[11:16] + " "
opStr += " t="
opStr += str( temperature )

opStr += " h="
opStr += str( humidity )
opStr += " \" ) \n"


with open("/home/pi/www/gb/gbFat.js", "a") as f:
#  f.write("gbFa( \"2025-03-14 06:15 t=15687\" )")
#  f.write("gbFa( \" ")
  f.write( opStr )
  f.close()

#convert the string to byte array by using the b' prefix
ser.write( b'AUTO' )
time.sleep(0.2)
data = ser.read( ser.in_waiting )
# print received bytes as list
print( str( data ) )

ser.write( b'STOP' )
time.sleep(0.2)
data = ser.read( ser.in_waiting )
# print received bytes as list
print( str( data ) )

ser.write( b'PARAM' )
time.sleep(0.2)
data = ser.read( ser.in_waiting )
# print received bytes as list
print( str( data ) )

ser.close()
