o
    Qi&                     @   s   d Z ddlZddlmZmZ ddlmZmZ zddlmZ	 ddl
mZ ddlmZ dZW n ey>   dZed	ejd
 Y nw dadai add Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Z dS )!u5  
短信报警服务
- 液位差异超过阈值报警
- 液位过低/过高报警
- 温度超出范围报警
- 密度超出范围报警
- 当日流入流出累计不平衡超过阈值报警
- 支持多人分组发送，每个分组可以选择接收哪些类型的报警
- 支持每个罐体单独配置阈值
    N)datetimedate)SMSALERT)Client)modelsTFu3   阿里云短信SDK未安装，短信功能不可用filec               
   C   s   t sdS td rtd dkrtdtjd dS ztjtd td d} d| _t| a	W d	S  t
yK } ztd
t| tjd W Y d}~dS d}~ww )u   初始化短信客户端Faccess_key_idzyour-access-key-idu-   短信配置未填写，短信功能不可用r   access_key_secret)r
   r   zdysmsapi.aliyuncs.comTu    初始化短信客户端失败: N)ALIBABA_CLOUD_AVAILABLEr   printsysstderropen_api_modelsConfigendpointDysmsapi20170525Client_sms_client	Exceptionstr)confige r   */root/zhuhai-gas-opc/services/sms_alert.pyinit_client   s$   r   c                 C   sx   t d std| d|  dS d}t d D ]#}|d sqd|v r(| |d vr(q|d D ]}t|||}|s8d}q,q|S )	uK   发送报警短信给所有匹配分组（分组可以过滤报警类型）enabledu   报警已禁用，[] Tgroupsalarm_typesphonesF)r   r   send_single_alert)
alert_type
alert_namecontentsuccessgroupphoneresultr   r   r   send_alert_to_groups5   s    r)   c              
   C   s  t st std|  d| d| tjd dS zQ||t dd}dd	l}t	j
| td
 td ||d}t |}|jjdkrWtdt  d|  d| d|  W dS td|  d|jj tjd W dS  ty } ztd|  dt| tjd W Y d	}~dS d	}~ww )u   给单个手机号发送报警u1   短信客户端初始化失败，无法发送给 z: [r   r   Fz%Y-%m-%d %H:%M:%S)typer$   timer   N	sign_nametemplate_code)phone_numbersr,   r-   template_paramOK[u   ] 短信发送成功: z [Tu   短信发送失败 z: u   短信发送异常 )r   r   r   r   r   r   nowstrftimejsondysmsapi_modelsSendSmsRequestr   dumpssend_smsbodycodemessager   r   )r'   r"   r$   r/   r4   requestresponser   r   r   r   r!   H   s4   
 
$r!   c              
   C   s   g }t d }|di d|d }|di d|d }|di d|d }||krA|d	d
|  d|dd|ddf ||krX|dd
|  d|dd|ddf |S )uW   
    检查液位报警
    返回报警列表 [(报警类型, 报警内容), ...]
    levelalert	low_levellow_threshold_default
high_levelhigh_threshold_defaultdiff_thresholddiff_threshold_default	level_low	   LNG储罐u    液位过低: .2fu   m，阈值下限 .1fm
level_highu    液位过高: u   m，阈值上限 r   getappend)tank_idtank_configcurrent_levelalerts	level_cfglow_thhigh_thdiff_thr   r   r   check_level_alertsg   s    rW   c              
   C   s   t d d sg S t d }|di d|d }|di d|d }g }||kr=|dd	|  d
|dd|ddf ||krT|dd	|  d|dd|ddf |S )u   检查温度报警temperaturer   r?   low_temprA   	high_temprC   temperature_lowrG   u    温度过低: rI   u   ℃，阈值下限 u   ℃temperature_highu    温度过高: u   ℃，阈值上限 rL   )rO   rP   current_temptemp_cfgrT   rU   rR   r   r   r   check_temperature_alert   s"   r_   c              
   C   s   t d d sg S t d }|di d|d }|di d|d }g }||kr<|dd	|  d
|dd|df ||krR|dd	|  d|dd|df |S )u   检查密度报警densityr   r?   low_densityrA   high_densityrC   density_lowrG   u    密度过低: z.3fu   ，阈值下限 density_highu    密度过高: u   ，阈值上限 rL   )rO   rP   current_densitydens_cfgrT   rU   rR   r   r   r   check_density_alert   s"   rg   c                 C   s(   d}d}d|  d|dd}t |||S )u$   液位差异报警（保留兼容）
level_diff   液位差异超标rG   u    液位差异超标，差异值: rH   u   m，请立即处理)r)   )rO   diffr"   r#   r$   r   r   r   send_level_diff_alert   s   rk   c           
   
   C   s&  t  }dtvstd |kr|ddda|  D ]*\}}t|}|ddur1td  |d 7  < |ddurBtd  |d 7  < qtd }td }t|| }td	t	  d
|dd|dd|dd	 t
d d sog S t
d dd}	||	krdd|dd|dd|dd|	dd	fgS g S )u   
    检查当日流量平衡
    all_data: {tank_id: {flow_in, flow_out, ...}}
    all_tanks: 罐体配置列表，用于获取每个罐体单独配置
    返回报警列表 [(报警类型, 报警内容), ...]
    r           r   total_in	total_outflow_inNrn   flow_outro   r1   u   ] 当日流量累计: 流入 rH   u   m³, 流出 u   m³, 差异 u   m³
daily_flowr   rD   g      Y@daily_flow_diffu$   当日流量不平衡: 累计流入 u   m³，累计流出 u   m³，差异 u   m³，超过阈值 rI   u   m³，请核查)r   today_daily_flow_accumulatoritemsintrM   absr   r   r2   r   )
all_data	all_tanksrt   tank_id_strdatarO   rn   ro   rj   	thresholdr   r   r   check_daily_flow_balance   s2   	,$r~   c              
   C   sL   d}| D ]\}}dddddddd	d
}| ||}t|||}|s#d}q|S )u*   批量发送报警，每个报警单独发Tu   液位过低报警u   液位过高报警ri   u   温度过低报警u   温度过高报警u   密度过低报警u   密度过高报警u   流量不平衡报警)rF   rK   rh   r[   r\   rc   rd   rs   F)rM   r)   )rR   r%   r"   r$   
type_namesr#   r(   r   r   r   send_alerts   s"   
r   c                  C   sH   t  } tdu r| adS tdd}| t  d }||kr"| adS dS )u6   判断是否需要检查报警（避免频繁报警）NTcheck_interval_minutes<   F)r   r2   _last_alert_timer   rM   total_seconds)r2   interval_minutesdeltar   r   r   should_check_alert   s   r   c                   C   s   t  dddadS )u9   重置当日累计（可以在每天零点自动调用）rl   rm   N)r   rt   ru   r   r   r   r   reset_daily_accumulator
  s   
r   )!__doc__r   r   r   r   r   r   $alibabacloud_dysmsapi20170525.clientr   r   alibabacloud_tea_openapir   r   alibabacloud_dysmsapi20170525r5   r   ImportErrorr   r   r   r   ru   r   r)   r!   rW   r_   rg   rk   r~   r   r   r   r   r   r   r   <module>   s6   ,