def get_data_period_with_fio_now(type_mechanism): '''get data shift for by type of mechanism with work NOW''' if type_mechanism == 'usm': data = usm_periods(time_for_shift_usm(*today_shift_date())) if type_mechanism == 'kran': data = kran_periods(time_for_shift_kran(*today_shift_date())) if type_mechanism == 'sennebogen': data = sennebogen_periods( time_for_shift_sennebogen(*today_shift_date())) data_with_fio = add_fio(data, *today_shift_date()) return jsonify(data_with_fio)
def hash_now(type_mechanism): date, shift = today_shift_date() data = mech_periods(type_mechanism, date, shift) data = add_fio(data, date, shift) client = MongoClient('mongodb://localhost:27017') mongodb = client['HashShift'] posts = mongodb[type_mechanism] # logger.debug(data) if data is not None: # convert int key to str mongo_data = {str(key): value for key, value in data.items()} for key, value in data.items(): mongo_data[str(key)]['data'] = { str(k): v for k, v in value['data'].items() } mongo_data['_id'] = "now" posts.delete_one({"_id": "now"}) posts.insert_one(mongo_data)
def get_data_period_with_fio2(type_mechanism, date_shift, shift): '''get data shift for by type of mechanism''' today_date, today_shift = today_shift_date() try: date = datetime.strptime(date_shift, '%d.%m.%Y').date() # convert 1.1.2020 to 01.01.2020 date_shift = date.strftime("%d.%m.%Y") except ValueError: return make_response(jsonify({'error': 'Bad format date'}), 400) if today_date == date and today_shift == shift: mongo_request = mongodb[type_mechanism].find_one({"_id": "now"}) else: mongo_request = mongodb[type_mechanism].find_one( {"_id": f"{date_shift}|{shift}"}) if mongo_request is not None: # if item alredy exist del mongo_request["_id"] return jsonify(mongo_request) data = mech_periods(type_mechanism, date, shift) data = add_fio(data, date, shift) # add_to_mongo(data, date, shift) if data is not None: # convert int key to str mongo_data = {str(key): value for key, value in data.items()} for key, value in data.items(): mongo_data[str(key)]['data'] = { str(k): v for k, v in value['data'].items() } if today_date == date and today_shift == shift: mongo_request = mongodb[type_mechanism].find_one( # request {"_id": "now"}) if mongo_request is not None: # if item alredy exist del mongo_request["_id"] return jsonify(mongo_request) else: mongo_data['_id'] = f'{date_shift}|{shift}' posts = mongodb[type_mechanism] posts.insert_one(mongo_data) return jsonify(data)
def get_per_shift(m_id): '''get data for this shift by id mechanism''' date_shift, shift = today_shift_date() try: data_per_shift = db.session.query(Post).filter( Post.date_shift == date_shift, Post.shift == shift, Post.mechanism_id == m_id).all() except Exception as e: logger.debug(e) try: start = db.session.query(Post.timestamp).filter( Post.date_shift == date_shift, Post.shift == shift, Post.mechanism_id == m_id).first()[0] stop = db.session.query(Post.timestamp).filter( Post.date_shift == date_shift, Post.shift == shift, Post.mechanism_id == m_id).order_by( Post.timestamp.desc()).first()[0] except TypeError: abort(405) start += timedelta(hours=HOURS) # it should be better stop += timedelta(hours=HOURS) total = round(sum(el.value for el in data_per_shift) / 60, 3) data = {'total': total, 'start': start, 'stop': stop} return jsonify(data)
def time_for_shift_sennebogen(date_shift, shift): '''get dict with all minute's values for the period, name and total value is lever, value3 is speed roler, ''' # get data from db shift = int(shift) all_mechs = all_mechanisms_id('sennebogen') try: cursor = db.session.query(Post).filter( Post.date_shift == date_shift, Post.shift == shift, Post.mechanism_id.in_(all_mechs)).order_by( Post.mechanism_id).all() except Exception as e: logger.debug(e) # create dict all works mechanism in shift data_per_shift = {} for el in cursor: date_t = el.timestamp.replace(second=0, microsecond=0) date_t += timedelta(hours=HOURS) # date_t = date_t.strftime("%H:%M") x = -1 if el.value is None else el.value y = -1 if el.value2 is None else el.value2 if x < 500 and y < 500: # and change state_mech in function # if y < 750: # and change state_mech in function value_minute = 0 else: value_minute = 1 if data_per_shift.get(el.mech.number): data_per_shift[ el.mech.number]['data'][date_t] = value_minute, x, y # ? x, y data_per_shift[el.mech.number]['total_time'] += 1 else: data_per_shift[el.mech.number] = {} data_per_shift[el.mech.number]['mechanism'] = el.mech data_per_shift[el.mech.number]['total_time'] = 1 data_per_shift[el.mech.number]['data'] = {} data_per_shift[el.mech.number]['data'][date_t] = value_minute, x, y data_per_shift[el.mech.number].setdefault('work_time', 0) if value_minute != 0: data_per_shift[el.mech.number]['work_time'] += 1 # get start time for this shift start = datetime.combine(date_shift, datetime.min.time()) if shift == 1: start = start.replace(hour=8, minute=0, second=0, microsecond=0) else: start = start.replace(hour=20, minute=0, second=0, microsecond=0) if data_per_shift == {}: return None # create dict with all minutes to now if value is not return (-1) because # 0 may exist #---------------------------PART2------------------------------ i don't want 2 functions time_by_minuts = {} # pprint(data_per_shift) for key in data_per_shift.keys(): flag_start = True # flag_finish = True time_by_minuts[key] = {} time_by_minuts[key]['name'] = data_per_shift[key]['mechanism'].name time_by_minuts[key]['id'] = data_per_shift[key]['mechanism'].id time_by_minuts[key]['number'] = data_per_shift[key]['mechanism'].number # translate hours into minutes and round time_by_minuts[key]['total_time'] = round( data_per_shift[key]['total_time'] / 60, 1) time_by_minuts[key]['work_time'] = round( data_per_shift[key]['work_time'] / 60, 1) time_by_minuts[key]['data'] = {} delta_minutes = start time_move = 0 for i in range(1, 60 * 12 + 1): date_t = delta_minutes.strftime("%H:%M") val_minute = data_per_shift[key]['data'].setdefault( delta_minutes, (-1, 0, 0)) if val_minute[0] != -1: time_move += val_minute[0] / 60 time_by_minuts[key]['data'][i] = { 'time': date_t, 'value': val_minute[0], 'x': val_minute[1], 'y': val_minute[2], 'time_move': round(time_move, 2), } delta_minutes += timedelta(minutes=1) today_date, today_shift = today_shift_date() if val_minute[0] > 0 and flag_start: time_by_minuts[key]['start'] = date_t flag_start = False if val_minute[0] > 0: time_by_minuts[key]['finish'] = date_t if delta_minutes >= datetime.now( ) and date_shift == today_date and today_shift == shift: break return time_by_minuts
def time_for_shift_kran(date_shift, shift): '''get dict with all minute's values for the period, name and total''' # get data from db shift = int(shift) all_mechs = all_mechanisms_id('kran') try: cursor = db.session.query(Post).filter(Post.date_shift == date_shift, Post.shift == shift, Post.mechanism_id.in_(all_mechs)).order_by(Post.mechanism_id).all() except Exception as e: logger.debug(e) # create dict all works mechanism in shift data_per_shift = {} for el in cursor: date_t = el.timestamp.replace(second=0, microsecond=0) date_t += timedelta(hours=HOURS) if data_per_shift.get(el.mech.number): # if exist if el.value == 1 or el.value == 3: # 123 data_per_shift[el.mech.number]['total_90'] += 1 if el.value == 2: data_per_shift[el.mech.number]['total_180'] += 1 try: data_per_shift[el.mech.number]['total_terminals_180'][str(el.terminal)] +=1 except KeyError: data_per_shift[el.mech.number]['total_terminals_180'][str(el.terminal)] = 1 data_per_shift[el.mech.number]['data'][date_t] = el.value, el.count, el.terminal # pre_value=el.count # if will be problem with GPRS else: data_per_shift[el.mech.number] = {} data_per_shift[el.mech.number]['mechanism'] = el.mech data_per_shift[el.mech.number]['total_90'] = 0 data_per_shift[el.mech.number]['total_180'] = 0 data_per_shift[el.mech.number]['total_terminals_180'] = {} if el.value == 1: data_per_shift[el.mech.number]['total_90'] = 1 if el.value == 2: data_per_shift[el.mech.number]['total_180'] = 1 data_per_shift[el.mech.number]['total_terminals_180'][str(el.terminal)] = 1 data_per_shift[el.mech.number]['data'] = {} data_per_shift[el.mech.number]['data'][date_t] = el.value, el.count, el.terminal # pre_value=el.count # get start time for this shift start = datetime.combine(date_shift, datetime.min.time()) if shift == 1: start = start.replace(hour=8, minute=0, second=0, microsecond=0) else: start = start.replace(hour=20, minute=0, second=0, microsecond=0) if data_per_shift == {}: return None #---------------------------PART2------------------------------ i don't want 2 functions # create dict with all minutes to now if value is not return (-1) because 0 may exist time_by_minuts = {} for key, value in data_per_shift.items(): flag_start = True time_by_minuts[key] = {} time_by_minuts[key]['name'] = data_per_shift[key]['mechanism'].name time_by_minuts[key]['number'] = data_per_shift[key]['mechanism'].number time_by_minuts[key]['id'] = data_per_shift[key]['mechanism'].id time_by_minuts[key]['total_terminals_180'] = data_per_shift[key]['total_terminals_180'] # translate hours into minutes and round time_by_minuts[key]['total_180'] = round(data_per_shift[key]['total_180'], 2) time_by_minuts[key]['total_90'] = round(data_per_shift[key]['total_90'], 2) time_by_minuts[key]['data'] = {} delta_minutes = start try: last_find_item = db.session.query(Post).filter(Post.mechanism_id==data_per_shift[key]['mechanism'].id).order_by( Post.timestamp.desc()).first() except Exception as e: logger.debug(e) tmp_terminal = last_find_item.terminal # time_by_minuts[key]['total_terminals_180'] = {str(tmp_terminal): 0} # str becouse mongo need str key for i in range(1, 60 * 12 + 1): # 720 minutes in shift date_t = delta_minutes.strftime("%H:%M") try: val_minute = data_per_shift[key]['data'][delta_minutes][0] except KeyError: val_minute = -1 try: terminal = data_per_shift[key]['data'][delta_minutes][2] tmp_terminal = terminal except KeyError: # if item not exist get last found value terminal = tmp_terminal if val_minute == 4: # show 4 how 0 look get api val_minute =0 time_by_minuts[key]['data'][i] = { 'time': date_t, 'value': val_minute, 'terminal': terminal } delta_minutes += timedelta(minutes=1) today_date, today_shift = today_shift_date() if val_minute > 0 and flag_start: time_by_minuts[key]['start'] = date_t flag_start = False if val_minute > 0: time_by_minuts[key]['finish'] = date_t if delta_minutes >= datetime.now() and date_shift == today_date and today_shift == shift: # if now moment break time_by_minuts[key]['terminal'] = terminal # replace items from -1 to 0 if kran work, show + 4 minuts pre_items = -1 work_count = 0 last_value = 0 for number_item, data in time_by_minuts[key]['data'].items(): if data['value'] == -1 and pre_items != -1 and work_count < 5: time_by_minuts[key]['data'][number_item]['value'] = last_value work_count += 1 else: last_value = 0 if data['value'] == 5: # if kran move last_value = 5 work_count = 0 pre_items = data['value'] return time_by_minuts
def get_data_period_with_fio_now2(type_mechanism): '''get data shift for by type of mechanism with work NOW''' data = mech_periods(type_mechanism, *today_shift_date()) data_with_fio = add_fio(data, *today_shift_date()) return jsonify(data_with_fio)
def time_for_shift_usm(date_shift, shift): '''get dict with all minute's values for the period, name and total value is lever, value3 is speed roler, ''' # get data from db shift = int(shift) all_mechs = all_mechanisms_id('usm') try: cursor = db.session.query(Post).filter( Post.date_shift == date_shift, Post.shift == shift, Post.mechanism_id.in_(all_mechs)).order_by( Post.mechanism_id).all() except Exception as e: logger.debug(e) # create dict all works mechanism in shift data_per_shift = {} for el in cursor: date_t = el.timestamp.replace(second=0, microsecond=0) date_t += timedelta(hours=HOURS) # date_t = date_t.strftime("%H:%M") el.value = -1 if el.value is None else el.value el.value3 = 0 if el.value3 is None else el.value3 val_min = 0 if el.value < 0.1 else el.value el.value = 0 if el.value3 < 5 else el.value # maybe more, value3 is speed rool val_min = 0 if el.value3 < 5 else el.value if data_per_shift.get(el.mech.number): # bad data_per_shift[ el.mech.number]['data'][date_t] = val_min, el.value3, el.value data_per_shift[el.mech.number]['time_coal'] += el.value data_per_shift[el.mech.number]['total_time'] += 1 else: data_per_shift[el.mech.number] = {} data_per_shift[el.mech.number]['mechanism'] = el.mech data_per_shift[el.mech.number]['time_coal'] = el.value data_per_shift[el.mech.number]['total_time'] = 1 data_per_shift[el.mech.number]['data'] = {} data_per_shift[ el.mech.number]['data'][date_t] = val_min, el.value3, el.value data_per_shift[el.mech.number].setdefault('work_time', 0) if el.value > 0: data_per_shift[el.mech.number]['work_time'] += 1 # get start time for this shift start = datetime.combine(date_shift, datetime.min.time()) if shift == 1: start = start.replace(hour=8, minute=0, second=0, microsecond=0) else: start = start.replace(hour=20, minute=0, second=0, microsecond=0) if data_per_shift == {}: return None # create dict with all minutes to now if value is not return (-1) because # 0 may exist time_by_minuts = {} # pprint(data_per_shift) for key in data_per_shift.keys(): flag_start = True mech = data_per_shift[key]['mechanism'] time_by_minuts[key] = {} time_by_minuts[key]['name'] = mech.name time_by_minuts[key]['id'] = mech.id time_by_minuts[key]['number'] = mech.number time_by_minuts[key]['tons_in_hour'] = usm_tons_in_hour[mech.number] # translate hours into minutes and round time_by_minuts[key]['time_coal'] = round( data_per_shift[key]['time_coal'] / 60, 2) time_by_minuts[key]['total_time'] = round( data_per_shift[key]['total_time'] / 60, 1) time_by_minuts[key]['work_time'] = round( data_per_shift[key]['work_time'] / 60, 1) time_by_minuts[key]['data'] = {} delta_minutes = start try: last_find_item = db.session.query(Post).filter( Post.mechanism_id == data_per_shift[key] ['mechanism'].id).order_by(Post.timestamp.desc()).first() except Exception as e: logger.debug(e) terminal = last_find_item.terminal time_coal = 0 for i in range(1, 60 * 12 + 1): date_t = delta_minutes.strftime("%H:%M") val_minute = data_per_shift[key]['data'].setdefault( delta_minutes, (-1, -1, 0)) if len(val_minute) < 3: print(val_minute) time_coal += val_minute[2] / 60 time_by_minuts[key]['data'][i] = { 'time': date_t, 'value': val_minute[0], 'speed': val_minute[1], 'time_coal': round(time_coal, 2), 'terminal': terminal, } delta_minutes += timedelta(minutes=1) today_date, today_shift = today_shift_date() if val_minute[0] > 0 and flag_start: time_by_minuts[key]['start'] = date_t flag_start = False if val_minute[0] > 0: time_by_minuts[key]['finish'] = date_t if delta_minutes >= datetime.now( ) and date_shift == today_date and today_shift == shift: break time_by_minuts[key]['terminal'] = terminal return time_by_minuts
values_period = value_min pre_time = value_number['time'] counter += 1 else: step += 1 new_data[counter] = { 'time': pre_time, 'value': values_period, 'step': step } mechanisms_data[mech]['data'] = new_data return mechanisms_data def get_values_min(value_number): if value_number['value'] >= 0 and value_number['value'] < 0.1: if value_number['speed'] <= 5: return 0 # yellow else: return 2 # dark yellow elif value_number['value'] >= 0.1: return 1 # blue else: return -1 # red if __name__ == "__main__": from pprint import pprint # pprint(time_for_shift_usm(*today_shift_date())) pprint(usm_periods(time_for_shift_usm(*today_shift_date())))