Ejemplo n.º 1
0
def notification_start_charge_result(**data):
    """
    接口名称:notification_start_charge_result
    使用要求:充电桩实际启动成功或失败后,应立即将启动结果信息同步推送至市级平台e充网,时
    间应控制在启动命令下发后50秒内
    """
    # Data = {
    #     "StartChargeSeq": start_charge_seq,
    #     "ConnectorID": connector_id,
    # }
    # try:
    #     order = Order.objects.get(start_charge_seq=start_charge_seq)
    #     if order.begin_time:
    #         Data["StartTime"] = order.begin_time.strftime("%Y-%m-%d %H:%M:%S")
    #     else:
    #         Data["StartTime"] = datetime.now().strptime("%Y-%m-%d %H:%M:%S")
    #
    #     Data["StartChargeSeqStat"] = get_order_status(order.charg_pile.charg_status_id)
    #
    # except Order.DoesNotExist as ex:
    #     Data["StartChargeSeqStat"] = 5
    #     Data["StartTime"] = datetime.now().strptime("%Y-%m-%d %H:%M:%S")

    print(data)
    echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
    status = echarge.notification_start_charge_result(**data)
    if status > 0:
        print("notification_start_charge_result failure:", status)
    else:
        print("notification_start_charge_result succcess:", status)
Ejemplo n.º 2
0
def notification_connector_status():
    """定时推送设备接口状态"""
    connectors = ConnectorInfo.objects.all()
    echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
    for connector in connectors:
        status = echarge.notification_station_status(connector.ConnectorID,
                                                     connector.Status)
        if status > 0:
            print("设备状态变化推送失败:{},{}".format(connector.ConnectorID, status))
        else:
            print("设备状态变化推送成功:{},{}".format(connector.ConnectorID, status))
Ejemplo n.º 3
0
def notification_connector_status():
    """定时推送设备接口状态"""
    connectors = ConnectorInfo.objects.filter(EquipmentID__is_subsidy=1)
    echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
    print('notification_connector_status: EchargeNet: ', id(echarge))
    for connector in connectors:
        status = echarge.notification_station_status(connector.ConnectorID, connector.Status)
        if status > 0:
            print("device status push fail:{},{}".format(connector.ConnectorID, status))
        else:
            print("device status push success:{},{}".format(connector.ConnectorID, status))

        time.sleep(0.5)
Ejemplo n.º 4
0
def notification_stop_charge_result(start_charge_seq, connector_id):
    """
    接口名称:notification_stop_charge_result
    当充电桩实际停止充电后须立即推送结果信息到市级平台e充网,从充电桩收到停止命
    令到向市级平台e充网推送充电停止结果时间间隔控制在50秒内
    :return:
    """
    Data = {
        "StartChargeSeq": start_charge_seq,
        "ConnectorID": connector_id,
    }
    # Ret = 0
    # Msg = ""
    try:
        sleep(5)
        order = Order.objects.get(start_charge_seq=start_charge_seq)

        Data["StartChargeSeqStat"] = get_order_status(order.charg_status_id)

    except Order.DoesNotExist as ex:
        Data["StartChargeSeqStat"] = 5
        # Msg = "Order Not Exists"

    # encrypt_data = data_encode(**Data)  # 数据加密
    # # 数据签名, 用Ret+Msg+Data生成返回签名
    # sig_data = "{0}{1}{2}".format(str(Ret), Msg, encrypt_data)
    # ret_sig = get_hmac_md5(settings.SIGSECRET, sig_data)
    # result = {
    #     "Ret": Ret,
    #     "Msg": Msg,
    #     "Data": encrypt_data,
    #     "Sig": ret_sig,
    # }
    echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
    status = echarge.notification_stop_charge_result(**Data)
    if status > 0:
        print("推送停止充电结果失败!", status)
    else:
        print("推送停止充电结果成功!", status)

    connector_status = echarge.notification_station_status(connector_id,
                                                           0)  # 设置为空闲状态
    if status > 0:
        print("设备状态变化推送失败!", connector_status)
    else:
        print("设备状态变化推送成功!", connector_status)
Ejemplo n.º 5
0
def notification_equip_charge_status():
    """
    推送充电状态
    使用要求:充电桩开始充电后,均须每间隔50秒向市级平台e充网推送一次充电状态数据
    :return:
    """
    orders = Order.objects.select_related("charg_pile").filter(Q(status=None) | Q(status=0) | Q(status=1), start_charge_seq__isnull=False)

    for order in orders:
        result = {}
        gun_num = order.gun_num
        ConnectorID = '{0}{1}'.format(order.charg_pile.pile_sn, gun_num)
        gun = ChargingGun.objects.get(charg_pile=order.charg_pile, gun_num=gun_num)
        result["ConnectorID"] = ConnectorID
        result["StartChargeSeq"] = order.start_charge_seq

        if order.charg_status:
            result["StartChargeSeqStat"] = get_order_status(order.charg_status_id)
            result["ConnectorStatus"] = get_equipment_connector_status(gun.work_status, order.charg_status_id)
        else:
            result["StartChargeSeqStat"] = get_order_status(gun.charg_status_id)
            result["ConnectorStatus"] = get_equipment_connector_status(gun.work_status, gun.charg_status_id)

        # A 相电流  A 相电压
        if order.begin_time is None or order.end_time is None:
            continue

        result["CurrentA"] = 0
        result["VoltageA"] = 0
        result["Soc"] = float(order.end_soc)
        result["ChargeModel"] = 1

        result["StartTime"] = order.begin_time.strftime("%Y-%m-%d %H:%M:%S")
        result["EndTime"] = order.end_time.strftime("%Y-%m-%d %H:%M:%S")
        result["TotalPower"] = float(order.get_total_reading())
        result["TotalMoney"] = float(order.consum_money.quantize(decimal.Decimal("0.01")))

        echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
        print("98:", result)
        status = echarge.notification_equip_charge_status(**result)
        if status > 0:
            print("push charging status fail!", status)
        else:
            print("push charging status success!", status)
Ejemplo n.º 6
0
def notification_start_charge_result(start_charge_seq, connector_id):
    """
    接口名称:notification_start_charge_result
    使用要求:充电桩实际启动成功或失败后,应立即将启动结果信息同步推送至市级平台e充网,时
    间应控制在启动命令下发后50秒内
    """
    Data = {
        "StartChargeSeq": start_charge_seq,
        "ConnectorID": connector_id,
    }
    # Ret = 0
    # Msg = ""
    try:
        sleep(5)
        order = Order.objects.get(start_charge_seq=start_charge_seq)
        if order.begin_time:
            Data["StartTime"] = order.begin_time.strftime("%Y-%m-%d %H:%M:%S")
        else:
            Data["StartTime"] = datetime.now().strptime("%Y-%m-%d %H:%M:%S")

        Data["StartChargeSeqStat"] = get_order_status(order.charg_status_id)

    except Order.DoesNotExist as ex:
        Data["StartChargeSeqStat"] = 5
        Data["StartTime"] = datetime.now().strptime("%Y-%m-%d %H:%M:%S")
        # Msg = "Order Not Exists"

    # encrypt_data = data_encode(**Data)  # 数据加密
    # # 数据签名, 用Ret+Msg+Data生成返回签名
    # sig_data = "{0}{1}{2}".format(str(Ret), Msg, encrypt_data)
    # ret_sig = get_hmac_md5(settings.SIGSECRET, sig_data)
    # result = {
    #     "Ret": Ret,
    #     "Msg": Msg,
    #     "Data": encrypt_data,
    #     "Sig": ret_sig,
    # }
    echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
    status = echarge.notification_start_charge_result(**Data)
    if status > 0:
        print("推送启动充电结果失败!", status)
    else:
        print("推送启动充电结果成功!", status)
Ejemplo n.º 7
0
def notification_stop_charge_result(**data):
    """
    接口名称:notification_stop_charge_result
    当充电桩实际停止充电后须立即推送结果信息到市级平台e充网,从充电桩收到停止命
    令到向市级平台e充网推送充电停止结果时间间隔控制在50秒内
    :return:
    """
    echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
    status = echarge.notification_stop_charge_result(**data)
    if status > 0:
        print("notification_stop_charge_result failure", status)
    else:
        print("notification_stop_charge_result success", status)

    connector_id = data.get("ConnectorID")
    connector_status = echarge.notification_station_status(connector_id, 0)  # 设置为空闲状态
    if status > 0:
        print("notification_station_status failure", connector_status)
    else:
        print("120:notification_station_status success", connector_status)
Ejemplo n.º 8
0
def check_charge_orders():
    """
    接口名称:check_charge_orders
    使用要求:每天0点到3点之间推送前一天市级平台e充网启动的所有订单信息
    1、是否是经过上报的订单
    2、开始时间还是结束时间(跨天问题)
    """
    prev_date = datetime.now().date() - timedelta(days=1)
    print("当前时间:", prev_date)
    order_totals = Order.objects.filter(end_time__date=prev_date, start_charge_seq__isnull=False, status=2, charg_pile__is_subsidy=1)\
        .aggregate(
            start_time=Min("end_time"), end_time=Max("end_time"), order_count=Count("out_trade_no"),
            total_power=Sum(F("end_reading") - F("begin_reading")), total_money=Sum("consum_money")
        )
    print(order_totals)
    check_orders = {}
    check_order_seq = '{0}{1}{2}'.format(settings.OPERATORID, datetime.now().strftime('%Y%m%d%H%M%S'), random.randint(10000, 100000))
    check_orders["CheckOrderSeq"] = check_order_seq
    if order_totals["start_time"]:
        check_orders["StartTime"] = order_totals["start_time"].strftime("%Y-%m-%d %H:%M:%S")
    else:
        check_orders["StartTime"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    if order_totals["end_time"]:
        check_orders["EndTime"] = order_totals["end_time"].strftime("%Y-%m-%d %H:%M:%S")
    else:
        check_orders["EndTime"] = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    check_orders["OrderCount"] = order_totals["order_count"]
    check_orders["TotalOrderPower"] = float(order_totals["total_power"])
    check_orders["TotalOrderMoney"] = float(order_totals["total_money"])

    orders = Order.objects.filter(end_time__date=prev_date, start_charge_seq__isnull=False,
                                  status=2, charg_pile__is_subsidy=1)
    charge_orders = []
    for order in orders:
        d_order = {}
        d_order["StartChargeSeq"] = order.start_charge_seq
        d_order["TotalPower"] = float(order.get_total_reading())
        d_order["TotalMoney"] = float(order.consum_money)
        charge_orders.append(d_order)

    check_orders["ChargeOrders"] = charge_orders
    print(json.dumps(check_orders))

    echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
    ret_data = echarge.check_charge_orders(**check_orders)
    if "Ret" in ret_data and ret_data["Ret"] == 0:
        # 解密
        ret_crypt_data = ret_data["Data"]
        ret_decrypt_data = data_decode(ret_crypt_data)
        # 获取到code值
        dict_decrpt_data = json.loads(ret_decrypt_data)
        check_order = {
            "CheckOrderSeq": dict_decrpt_data["CheckOrderSeq"],
            "StartTime": datetime.strptime(dict_decrpt_data["StartTime"], '%Y-%m-%d %H:%M:%S'),
            "EndTime": datetime.strptime(dict_decrpt_data["EndTime"], '%Y-%m-%d %H:%M:%S'),
            "TotalDisputeOrder": dict_decrpt_data["TotalDisputeOrder"],
            "TotalDisputePower": dict_decrpt_data["TotalDisputePower"],
            "TotalDisputeMoney": dict_decrpt_data["TotalDisputeMoney"],
        }
        CheckChargeOrder.objects.create(**check_order)
        DisputeOrders = dict_decrpt_data["DisputeOrders"]
        for disOrder in DisputeOrders:
            DisputeOrder.objects.create(**disOrder)
    else:
       print(ret_data["Msg"])
Ejemplo n.º 9
0
def notification_charge_order_info_for_bonus():
    """
    推送充电订单信息(运营考核奖励)
    使用要求:自充电桩停止充电并生成订单后,订单须在150秒内上报到市级平台e充网,如上报失败
    须按照以下频率推送订单信息(150/300/…./1800/3600/….,单位秒)
    """
    start_date = date(2020, 4, 7)
    orders = Order.objects.filter(Q(report_result__isnull=True) | Q(report_result__gt=0),  charg_pile__is_subsidy=1, status=2, begin_time__date__gte=start_date, consum_money__gt=0)
    result ={}
    for order in orders:
        if order.begin_time is None or order.end_time is None:
            continue

        if order.report_time is not None:
            if (datetime.now() - order.report_time).seconds < 145:
                continue

        try:
            gun = ChargingGun.objects.get(charg_pile=order.charg_pile, gun_num=order.gun_num)
        except ChargingGun.DoesNotExist as ex:
            gun = None

        ConnectorID = '{}{}'.format(order.charg_pile.pile_sn, order.gun_num)
        result["StartChargeSeq"] = order.out_trade_no
        result["ConnectorID"] = ConnectorID
        result["StartTime"] = order.begin_time.strftime("%Y-%m-%d %H:%M:%S")
        result["EndTime"] = order.end_time.strftime("%Y-%m-%d %H:%M:%S")
        if order.start_charge_seq:
            result["ChargeModel"] = 1
        else:
            result["ChargeModel"] = 3

        result["TotalPower"] = float(order.get_total_reading())
        result["TotalMoney"] = float(order.consum_money.quantize(decimal.Decimal("0.01")))
        result["UserName"] = order.name
        result["StationID"] = str(order.charg_pile.station.id)
        result["EquipmentID"] = str(order.charg_pile.id)
        result["ConnectorPower"] = float(gun.power) if gun is not None else 0
        result["ChargeLast"] = int(order.total_seconds()) if order.total_seconds() > 0 else 0
        result["MeterValueStart"] = float(order.begin_reading.quantize(decimal.Decimal("0.01")))
        result["MeterValueEnd"] = float(order.end_reading.quantize(decimal.Decimal("0.01")))
        if order.charg_status_id == 91:
            result["StopReason"] = 0    # 用户手动停止充电
        elif order.charg_status_id in [95, 96]:
            result["StopReason"] = 3    # 充电机设备故障
        elif order.charg_status_id in [98, 92]:
            result["StopReason"] = 4    # 连接器断开
        elif order.charg_status_id in [93, 94, 97]:
            result["StopReason"] = 1    # 客户归属地运营商平台停止充
        else:
            result["StopReason"] = 3  # 充电机设备故障

        echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
        print('EchargeNet: ', id(echarge))
        ret_data = echarge.notification_charge_order_info_for_bonus(**result)

        if "Ret" in ret_data and ret_data["Ret"] == 0:
            # 解密
            ret_crypt_data = ret_data["Data"]
            ret_decrypt_data = data_decode(ret_crypt_data)
            # 获取到code值
            print(ret_decrypt_data["StartChargeSeq"])
            ConfirmResult = ret_decrypt_data["ConfirmResult"]
        else:
            ConfirmResult = 99

        order.report_result = ConfirmResult
        order.report_time = datetime.now()
        order.save()
        if ConfirmResult > 0:
            print("notification_charge_order_info_for_bonus failure:", ConfirmResult)
        else:
            print("notification_charge_order_info_for_bonus success:", ConfirmResult)
Ejemplo n.º 10
0
def notification_charge_order_info_for_bonus():
    """
    推送充电订单信息(运营考核奖励)
    使用要求:自充电桩停止充电并生成订单后,订单须在150秒内上报到市级平台e充网,如上报失败
    须按照以下频率推送订单信息(150/300/…./1800/3600/….,单位秒)
    """
    orders = Order.objects.filter(Q(report_result__isnull=True)
                                  | Q(report_result__gt=0),
                                  start_charge_seq__isnull=False,
                                  status=2)
    result = {}
    # Ret = 0
    # Msg = ""
    for order in orders:
        if order.begin_time is None or order.end_time is None:
            continue

        if order.report_time is not None:
            if (datetime.now() - order.report_time).seconds < 145:
                continue

        try:
            gun = ChargingGun.objects.get(charg_pile=order.charg_pile,
                                          gun_num=order.gun_num)
        except ChargingGun.DoesNotExist as ex:
            gun = None

        ConnectorID = '{}{}'.format(order.charg_pile.pile_sn, order.gun_num)
        result["StartChargeSeq"] = order.start_charge_seq
        result["ConnectorID"] = ConnectorID
        result["StartTime"] = order.begin_time.strftime("%Y-%m-%d %H:%M:%S")
        result["EndTime"] = order.end_time.strftime("%Y-%m-%d %H:%M:%S")
        result["ChargeModel"] = 0
        result["TotalPower"] = str(order.get_total_reading())
        result["TotalMoney"] = str(order.consum_money)
        result["UserName"] = order.name
        result["StationID"] = str(order.charg_pile.station.id)
        result["EquipmentID"] = order.charg_pile.pile_sn
        result["ConnectorPower"] = gun.power if gun is not None else 0
        result["ChargeLast"] = order.total_seconds()
        result["MeterValueStart"] = str(order.begin_reading)
        result["MeterValueEnd"] = str(order.end_reading)
        if order.charg_status_id == 91:
            result["StopReason"] = 0  # 用户手动停止充电
        elif order.charg_status_id in [95, 96]:
            result["StopReason"] = 3  # 充电机设备故障
        elif order.charg_status_id in [98, 92]:
            result["StopReason"] = 4  # 连接器断开
        elif order.charg_status_id in [93, 94, 97]:
            result["StopReason"] = 1  # 客户归属地运营商平台停止充

        # encrypt_data = data_encode(**result)  # 数据加密
        # # 数据签名, 用Ret+Msg+Data生成返回签名
        # sig_data = "{0}{1}{2}".format(str(Ret), Msg, encrypt_data)
        # ret_sig = get_hmac_md5(settings.SIGSECRET, sig_data)
        # result = {
        #     "Ret": Ret,
        #     "Msg": Msg,
        #     "Data": encrypt_data,
        #     "Sig": ret_sig,
        # }
        echarge = EchargeNet(settings.MQTT_REDIS_URL, settings.MQTT_REDIS_PORT)
        ret_data = echarge.notification_charge_order_info_for_bonus(**result)

        if "Ret" in ret_data and ret_data["Ret"] == 0:
            # 解密
            ret_crypt_data = ret_data["Data"]
            ret_decrypt_data = data_decode(ret_crypt_data)
            # 获取到code值
            dict_decrpt_data = json.loads(ret_decrypt_data)
            print(dict_decrpt_data["StartChargeSeq"])
            ConfirmResult = dict_decrpt_data["ConfirmResult"]
        else:
            ConfirmResult = 99

        order.report_result = ConfirmResult
        order.report_time = datetime.now()
        order.save()
        if ConfirmResult > 0:
            print("推送充电订单信息失败!", ConfirmResult)
        else:
            print("推送充电订单信息成功!", ConfirmResult)