ó
YYlWc           @   s^  d  Z  d d l Z d d l Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ e d	 k rZd d l Z y d d
 l	 m
 Z
 Wn d d
 l m
 Z
 n Xd e f d „  ƒ  YZ d e f d „  ƒ  YZ d Z e ƒ  Z d e d e _ e ƒ  Z e e _ d e _ e
 d d e ƒ6 Z e e _ e j d e d i e d e ƒ d 6ƒ Wd QXn  d S(   s!   TS-MPPT-60 driver's base modules.iÿÿÿÿNt   Loggerc           B   s)   e  Z d  Z d Z d Z d e d „ Z RS(   s"   Logger base class for this module.s/   %(asctime)s %(name)s %(levelname)s: %(message)ss   %Y/%m/%d %p %l:%M:%Sc         C   sÐ   t  j t |  ƒ j ƒ |  _ t  j ƒ  } t  j d |  j d |  j ƒ } | j	 | ƒ |  j j
 | ƒ | r t  j | d d ƒ} | j	 | ƒ |  j j
 | ƒ n  | r¹ |  j j t  j ƒ n |  j j t  j ƒ d S(   s¤   Initialize Logger class object.

        Keyword arguments:
        log_file_path -- Path to record log file.
        debug -- If True, logging is enabled.
        t   fmtt   datefmtt   modet   aN(   t   loggingt	   getLoggert   typet   __name__t   loggert   StreamHandlert	   Formattert   _FORMAT_LOG_MSGt   _FORMAT_LOG_DATEt   setFormattert
   addHandlert   FileHandlert   setLevelt   DEBUGt   INFO(   t   selft   log_file_patht   debugt   handlert	   formatter(    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyt   __init__   s    	N(   R   t
   __module__t   __doc__R   R   t   Nonet   FalseR   (    (    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyR       s   t   ModbusRegisterTablec           B   sz   e  Z d  Z d, Z d- Z d. Z d/ Z d0 Z d1 Z d2 Z	 d3 Z
 d4 Z d5 Z d6 Z d7 Z d8 Z d9 Z d: Z d; Z d< Z d= Z RS(>   s   MODBUS register settings table.i    t    s   Voltage Scaling Highi   s   Voltage Scaling Lowi   s   Current Scaling Highi   s   Current Scaling Lowi   s   Software Versioni&   t   Vs   Battery Voltagei'   t   As   Charge Currenti3   s   Target Voltagei:   t   Ws   Output Poweri   s   Array Voltagei   s   Array Currenti=   s	   Sweep Vmpi>   s	   Sweep Voci<   s
   Sweep Pmaxi#   t   Cs   Heat Sink Temperaturei%   s   Battery Temperaturei4   t   Ahs	   Amp Hoursi8   t   kWhs   Kilowatt Hours(   i    R   s   Voltage Scaling Highi   (   i   R   s   Voltage Scaling Lowi   (   i   R   s   Current Scaling Highi   (   i   R   s   Current Scaling Lowi   (   i   R   s   Software Versioni   (   i&   R    s   Battery Voltagei   (   i'   R!   s   Charge Currenti   (   i3   R    s   Target Voltagei   (   i:   R"   s   Output Poweri   (   i   R    s   Array Voltagei   (   i   R!   s   Array Currenti   (   i=   R    s	   Sweep Vmpi   (   i>   R    s	   Sweep Voci   (   i<   R"   s
   Sweep Pmaxi   (   i#   R#   s   Heat Sink Temperaturei   (   i%   R#   s   Battery Temperaturei   (   i4   R$   s	   Amp Hoursi   (   i8   R%   s   Kilowatt Hoursi   (   R   R   R   t   VOLTAGE_SCALING_HIGHt   VOLTAGE_SCALING_LOWt   CURRENT_SCALING_HIGHt   CURRENT_SCALING_LOWt   SOFTWARE_VERSIONt   BATTERY_VOLTAGEt   CHARGING_CURRENTt   TARGET_REGULATION_VOLTAGEt   OUTPUT_POWERt   ARRAY_VOLTAGEt   ARRAY_CURRENTt   VMP_LAST_SWEEPt   VOC_LAST_SWEEPt   POWER_LAST_SWEEPt   HEATSINK_TEMPt   BATTERY_TEMPt   AH_CHARGE_RESETABLEt   KWH_CHARGE_RESETABLE(    (    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyR   +   s&   t   ManagementBasec           B   sP   e  Z d  Z d Z d e d „ Z e d d „ Z e d „ Z d „  Z d „  Z	 RS(	   s  Class to get raw data from TS-MPPT-60. MODBUS ID is fixed to 1 as written on data sheet TSMPPT.APP_.Modbus.EN_.10.2.pdf.

    Keyword arguments:
    host -- host name like dummy.co.jp
    cgi -- cgi script file name
    debug -- debug message output is enabled if True
    i   s	   MBCSV.cgic         C   s¸   t  j t |  ƒ j ƒ |  _ |  j j t  j ƒ  ƒ | rM |  j j t  j ƒ n  d | d | |  _	 t
 |  j t j d t j d ƒ ƒ |  _ t
 |  j t j d t j d ƒ ƒ |  _ d S(   sè   Initialize class object.

        Keyword arguments:
        host -- Host address like "192.168.1.20" of TS-MPPT-60 live view
        cgi -- CGI file name to get the information
        debug -- If True, logging is enabled.
        s   http://t   /i    N(   R   R   R   R   t   _loggerR   R
   R   R   t   _urlt   floatt   _compute_scalerR   R&   R'   t   _vscaleR(   R)   t   _iscale(   R   t   hostt   cgiR   (    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyR   N   s    	
	
i   c         C   sÔ   g  } | j  d t | ƒ ƒ | j  d t | ƒ ƒ | j  d t | d ?ƒ ƒ | j  d t | d @ƒ ƒ | j  d t | d ?ƒ ƒ | j  d t | d @ƒ ƒ t j d	 j |  j d
 j | ƒ ƒ d d ƒ} | j S(   sŽ  Get and return raw data string like "1,4,1,1,1" against MBID, Address, Register, and Field.

        Keyword arguments:
        addr -- Address to get information
        reg -- Register to get information
        mbid -- MBID
        field -- Field to get information

        >>> mb._get(addr=0x0000, reg=1)
        '1,4,2,0,0'
        >>> mb._get(addr=0x0001, reg=1)
        '1,4,2,0,0'
        s   ID=s   F=s   AHI=i   s   ALO=iÿ   s   RHI=s   RLO=s   {0}?{1}t   &t   timeouti   i   (   i   i   (   t   appendt   strt   requestst   gett   formatR;   t   joint   text(   R   t   addrt   regt   mbidt   fieldt   paramst   res(    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyt   _gete   s    'c         C   sÍ   |  j  | | | ƒ } g  | j d ƒ D] } t | ƒ ^ q% } | d } | d } d } d }	 xi | | k  rÈ | | d }
 | d 7} |
 | | 7}
 | d 7} |	 t |
 ƒ 7}	 | | k  r` |	 d 7}	 q` q` W|	 S(	   si  Read and return the value string with short integer (ex. 16bit value) against MBID, Address, and Register.

        Keyword arguments:
        address -- Address to get information
        register -- Register to get information
        mbid -- MBID

        >>> mb._read_modbus(0x0000, 1)
        '0'
        >>> mb._read_modbus(0x0001, 1)
        '0'
        t   ,i   i   i    R   i   i   t   #(   RQ   t   splitt   intRE   (   R   t   addresst   registerRM   t   raw_value_strt   vt
   raw_valuest   idx_maxt   idxt   ret_strt	   ret_short(    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyt   _read_modbus€   s    (



c         C   sE   |  j  | d ƒ } |  j  | d ƒ } t | ƒ t | ƒ t d d ƒ S(   sÃ  Compute and return the voltage/current scaler as written on data sheet page 8 or 25.
        This will be called only once when initializing this object.

        Vscaling = whole.fraction = [V_PU hi].[V_PU lo]

        Example:
        Address:Value(hex):Variable Name
        V_PU HI byte:0x004E = 78
        V_PU LO byte:0x03A6 = 934

        V_PU lo must be shifted by 16 (divided by 2^16)
        and then added to V_PU hi Vscaling = 78 + 934/65536 = 78.01425

        Keyword arguments:
        address_high -- High address like V_PU Hi byte
        address_low -- Low address like V_PU Hi byte
        >>> mb._compute_scaler(0, 1)
        0.0
        >>> mb._compute_scaler(2, 3)
        0.0
        i   i   i   (   R_   R<   t   pow(   R   t   address_hight   address_lowt   Lt   R(    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyR=   ¡   s    c         C   s>  |  j  | | ƒ } | d k rR | j d ƒ } t | d ƒ d t | d ƒ } n; t | ƒ } | d M} | d @r | d N} d | d } n  | d k r± | |  j t d	 d
 ƒ S| d k rÕ | |  j t d	 d
 ƒ S| d k r|  j |  j } | | t d	 d ƒ S| d k r| d S| d k s2| d k r6| S| Sd S(   s´  Calculate and return a scaled status value against address got from TS-MPPT-60.

        Keyword arguments:
        address -- address to get a value
        scale_factor -- unit string
        register -- register to get a value

        Returns:
            Scaled value like 12.4 against your expecting.

        >>> mb.get_scaled_value(0x0026, 'V', 1)
        0.0
        >>> mb.get_scaled_value(0x0027, 'A', 1)
        0.0
        i   RS   i    i   iÿÿ  i €  iÿÿÿÿR    i   i   R!   R"   i   R$   g      $@R%   R#   N(   R_   RT   RU   R>   R`   R?   (   R   RV   t   scale_factorRW   RX   t   valuest	   raw_valuet   wscale(    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyt   get_scaled_value»   s*    %


(
   R   R   R   t
   _ID_MODBUSR   R   RQ   R_   R=   Ri   (    (    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyR8   C   s   !	t   __main__(   t   patcht   DummyRequestc           B   s   e  Z d  Z RS(   s/   Dummy response class against requests.Response.(   R   R   R   (    (    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyRm   ï   s   t   DummyResponsec           B   s   e  Z d  Z RS(   s/   Dummy response class against requests.Response.(   R   R   R   (    (    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyRn   ó   s   s   dummy.co.jps   http://s
   /dummy.cgis	   1,4,2,0,0s   requests.gett   returnst   verboset
   extraglobsR@   t   mb(   R   R   RF   t   objectR    R   R8   R   t   doctestt   unittest.mockRl   t   mockRm   Rn   t
   dummy_hostt   reqt   urlRP   t   requestRJ   t   _mt   return_valuet   testmodt   True(    (    (    st   /home/pflament/export/wera/instrdocs/solar/morningstar-scripts/github/tsmppt60_driver-master/tsmppt60_driver/base.pyt   <module>   s0    ¥						