a
     iU+                     @   sd   d Z ddlZddlZddlZddlZddlZddlmZmZ G dd dZ	dd Z
edkr`e
  dS )	u?  
DS18B20 Sensor - цифровой датчик температуры
	- интерфейс: 1-Wire
	- диапазон измерений: -55°C to +125°C
	- погрешность измерений: ±0.5°C (от -10°C до +85°C)
	- разрешение: 9-12 бит (программируемое)
	- уникальный 64-битный серийный номер

Модуль ds18b20. 
	Назначение: 
		1. Определение температуры.
	Возможности:
		1. Использование как класса, используемого приложением
		2. Использование как самостоятельного приложения
	Синтаксис:
		ds18b20.py [--uid] [-s device] [-o output {text|json}]
		где:
			--uid       	-   Уникальный идентификатор. 
								Параметр не обязательный. 
								В коде никак не обрабатывается.
								Предназначен сорее для родителя, запросившего данные с датчика, может быть использован 
								при синхронном запросе в родителе и последующей обработке результата в родителе.
			-d device		-   Уникальный серийный номер. 
								Параметр не обязательный.
								Допускается следующий формат:
									параметр не указан - будут возвращены показания всех обнаруженных в системе датчиков.
									параметр указан - будут возвращены показания для указанного датчика.
									указан список серийных номеров, через пробел - будут возвращены показания для указанных 
									датчиков 
			-o output		- Тип результата. Параметр не обязательный.
								Допускается	следующий формат:
									параметр не указан - тип text
									text - тип text
									json - тип json	

	Ответ в формате:
	json 
		{
			status: код ответа от сервиса (например 200 - ок|400 - не коррекнтый запрос|520 - неизвестная ошибка| и т.д.)
			message: описание ответа
			request: {
				uid: уникальный идентификатор
				output: тип результата
			}
			response: [
				{		
					device: уникальный серийный номер датчика 1,
					temp: температура в зоне действия датчика 1
				},{
					device: уникальный серийный номер датчика 2,
					temp: температура в зоне действия датчика 2
				},{
					device: уникальный серийный номер датчика n,
					temp: температура в зоне действия датчика n
				}	
			]
		}                                                    
	text
		status<код ответа> - <описание ответа>
		uid<уникальный идентификатор> output<тип результата>
		device<уникальный серийный номер датчика 1> temp<температура в зоне действия датчика 1> 
		device<уникальный серийный номер датчика 2> temp<температура в зоне действия датчика 2> 
		device<уникальный серийный номер датчика n> temp<температура в зоне действия датчика n> 

	Модуль написан в 2025 году.
    N)OptionalListc                   @   sZ   e Zd ZdZdZdZefeddddZefeee dd	d
Z	dee
e dddZdS )DS18B20z0.1z/sys/bus/w1/devices/z28-*N)device_pathreturnc                 C   s4   | dd | _tj| js0td| j dd S )N/u   Директория u    не существует)rstripr   ospathexistsFileNotFoundError)selfr    r   //var/aqua_controller/devices/ds18b20/ds18b20.py__init__W   s    zDS18B20.__init__)search_patternr   c                 C   sv   t j| j|}t|}g }|D ]N}t j|s4q"t j|}t j|d}t j|r"t j|r"|	| q"|S )Nw1_slave)
r	   r
   joinr   globisdirbasenamer   isfileappend)r   r   Zsearch_pathZdevices_foldersdevicesZdevice_folder
device_uiddevice_filer   r   r   search_devices_   s    
zDS18B20.search_devices)r   r   c           	   
   C   s4  |d u rt dtj| j|d}tj|s<td| tj|sVt d| t|tj	srt
d| zDt|d}| }W d    n1 s0    Y  t|dk rt dt| |d	  d
d  dkrt d| |d d}|dkrt d| |d |d d   }|s>t d| zt|d }W n: t y } z t d| d| W Y d }~n
d }~0 0 |dk s|dkrt d| dt|dW S  ttfy } z td| d| W Y d }~nBd }~0  ty. } z td| d| W Y d }~n
d }~0 0 d S )NuA   Не указан идентификатор устройстваr   u9   Файл устройства не существует: u-   Путь не является файлом: u6   Нет доступа для чтения файла: r   ui   Недостаточно данных в файле: ожидалось 2 строки, получено r   ZYESu-   Ошибка CRC для устройства    zt=uF   Не найдены данные температуры в файле uQ   Пустые температурные данные для устройства g     @@uB   Ошибка преобразования температуры 'z': i}   uI   Температура вне допустимого диапазона: u   °Cu9   Ошибка ввода-вывода при чтении z: u8   Неожиданная ошибка при чтении )
ValueErrorr	   r
   r   r   r   r   r   accessR_OKPermissionErroropen	readlineslenstripfindfloatroundIOErrorOSError	ExceptionRuntimeError)	r   r   r   flinesZtemp_posZ	temp_datatemperatureer   r   r   get_temperaturer   sB    &
*(zDS18B20.get_temperature)N)__name__
__module____qualname__VERSIONZBASE_DIRZSEARCH_PATTERNstrr   r   r   r   r,   r6   r   r   r   r   r   O   s   r   c               
   C   s  d} d}i }z`t jdd}|jdtdd dd |jd	d
tdd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 | dkrz
t }W n2 ty } zd} d| }W Y d }~n
d }~0 0 | dkrpzHg }|jd u r|	 }n|j}|D ]}|
|||< td qW n4 tyn } zd} d| }W Y d }~n
d }~0 0 zh|jd ur$|j dkr$ }	|	d|  d| d7 }	|	|jd urd|j dnd7 }	|	|jd urd |j dnd7 }	|	d!7 }	|D ] }
|	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& d'< |jd ur|j|	d& d(< g |	d)< |D ]}
|	d) |
||
 d* qttj|	dd+d, W n4 ty } zd-} d.| }W Y d }~n
d }~0 0 d S )/N   oku3   Чтение данных с датчика DS18B20)descriptionz--uidFu>   Уникальный идентификатор запроса)typerequireddefaulthelpz-dz--device*u?   Уникальный серийный номер датчика)r?   r@   nargsrA   rB   z-oz--outputtextjsonu+   Формат вывода: text или json)r?   r@   choicesrA   rB   i  uA   Ошибка обработки командной строки: i  u>   Ошибка инициализации устройства: g{Gz?u.   Ошибка получения данных: zstatus<z> - <z>
zuid<z>  zoutput<
zdevice<z> temp<statusmessagerequestuidoutputresponse)devicetempr   )Zensure_asciiindenti  u4   Ошибка формирования отчета: )argparseArgumentParseradd_argumentr;   
parse_argsArgumentErrorr   r0   rP   r   r6   timesleeprN   lowerrM   printr   rF   dumps)_statusZ_status_messageZ_resultparserargsr5   Z
my_DS18B20Z_devicesZ_item_deviceZ	_responseZ_item_resultr   r   r   main   sv     
 

 ""r`   __main__)__doc__rS   r	   r   rF   rX   typingr   r   r   r`   r7   r   r   r   r   <module>   s   CTP