a
    ?i4                     @   sh   d Z ddlZddlZddlZddlmZmZmZ G dd dZe	e
dddZd	d
 Zedkrde  dS )ud  
AM2320 Sensor - датчик измерения температуры и влажности
- I2C интерфейс
- Диапазон измерений: - 40°C to + 80°C and 0 to 100% RH
- Погрешность измерений: температура ±0.5°C, влажность ±3%RH 
- I2C адрес: 0x5C (не изменяемый).
- Datasheet: https://cdn-shop.adafruit.com/product-files/3721/AM2320.pdf

Модуль am2320. 
	Назначение: 
		1. Определение температуры и влажности.
	Возможности:
		1. Использование как класса, используемого приложением
		2. Использование как самостоятельного приложения
	Синтаксис:
		am2320.py [--uid] [--bus] [-s state {temp|hum}] [-o output {text|json}]
		где:
			--uid       	-   Уникальный идентификатор. 
								Параметр не обязательный. 
								В коде никак не обрабатывается.
								Предназначен сорее для родителя, запросившего данные с датчика, может быть использован 
								при синхронном запросе в родителе и последующей обработке результата в родителе.
			--bus			-   Номер шины I2C на Raspberry Pi. 
								Параметр не обязательный.
								Допускается следующий формат:
									- параметр не указан - по умолчанию номер шины = 0
									- 0..N - номер шины. 
			-s state		-   Тип показания датчика. 
								Параметр не обязательный
								Допускается следующий формат:
									- параметр не указан - будут возвращены показания температуры и влажности
									- temp - будут возвращены показания температуры, в градусах Цельсия
									- hum - будут возвращены показания влажности, в процентах
			-o output		- 	Тип результата. 
								Параметр не обязательный.
								Допускается	следующий формат:
									- параметр не указан - тихий режим, без вывода результата
									- text - тип text
									- json - тип json	

	Ответ в формате:
	json 
		{
			status: код ответа от сервиса (например 200 - ок|400 - не коррекнтый запрос|520 - неизвестная ошибка| и т.д.)
			message: описание ответа
			request: {
				uid: уникальный идентификатор
				bus: номер I2C шины 
				state: тип показания датчика
				output: тип результата
			}
			response: {
				temp: температура в области датчика
				hum: влажность в области датчика
			}
		}                                                    
	text
		status<код ответа> - <описание ответа>
		uid<уникальный идентификатор> bus<номер I2C шины> state<тип показаний датчика> output<тип результата>
		t<температура в области датчика> 
		h<влажность в области датчика>
		
	Модуль написан в 2025 году.
    N)OptionalTupleAnyc                   @   s   e Zd ZdZdZdZdee ddddZdee dddd	Z	e
d
ddZed
ddZed
ddZeeef d
ddZdS )AM2320z0.2\      N)i2creturnc                 C   s   || _ tj| _d S N)i2cbusr   ADDRESSaddressselfr    r   -/var/aqua_controller/devices/am2320/am2320.py__init__S   s    zAM2320.__init__c                 C   s
   || _ d S r
   )r   r   r   r   r   set_i2cY   s    zAM2320.set_i2c)r	   c                 C   sf   | j t krPz"| j| jdg  td W dS  tyL   td Y q 0 q td| j dd S )Nr   g~jth?T{Gz?uP   Сенсор не вышел из спящего режима в течении u    сек.)	time_endtimer   write_i2c_block_datar   sleepIOErrorTimeoutErrorTIMEOUT)r   r   r   r   Z__fn_wake_sensor^   s    
zAM2320.__fn_wake_sensorc              
   C   s<  zt   tj | _|  s$td| jt   krpz| j| jdddg W qxW q$ t	yl   t 
d Y q$0 q$tdt 
d zL| j| jdd}|d d	> |d B }|d
 }|dkr|d8 }t|dW W S  t	y } zt	d| W Y d }~n
d }~0 0 W n0 ty6 } ztd|W Y d }~n
d }~0 0 d S )NP   Не удалось вывести сенсор из спящего режима   r   r   7   Время ожидания ответа истеклоQ?r               $@  皙@   Ошибка чтения i2c: uP   Не удалось прочесть показания температуры: r   r   r   r   _AM2320__fn_wake_sensor
ValueErrorr   r   r   r   r   r   read_i2c_block_dataround	Exception)r   	_responseraw_temperature_temperatureer   r   r   get_temperaturek   s.    
(zAM2320.get_temperaturec              
   C   s$  zt   tj | _|  s"td| jt   krnz| j| jdddg W qvW q" t	yj   t 
d Y q"0 q"tdt 
d z8| j| jdd}|d d	> |d B }t|d
 dW W S  t	y } zt	d| W Y d }~n
d }~0 0 W n0 ty } ztd|W Y d }~n
d }~0 0 d S )Nr   r   r   r   r   r   r   r    r!   r"   r%   uL   Не удалось прочесть показания влажности: r&   )r   r,   	_humidityr/   r   r   r   get_humidity   s(    
(zAM2320.get_humidityc              
   C   s^  z&t   tj | _|  s$td| jt   krpz| j| jdddg W qxW q$ t	yl   t 
d Y q$0 q$tdt 
d zn| j| jdd}|d	 d
> |d B }|d d
> |d B }|d }|dkr|d8 }t|d	t|d d	fW W S  t	y$ } zt	d| W Y d }~n
d }~0 0 W n0 tyX } ztd|W Y d }~n
d }~0 0 d S )Nr   r   r   r    r   r   r      r   r!      r"   r#   r$   r%   uH   Не удалось прочесть показания датчика: r&   )r   r,   Zraw_humidityr-   temperaturer/   r   r   r   get_temperature_humidity   s0    
(zAM2320.get_temperature_humidity)N)N)__name__
__module____qualname__VERSIONr   r   r   r   r   r   boolr'   floatr0   r2   r   r6   r   r   r   r   r   K   s   r   )valuer	   c              
   C   sF   zt | dW S  ty@ } ztd|  dW Y d }~n
d }~0 0 d S )Nr   u#   Неверное значение: u+   . Ожидается целое число.)intr(   )r=   r/   r   r   r   __fn_to_int   s    r?   c               
   C   s  d} d}i }zxt jdd}|jdtdd dd |jd	tdd
dd |jddtdddgd dd |jddtdddgd dd | }W n4 t jy } zd} d| }W Y d }~n
d }~0 0 zd
d l}||j	}W n< t
y } z"d} d|j	 d| }W Y d }~n
d }~0 0 | dkrdzt }|| W n4 t
yb } zd} d| }W Y d }~n
d }~0 0 | dkrfz|jd u r| \}	}
|	d urt|	dnd |d< |
d urt|
dnd |d< nl|j dkr| }	|	d urt|	dnd |d< n6|j dkr.| }
|
d ur$t|
dnd |d< n W n4 t
yd } zd} d| }W Y d }~n
d }~0 0 |d urz|  W n4 t
y } zd } d!| }W Y d }~n
d }~0 0 z|jd ur|j dkr }|d"|  d#| d$7 }||jd urd%|j d&nd'7 }||j	d ur*d(|j	 d&nd'7 }||jd urLd)|j d&nd'7 }||jd urnd*|j d&nd'7 }|d+7 }|D ]}|| d,||  d$7 }qt| |jd ur|j dkri }| |d-< t||d.< i |d/< |jd urt|j|d/ d0< |j	d ur|j	|d/ d1< |jd ur6|j|d/ d2< |jd urP|j|d/ d3< i |d4< |D ]}|| |d4 |< q\ttj|ddd5 W nV t
y } z<d } d6t|j d7| }td"|  d#| d8 W Y d }~n
d }~0 0 d S )9N   okuD   Чтение данных с датчика AM2320 по шине I2C)descriptionz--uidFu>   Уникальный идентификатор запроса)typerequireddefaulthelpz--busr   uE   Номер шины I2C на Raspberry Pi (по умолчанию 0)z-sz--statetempZhumuR   Тип показаний: temp - температура, hum - влажность)rC   rD   choicesrE   rF   z-oz--outputtextjsonu+   Формат вывода: text или jsoni  uA   Ошибка обработки командной строки: i  u   i2c шина u    недоступна: i  u>   Ошибка инициализации устройства: r   u.   Ошибка получения данных: i  u1   Не удалось закрыть шину i2c: zstatus<z> - <z>
zuid<z>  zbus<zstate<zoutput<
<statusmessagerequestuidbusstateoutputresponse)ensure_asciiindentu4   Ошибка формирования ответа: z => >)argparseArgumentParseradd_argumentstrr?   
parse_argsArgumentErrorsmbusSMBusrR   r+   r   r   rS   r6   r*   lowerr0   r2   closerT   rQ   printrJ   dumpsrC   r7   )_status_status_message_resultparserargsr/   r_   my_i2cZ	my_AM2320Z_tmp_result_temperatureZ_tmp_result_humidityr,   _item_resultr   r   r   main   s     (
 
 
 """"rl   __main__)__doc__rY   rJ   r   typingr   r   r   r   r\   r>   r?   rl   r7   r   r   r   r   <module>   s   A~o