o
    Li                     @   s   d Z ddlZddlZddlmZmZmZ ddlmZm	Z	m
Z
mZmZ edeZe Zdaee	eee
ejjdZdd	 Zd
d Zejddgddd Zejddgddd Zeddd ZdS )zp
PumpControl: receives pump status from ESP32, stores in MySQL shop_stats.
For later use by SolarMon dashboard.
    N)	Blueprintrequestjsonify)
MYSQL_HOST
MYSQL_PORTMYSQL_DATABASE
MYSQL_USERMYSQL_PASSWORDpumpF)hostportuserpassworddatabasecursorclassc                   C   s   t jdi tS )N )pymysqlconnect	DB_CONFIGr   r   r   '/var/www/html/Server/blueprints/pump.pyget_db!   s   r   c                 C   s>   |   }|d W d    n1 sw   Y  |   d S )Na  
            CREATE TABLE IF NOT EXISTS PumpStatus (
                id INT AUTO_INCREMENT PRIMARY KEY,
                pressure_psi FLOAT NOT NULL,
                pump_on TINYINT(1) NOT NULL,
                error_pressure_low TINYINT(1) NOT NULL,
                app_state VARCHAR(24) NOT NULL,
                rssi INT NULL,
                ip VARCHAR(45) NULL,
                mac VARCHAR(24) NULL,
                firmware_version VARCHAR(24) NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
            )
        )cursorexecutecommit)conncurr   r   r   ensure_pump_table%   s   
r   z/readingPOST)methodsc                  C   s  zNt jddd} | stddddfW S | d}| d}| d	}| d
}|du s9|du s9|du s9|du rCtddddfW S zt|}W n ttfy^   tddddf Y W S w t|}t|}t|t	rn|nt	|
 dd pyd}| d}|durzt|}W n ttfy   d}Y nw t| dt	r| dnd
 dd pd}t| dt	r| dnd
 dd pd}t| dt	r| dnd
 dd pd}t }	z9t|	 |	 }
|
d||rdnd|rdnd|||||f W d   n	1 s
w   Y  |	  W |	  n|	  w t tr7datddddfW  d   W S W d   n	1 sBw   Y  tddidfW S  tjyc   tddddf Y S  ty } ztdt	|ddfW  Y d}~S d}~ww )zCAccept pump status from PumpControl device; insert into PumpStatus.T)forcesilentFzInvalid or missing JSONokerrori  pressure_psipump_onerror_pressure_low	app_stateNz?Missing pressure_psi, pump_on, error_pressure_low, or app_statezpressure_psi must be a number   unknownrssiip -   macfirmware_versionzINSERT INTO PumpStatus (pressure_psi, pump_on, error_pressure_low, app_state, rssi, ip, mac, firmware_version)
                       VALUES (%s, %s, %s, %s, %s, %s, %s, %s)   r   reboot)r"   command   r"   Database error  )r   get_jsonr   getfloat	TypeError
ValueErrorbool
isinstancestrstripintr   r   r   r   r   close_pump_reboot_lock_pump_reboot_pendingr   Error	Exception)datar$   r%   r&   r'   r*   r+   r.   r/   r   r   er   r   r   reading8   st   



 &
...
"
"rG   z/api/rebootc                   C   s8   t 
 daW d   n1 sw   Y  tddidfS )zKSet pending reboot; pump device will receive command on next POST /reading.TNr"   r3   )rA   rB   r   r   r   r   r   
api_rebooty   s   rH   z/api/latestc               
   C   sN  zwt  } znt|  |  }|d | }W d   n1 s!w   Y  |s5tdddW |   W S d|v rG|d durGt|d |d< d|v rY|d durYt|d |d< |drf|d 	 |d< td|dW |   W S |   w  t
jy   tdd	d
df Y S  ty } ztdt|d
dfW  Y d}~S d}~ww )z9Return the latest pump status row for SolarMon dashboard.zSELECT id, pressure_psi, pump_on, error_pressure_low, app_state, rssi, ip, mac, firmware_version, created_at FROM PumpStatus ORDER BY created_at DESC LIMIT 1NT)r"   rG   r%   r&   
created_atFr4   r!   r5   )r   r   r   r   fetchoner   r@   r;   r7   	isoformatr   rC   rD   r=   )r   r   rowrF   r   r   r   
api_latest   s6   



"rM   )__doc__	threadingr   flaskr   r   r   configr   r   r   r   r	   __name__bpLockrA   rB   cursors
DictCursorr   r   r   routerG   rH   rM   r   r   r   r   <module>   s.    


@
