Code Monkey home page Code Monkey logo

device_config's Introduction

Device Configuration

A repository to keep tracked of the static device information at LCLS. The idea is that the standard beamline instruments be included here, while those that are often removed and/or associated with individual experiments are kept elsewhere.

How to Use

Clone the repository and point a happi Client at the database

import happi
client = happi.Client(path='path/to/device_config/db.json')

Database Location

device_config is currently deployed here:

/reg/g/pcds/pyps/apps/hutch-python/device_config/db.json

Backup

A daily backup is done via CRON job which commits any changes to the deploy branch and pushes to https://github.com/pcdshub/device_config/. This is performed in case an error is made and the local copy of the device_config is lost.

device_config's People

Contributors

klauer avatar n-wbrown avatar pravemuri avatar zllentz avatar zrylettc avatar

Watchers

 avatar  avatar  avatar

device_config's Issues

"id" vs "name"

Is there a good reason we use a different "id" and device name here?

I'd expect to be able to do:

client = happi.Client.from_config()
client['cxi_dg1_slits']

But what actually works is:

client['CXI:DG1:JAWS']
-> SearchResult(client=<happi.client.Client object at 0x7f945f1adeb8>, metadata={'name': 'cxi_dg1_slits', 'device_class': 'pcdsdevices.device_types.Slits', 'args': ['{{prefix}}'], 'kwargs': {'name': '{{name}}'}, 'active': True, 'documentation': None, 'prefix': 'CXI:DG1:JAWS', 'beamline': 'CXI', 'location_group': None, 'functional_group': None, 'z': 1035.5, 'stand': 'DG1', 'detailed_screen': None, 'embedded_screen': None, 'engineering_screen': None, 'system': 'beam control', 'macros': None, 'lightpath': False, 'parent': None, '_id': 'CXI:DG1:JAWS', 'creation': 'Tue Feb 27 10:41:25 2018', 'last_edit': 'Thu Apr 12 14:40:08 2018', 'screen': None, 'type': 'pcdsdevices.happi.containers.Slits'})

This certainly does work, as it's explicitly using the name key:

client.find_device(name='cxi_dg1_slits')

Is this a happi issue, an issue with our convention, or my lack of understanding?

cc @ZLLentz @ZryletTC

List of Devices that can't load

Output related to an upcoming happi PR:

Entry for cxi_dg1_slits is malformed. Skipping.
Entry for cxi_dg1_pim is malformed. Skipping.
Entry for cxi_dg1_vgc_01 is malformed. Skipping.
Entry for cxi_dg1_vgc_02 is malformed. Skipping.
Entry for cxi_dg2_ipm is malformed. Skipping.
Entry for cxi_dg2_jaws is malformed. Skipping.
Entry for cxi_dg2_pim is malformed. Skipping.
Entry for cxi_dg2_vgc_01 is malformed. Skipping.
Entry for cxi_dg2_vgc_02 is malformed. Skipping.
Entry for cxi_dg3_ipm is malformed. Skipping.
Entry for cxi_ds1_pulsepicker is malformed. Skipping.
Entry for cxi_dsb_attenuator is malformed. Skipping.
Entry for cxi_dsb_jaws is malformed. Skipping.
Entry for cxi_dsc_vgc_01 is malformed. Skipping.
Entry for cxi_kb1_jaws_ds is malformed. Skipping.
Entry for cxi_kb1_slits_us is malformed. Skipping.
Entry for cxi_kb1_vgc_01 is malformed. Skipping.
Entry for cxi_kb1_vgc_02 is malformed. Skipping.
Entry for cxi_kb2_vgc_01 is malformed. Skipping.
Entry for cxi_sc1_vgc_01 is malformed. Skipping.
Entry for cxi_sc1_vgc_02 is malformed. Skipping.
Entry for cxi_sc3_vgc_01 is malformed. Skipping.
Entry for fee_m1h is malformed. Skipping.
Entry for fee_m2h is malformed. Skipping.
Entry for cxi_snd_valve is malformed. Skipping.
Entry for hxd_dg2_ipm is malformed. Skipping.
Entry for hxd_dg2_slits is malformed. Skipping.
Entry for hxd_dg2_stopper is malformed. Skipping.
Entry for hxd_dg2_valve is malformed. Skipping.
Entry for xrt_dg3m_ipm is malformed. Skipping.
Entry for xrt_dg3m_slits is malformed. Skipping.
Entry for xrt_dg3m_pim is malformed. Skipping.
Entry for cxi_dia_valve is malformed. Skipping.
Entry for xrt_dvd_valve is malformed. Skipping.
Entry for hfx_mon_valve_1 is malformed. Skipping.
Entry for hfx_mon_valve_2 is malformed. Skipping.
Entry for hfx_mon_valve_3 is malformed. Skipping.
Entry for hx2_valve is malformed. Skipping.
Entry for hx2_reference_laser is malformed. Skipping.
Entry for hx2_ipm is malformed. Skipping.
Entry for hx2_slits is malformed. Skipping.
Entry for hx2_pim is malformed. Skipping.
Entry for uvd_valve is malformed. Skipping.
Entry for hxd_mon_valve_1 is malformed. Skipping.
Entry for hxd_mon_valve_2 is malformed. Skipping.
Entry for mxt_valve_1 is malformed. Skipping.
Entry for mxt_valve_2 is malformed. Skipping.
Entry for xrt_mxt_valve is malformed. Skipping.
Entry for mfx_mxt_valve is malformed. Skipping.
Entry for mec_mxt_valve is malformed. Skipping.
Entry for um6_ipm is malformed. Skipping.
Entry for um6_slits is malformed. Skipping.
Entry for um6_stopper is malformed. Skipping.
Entry for mec_attenuator is malformed. Skipping.
Entry for mec_bxl_valve is malformed. Skipping.
Entry for mec_pulsepicker is malformed. Skipping.
Entry for mec_hxm_valve is malformed. Skipping.
Entry for mec_ipm1 is malformed. Skipping.
Entry for mfx_attenuator is malformed. Skipping.
Entry for mfx_dg1_ipm is malformed. Skipping.
Entry for mfx_dg1_slits is malformed. Skipping.
Entry for mfx_dg1_pim is malformed. Skipping.
Entry for mfx_dg1_valve_1 is malformed. Skipping.
Entry for mfx_dg1_valve_2 is malformed. Skipping.
Entry for mfx_dg2_ipm is malformed. Skipping.
Entry for mfx_dg2_downstream_slits is malformed. Skipping.
Entry for mfx_dg2_midstream_slits is malformed. Skipping.
Entry for mfx_dg2_upstream_slits is malformed. Skipping.
Entry for mfx_dg2_pim is malformed. Skipping.
Entry for mfx_dia_ipm is malformed. Skipping.
Entry for mfx_pulsepicker is malformed. Skipping.
Entry for mfx_dia_pim is malformed. Skipping.
Entry for mfx_dia_valve_01 is malformed. Skipping.
Entry for mfx_dia_valve_02 is malformed. Skipping.
Entry for mfx_dvd_valve is malformed. Skipping.
Entry for xcs_attenuator is malformed. Skipping.
Entry for xcs_dg3_ipm is malformed. Skipping.
Entry for xcs_dg3_slits is malformed. Skipping.
Entry for xcs_dg3_valve_2 is malformed. Skipping.
Entry for xcs_lam_valve_1 is malformed. Skipping.
Entry for xcs_lam_valve_2 is malformed. Skipping.
Entry for xcs_lodcm is malformed. Skipping.
Entry for xcs_mon_ipm is malformed. Skipping.
Entry for hfx_mon_valve_4 is malformed. Skipping.
Entry for xcs_pbt_valve_1 is malformed. Skipping.
Entry for xcs_pbt_valve_2 is malformed. Skipping.
Entry for xcs_pbt_valve_3 is malformed. Skipping.
Entry for xcs_pbt_valve_4 is malformed. Skipping.
Entry for xcs_reference_laser is malformed. Skipping.
Entry for xcs_sb1_ipm is malformed. Skipping.
Entry for xcs_sb1_slits is malformed. Skipping.
Entry for xcs_sb1_stopper is malformed. Skipping.
Entry for xcs_sb1_valve is malformed. Skipping.
Entry for xcs_sb2_downstream_slits is malformed. Skipping.
Entry for xcs_sb2_ipm is malformed. Skipping.
Entry for xcs_pulsepicker is malformed. Skipping.
Entry for xcs_sb2_upstream_slits is malformed. Skipping.
Entry for xcs_sb2_vgc_01 is malformed. Skipping.
Entry for xpp_attenuator is malformed. Skipping.
Entry for xpp_lodcm is malformed. Skipping.
Entry for xpp_sb2_ipm is malformed. Skipping.
Entry for xpp_pulsepicker is malformed. Skipping.
Entry for xpp_sb2_valve is malformed. Skipping.
Entry for xpp_sb2_high_slits is malformed. Skipping.
Entry for xpp_sb2_low_slits is malformed. Skipping.
Entry for xpp_sb3_ipm is malformed. Skipping.
Entry for xpp_sb3_slits is malformed. Skipping.
Entry for cxi_xrt_attenuator is malformed. Skipping.
Entry for cxi_pulsepicker is malformed. Skipping.
Entry for xrt_m1h is malformed. Skipping.
Entry for xrt_m2h is malformed. Skipping.
Entry for xrt_m3h is malformed. Skipping.
Entry for mr1k2_switch is malformed. Skipping.
Entry for mr1k4_soms is malformed. Skipping.
Entry for mr1l0_homs is malformed. Skipping.
Entry for mr2l0_homs is malformed. Skipping.

mfx_dia_pim may require fixes / changes

Per Silke:

The MFX:DIA is a very, very long standing fix-it task.....supposedly we could give it another try now that we have an upgraded, working RHEL7 host, but I'm not exited about reviving a PULNIX. (-> For the MFX one, I can check with Vincent about trying to revive the pulnix: if we don't do this soon, we might as well remove the whole device....)

xpp_sb3_pim: bad device configuration, camera-optional PIM?

Per Silke:

XPP:SB3 sort of exists, but we typically run this camera in the DAQ. I believe we will be upgrading it to one of the new USB3 Allied cameras in the future for which no IOC eixsts now. (-> XPP:SB3 (xpp's yag2) is more complicated: we want this device as we regularly use it, but we don't use the camera piece. I don't know if we should make a camera-optional PIM object?)

ENH: use happi audit for auto-generated PRs

We now have an happi audit, which we could integrate with the diff tool (#45)

Perhaps running happi audit only on the changed / added devices is enough?

Ignoring the connection test seems prudent, since devices can go up and down. An instantiation check might be sufficient here (along with all the metadata checks)

I can add a full happi audit cron job as well, somewhat

Consider using diff tool in CI

Diff tool from #36 could compare individual commits or entire PRs

Should we add this to the CI pipeline somehow so we don't have to manually execute it?

Update cron job

  • @ZryletTC is on his way to bigger and better things
  • Let's move his cron job to one of our accounts (perhaps using that GitHub "pcds user" that we had a while ago for commits?)

comp_motor happi item name is too generic

If I'm allowed to be pedantic in these reviews, this is a rough name for a motor- high chance for cross-hutch name collisions. I'm not worried though since we can rename things later with low impact.

Originally posted by @ZLLentz in #41 (comment)

  • Who made this device and what would be an appropriate name?
  • What are some steps we can take in general for such QA issues going forward?
  • Should we be tracking the username in happi? (probably yes)

Devices with potentially bad PV references

CRIX:CRYO:MMS:RY ['crix_cryo_ry']
CRIX:CRYO:MMS:RY:PLC:bHomeCmd ['crix_cryo_ry']
CRIX:CRYO:MMS:RY:PLC:bHomeCmd_RBV ['crix_cryo_ry']
CRIX:CRYO:MMS:RY:PLC:bReset ['crix_cryo_ry']
CRIX:CRYO:MMS:RY:PLC:bReset_RBV ['crix_cryo_ry']
CRIX:CRYO:MMS:RY:PLC:fHomePosition ['crix_cryo_ry']
CRIX:CRYO:MMS:RY:PLC:fHomePosition_RBV ['crix_cryo_ry']
CRIX:CRYO:MMS:RY:PLC:nErrorId_RBV ['crix_cryo_ry']
CRIX:CRYO:MMS:RY:PLC:sErrorMessage_RBV ['crix_cryo_ry']
CRIX:CRYO:MMS:X ['crix_cryo_x']
CRIX:CRYO:MMS:X:PLC:bHomeCmd ['crix_cryo_x']
CRIX:CRYO:MMS:X:PLC:bHomeCmd_RBV ['crix_cryo_x']
CRIX:CRYO:MMS:X:PLC:bReset ['crix_cryo_x']
CRIX:CRYO:MMS:X:PLC:bReset_RBV ['crix_cryo_x']
CRIX:CRYO:MMS:X:PLC:fHomePosition ['crix_cryo_x']
CRIX:CRYO:MMS:X:PLC:fHomePosition_RBV ['crix_cryo_x']
CRIX:CRYO:MMS:X:PLC:nErrorId_RBV ['crix_cryo_x']
CRIX:CRYO:MMS:X:PLC:sErrorMessage_RBV ['crix_cryo_x']
CRIX:CRYO:MMS:Y ['crix_cryo_y']
CRIX:CRYO:MMS:Y:PLC:bHomeCmd ['crix_cryo_y']
CRIX:CRYO:MMS:Y:PLC:bHomeCmd_RBV ['crix_cryo_y']
CRIX:CRYO:MMS:Y:PLC:bReset ['crix_cryo_y']
CRIX:CRYO:MMS:Y:PLC:bReset_RBV ['crix_cryo_y']
CRIX:CRYO:MMS:Y:PLC:fHomePosition ['crix_cryo_y']
CRIX:CRYO:MMS:Y:PLC:fHomePosition_RBV ['crix_cryo_y']
CRIX:CRYO:MMS:Y:PLC:nErrorId_RBV ['crix_cryo_y']
CRIX:CRYO:MMS:Y:PLC:sErrorMessage_RBV ['crix_cryo_y']
CRIX:CRYO:MMS:Z ['crix_cryo_z']
CRIX:CRYO:MMS:Z:PLC:bHomeCmd ['crix_cryo_z']
CRIX:CRYO:MMS:Z:PLC:bHomeCmd_RBV ['crix_cryo_z']
CRIX:CRYO:MMS:Z:PLC:bReset ['crix_cryo_z']
CRIX:CRYO:MMS:Z:PLC:bReset_RBV ['crix_cryo_z']
CRIX:CRYO:MMS:Z:PLC:fHomePosition ['crix_cryo_z']
CRIX:CRYO:MMS:Z:PLC:fHomePosition_RBV ['crix_cryo_z']
CRIX:CRYO:MMS:Z:PLC:nErrorId_RBV ['crix_cryo_z']
CRIX:CRYO:MMS:Z:PLC:sErrorMessage_RBV ['crix_cryo_z']
CRIX:DPL:MMS:X ['crix_dpl_x']
CRIX:DPL:MMS:X:PLC:bHomeCmd ['crix_dpl_x']
CRIX:DPL:MMS:X:PLC:bHomeCmd_RBV ['crix_dpl_x']
CRIX:DPL:MMS:X:PLC:bReset ['crix_dpl_x']
CRIX:DPL:MMS:X:PLC:bReset_RBV ['crix_dpl_x']
CRIX:DPL:MMS:X:PLC:fHomePosition ['crix_dpl_x']
CRIX:DPL:MMS:X:PLC:fHomePosition_RBV ['crix_dpl_x']
CRIX:DPL:MMS:X:PLC:nErrorId_RBV ['crix_dpl_x']
CRIX:DPL:MMS:X:PLC:sErrorMessage_RBV ['crix_dpl_x']
CRIX:DPL:MMS:Y ['crix_dpl_y']
CRIX:DPL:MMS:Y:PLC:bHomeCmd ['crix_dpl_y']
CRIX:DPL:MMS:Y:PLC:bHomeCmd_RBV ['crix_dpl_y']
CRIX:DPL:MMS:Y:PLC:bReset ['crix_dpl_y']
CRIX:DPL:MMS:Y:PLC:bReset_RBV ['crix_dpl_y']
CRIX:DPL:MMS:Y:PLC:fHomePosition ['crix_dpl_y']
CRIX:DPL:MMS:Y:PLC:fHomePosition_RBV ['crix_dpl_y']
CRIX:DPL:MMS:Y:PLC:nErrorId_RBV ['crix_dpl_y']
CRIX:DPL:MMS:Y:PLC:sErrorMessage_RBV ['crix_dpl_y']
CRIX:DPL:MMS:Z ['crix_dpl_z']
CRIX:DPL:MMS:Z:PLC:bHomeCmd ['crix_dpl_z']
CRIX:DPL:MMS:Z:PLC:bHomeCmd_RBV ['crix_dpl_z']
CRIX:DPL:MMS:Z:PLC:bReset ['crix_dpl_z']
CRIX:DPL:MMS:Z:PLC:bReset_RBV ['crix_dpl_z']
CRIX:DPL:MMS:Z:PLC:fHomePosition ['crix_dpl_z']
CRIX:DPL:MMS:Z:PLC:fHomePosition_RBV ['crix_dpl_z']
CRIX:DPL:MMS:Z:PLC:nErrorId_RBV ['crix_dpl_z']
CRIX:DPL:MMS:Z:PLC:sErrorMessage_RBV ['crix_dpl_z']
CRIX:PDET:MMS:THETA ['crix_apd_theta']
CRIX:PDET:MMS:THETA:PLC:bHomeCmd ['crix_apd_theta']
CRIX:PDET:MMS:THETA:PLC:bHomeCmd_RBV ['crix_apd_theta']
CRIX:PDET:MMS:THETA:PLC:bReset ['crix_apd_theta']
CRIX:PDET:MMS:THETA:PLC:bReset_RBV ['crix_apd_theta']
CRIX:PDET:MMS:THETA:PLC:fHomePosition ['crix_apd_theta']
CRIX:PDET:MMS:THETA:PLC:fHomePosition_RBV ['crix_apd_theta']
CRIX:PDET:MMS:THETA:PLC:nErrorId_RBV ['crix_apd_theta']
CRIX:PDET:MMS:THETA:PLC:sErrorMessage_RBV ['crix_apd_theta']
CRIX:PDET:MMS:Y ['crix_apd_y']
CRIX:PDET:MMS:Y:PLC:bHomeCmd ['crix_apd_y']
CRIX:PDET:MMS:Y:PLC:bHomeCmd_RBV ['crix_apd_y']
CRIX:PDET:MMS:Y:PLC:bReset ['crix_apd_y']
CRIX:PDET:MMS:Y:PLC:bReset_RBV ['crix_apd_y']
CRIX:PDET:MMS:Y:PLC:fHomePosition ['crix_apd_y']
CRIX:PDET:MMS:Y:PLC:fHomePosition_RBV ['crix_apd_y']
CRIX:PDET:MMS:Y:PLC:nErrorId_RBV ['crix_apd_y']
CRIX:PDET:MMS:Y:PLC:sErrorMessage_RBV ['crix_apd_y']
CXI:DG1:P6740:HDF51:FileNumber_Sync ['cxi_dg1_pim']
CXI:DG1:P6740:HDF51:FileNumber_write ['cxi_dg1_pim']
CXI:DG2:GIGE:HDF51:FileNumber_Sync ['cxi_dg2_pim']
CXI:DG2:GIGE:HDF51:FileNumber_write ['cxi_dg2_pim']
CXI:DG2:XFLS ['cxi_dg2_xfls']
CXI:DG2:XFLS:GO ['cxi_dg2_xfls']
CXI:DG2:XFLS:MOTOR ['cxi_dg2_xfls']
CXI:DG2:XFLS:MOTOR:SEQ_SELN ['cxi_dg2_xfls']
CXI:DG3:P6740:HDF51:FileNumber_Sync ['xcs_dg3_pim']
CXI:DG3:P6740:HDF51:FileNumber_write ['xcs_dg3_pim']
CXI:DG3:PIM:MOTOR ['cxi_dg3_pim']
CXI:DG3:PIM:MOTOR:SEQ_SELN ['cxi_dg3_pim']
CXI:DS1:XFLS:MOTOR ['cxi_ds1_xfls']
CXI:DS1:XFLS:MOTOR:SEQ_SELN ['cxi_ds1_xfls']
GANTRY:FEE1:M1H:Y:DECOUPLE ['fee_m1h']
GANTRY:FEE1:M1H:Y:GDIF ['fee_m1h']
GANTRY:FEE1:M2H:Y:DECOUPLE ['fee_m2h']
GANTRY:FEE1:M2H:Y:GDIF ['fee_m2h']
HFX:DG3:IPM:DIODE ['xrt_dg3m_ipm']
HFX:DG3:IPM:DIODE:GO ['xrt_dg3m_ipm']
HFX:DG3:IPM:DIODE:MOTOR ['xrt_dg3m_ipm']
HFX:DG3:IPM:DIODE:MOTOR:SEQ_SELN ['xrt_dg3m_ipm']
HFX:DG3:IPM:DIODE:X_MOTOR ['xrt_dg3m_ipm']
HFX:DG3:IPM:DIODE:X_MOTOR:SEQ_SELN ['xrt_dg3m_ipm']
HFX:DG3:IPM:TARGET ['xrt_dg3m_ipm']
HFX:DG3:IPM:TARGET:GO ['xrt_dg3m_ipm']
HFX:DG3:IPM:TARGET:MOTOR ['xrt_dg3m_ipm']
HFX:DG3:IPM:TARGET:MOTOR:SEQ_SELN ['xrt_dg3m_ipm']
HFX:DG3:IPM:TARGET:TARGET1 ['xrt_dg3m_ipm']
HFX:DG3:IPM:TARGET:TARGET2 ['xrt_dg3m_ipm']
HFX:DG3:IPM:TARGET:TARGET3 ['xrt_dg3m_ipm']
HFX:DG3:IPM:TARGET:TARGET4 ['xrt_dg3m_ipm']
HXX:VON_HAMOS:MMS:01:PLC:bHomeCmd ['hxx_von_hamos_y']
HXX:VON_HAMOS:MMS:01:PLC:bHomeCmd_RBV ['hxx_von_hamos_y']
LM1K4:ATM_MP1_WP1_LM1:M2:STOP ['lm1k4_atm_mp1_wp1_lm1']
LM1K4:ATM_MP1_WP1_LM1:PORT0:CMD ['lm1k4_atm_mp1_wp1_lm1']
LM1K4:ATM_MP1_WP1_LM1:PORT0:FROM_ADDR ['lm1k4_atm_mp1_wp1_lm1']
LM1K4:ATM_MP1_WP1_LM1:PORT0:RESPONSE ['lm1k4_atm_mp1_wp1_lm1']
LM1K4:ATM_MP1_WP1_LM1:PORT0:SAVE ['lm1k4_atm_mp1_wp1_lm1']
LM1K4:ATM_MP1_WP1_LM1:PORT0:TO_ADDR ['lm1k4_atm_mp1_wp1_lm1']
LM1K4:ATM_MP1_WP1_RM1:M3:STOP ['lm1k4_atm_mp1_wp1_rm1']
LM1K4:ATM_MP1_WP1_RM1:PORT0:CMD ['lm1k4_atm_mp1_wp1_rm1']
LM1K4:ATM_MP1_WP1_RM1:PORT0:FROM_ADDR ['lm1k4_atm_mp1_wp1_rm1']
LM1K4:ATM_MP1_WP1_RM1:PORT0:RESPONSE ['lm1k4_atm_mp1_wp1_rm1']
LM1K4:ATM_MP1_WP1_RM1:PORT0:SAVE ['lm1k4_atm_mp1_wp1_rm1']
LM1K4:ATM_MP1_WP1_RM1:PORT0:TO_ADDR ['lm1k4_atm_mp1_wp1_rm1']
LM1K4:ATM_MP2_POL2:M1:STOP ['lm1k4_atm_mp2_pol2']
LM1K4:ATM_MP2_POL2:PORT0:CMD ['lm1k4_atm_mp2_pol2']
LM1K4:ATM_MP2_POL2:PORT0:FROM_ADDR ['lm1k4_atm_mp2_pol2']
LM1K4:ATM_MP2_POL2:PORT0:RESPONSE ['lm1k4_atm_mp2_pol2']
LM1K4:ATM_MP2_POL2:PORT0:SAVE ['lm1k4_atm_mp2_pol2']
LM1K4:ATM_MP2_POL2:PORT0:TO_ADDR ['lm1k4_atm_mp2_pol2']
LM1K4:COM_DP2_TF1_SL1:ELL:PORT0:CMD ['lm1k4_com_dp2_tf1_sl1']
LM1K4:COM_DP2_TF1_SL1:ELL:PORT0:FROM_ADDR ['lm1k4_com_dp2_tf1_sl1']
LM1K4:COM_DP2_TF1_SL1:ELL:PORT0:RESPONSE ['lm1k4_com_dp2_tf1_sl1']
LM1K4:COM_DP2_TF1_SL1:ELL:PORT0:SAVE ['lm1k4_com_dp2_tf1_sl1']
LM1K4:COM_DP2_TF1_SL1:ELL:PORT0:TO_ADDR ['lm1k4_com_dp2_tf1_sl1']
LM1K4:COM_DP2_XTL1:ELL:M2:STOP ['lm1k4_com_dp2_xtl1']
LM1K4:EJX_DP32_TF1_SL1:ELL:PORT0:CMD ['lm1k4_ejx_dp32']
LM1K4:EJX_DP32_TF1_SL1:ELL:PORT0:FROM_ADDR ['lm1k4_ejx_dp32']
LM1K4:EJX_DP32_TF1_SL1:ELL:PORT0:RESPONSE ['lm1k4_ejx_dp32']
LM1K4:EJX_DP32_TF1_SL1:ELL:PORT0:SAVE ['lm1k4_ejx_dp32']
LM1K4:EJX_DP32_TF1_SL1:ELL:PORT0:TO_ADDR ['lm1k4_ejx_dp32']
LM1K4:HRM_DP1_TF1_SL1:ELL:PORT0:CMD ['lm1k4_hrm_dp1_tf1_sl1']
LM1K4:HRM_DP1_TF1_SL1:ELL:PORT0:FROM_ADDR ['lm1k4_hrm_dp1_tf1_sl1']
LM1K4:HRM_DP1_TF1_SL1:ELL:PORT0:RESPONSE ['lm1k4_hrm_dp1_tf1_sl1']
LM1K4:HRM_DP1_TF1_SL1:ELL:PORT0:SAVE ['lm1k4_hrm_dp1_tf1_sl1']
LM1K4:HRM_DP1_TF1_SL1:ELL:PORT0:TO_ADDR ['lm1k4_hrm_dp1_tf1_sl1']
LM1K4:INJ_DP2_TF1_WF1Acquire ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1AcquirePeriod ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1AcquirePeriod_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1AcquireTime ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1AcquireTime_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1BeamCentroidX_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1BeamCentroidY_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1BeamDiameterX_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1BeamDiameterY_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1CamEventCode ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1CamEventCode_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1CamRepRate_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1DataType ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1DataType_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1DetectorState_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1FourierJ0_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1FourierJ45_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1FourierM_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1Gain ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1Gain_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1ImageMode ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1ImageMode_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1Manufacturer_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1MaxSizeX_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1MaxSizeY_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1Model_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1NumExposures ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1NumImages ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1NumImagesCounter_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1NumImages_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1PupilCentroidX ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1PupilCentroidX_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1PupilCentroidY ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1PupilCentroidY_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1PupilDiameterX ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1PupilDiameterX_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1PupilDiameterY ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1PupilDiameterY_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1RadiusOfCurvature_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatCameraReady ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatHighAmbientLight ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatLowSpotContrast ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatNotEnoughSpots ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatPowerHigh ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatPowerLow ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatPupilDefined ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatTooMuchSpots ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1StatTriggerWait ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1TriggerMode ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1TriggerMode_RBV ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1UseBeamCentroid ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1UseBeamDiameter ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1UseCircularPupil ['lm1k4_inj_dp2_tf1_wf1']
LM1K4:INJ_DP2_TF1_WF1Wavefront_RBV ['lm1k4_inj_dp2_tf1_wf1']
MEC:HXM:CLF:01 ['mec_yag1']
MEC:HXM:CLF:01:SEQ_SELN ['mec_yag1']
MEC:IPM1:DIODE ['mec_ipm1']
MEC:IPM1:DIODE:GO ['mec_ipm1']
MEC:IPM1:DIODE:MOTOR ['mec_ipm1']
MEC:IPM1:DIODE:MOTOR:SEQ_SELN ['mec_ipm1']
MEC:IPM1:DIODE:X_MOTOR ['mec_ipm1']
MEC:IPM1:DIODE:X_MOTOR:SEQ_SELN ['mec_ipm1']
MEC:IPM1:TARGET ['mec_ipm1']
MEC:IPM1:TARGET:GO ['mec_ipm1']
MEC:IPM1:TARGET:MOTOR ['mec_ipm1']
MEC:IPM1:TARGET:MOTOR:SEQ_SELN ['mec_ipm1']
MEC:IPM1:TARGET:TARGET1 ['mec_ipm1']
MEC:IPM1:TARGET:TARGET2 ['mec_ipm1']
MEC:IPM1:TARGET:TARGET3 ['mec_ipm1']
MEC:IPM1:TARGET:TARGET4 ['mec_ipm1']
MEC:PIM1 ['mec_pim1']
MEC:PIM1:CLZ:01 ['mec_pim1']
MEC:PIM1:CLZ:01:SEQ_SELN ['mec_pim1']
MEC:PIM1:GO ['mec_pim1']
MEC:PIM1:MOTOR ['mec_pim1']
MEC:PIM1:MOTOR:SEQ_SELN ['mec_pim1']
MEC:PIM2:CLF:01 ['mec_yag2']
MEC:PIM2:CLF:01:SEQ_SELN ['mec_yag2']
MEC:PIM2:CLZ:01 ['mec_yag2']
MEC:PIM2:CLZ:01:SEQ_SELN ['mec_yag2']
MEC:PIM3:CLF:01 ['mec_yag3']
MEC:PIM3:CLF:01:SEQ_SELN ['mec_yag3']
MEC:PIM3:CLZ:01 ['mec_yag3']
MEC:PIM3:CLZ:01:SEQ_SELN ['mec_yag3']
MFX:DG1:P6740:HDF51:FileNumber_Sync ['mfx_dg1_pim']
MFX:DG1:P6740:HDF51:FileNumber_write ['mfx_dg1_pim']
MFX:DG2:P6740:HDF51:FileNumber_Sync ['mfx_dg2_pim']
MFX:DG2:P6740:HDF51:FileNumber_write ['mfx_dg2_pim']
MIRR:FEE1:M1H:DMOV ['fee_m1h']
MIRR:FEE1:M1H:ENABLED ['fee_m1h']
MIRR:FEE1:M1H:HLS ['fee_m1h']
MIRR:FEE1:M1H:INTERLOCK ['fee_m1h']
MIRR:FEE1:M1H:LLS ['fee_m1h']
MIRR:FEE1:M1H:RBV ['fee_m1h']
MIRR:FEE1:M1H:VAL ['fee_m1h']
MIRR:FEE1:M2H:DMOV ['fee_m2h']
MIRR:FEE1:M2H:ENABLED ['fee_m2h']
MIRR:FEE1:M2H:HLS ['fee_m2h']
MIRR:FEE1:M2H:INTERLOCK ['fee_m2h']
MIRR:FEE1:M2H:LLS ['fee_m2h']
MIRR:FEE1:M2H:RBV ['fee_m2h']
MIRR:FEE1:M2H:VAL ['fee_m2h']
PA1L0:VFS:01:ALM_RST ['pa1l0_vfs_01']
PA1L0:VFS:01:ALM_RST_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:CLS_DI_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:CLS_SW ['pa1l0_vfs_01']
PA1L0:VFS:01:CLS_SW_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:FORCE_OPN ['pa1l0_vfs_01']
PA1L0:VFS:01:FORCE_OPN_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:GFS_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:MPS_FAULT_OK_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:OPN_DI_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:OPN_SW ['pa1l0_vfs_01']
PA1L0:VFS:01:OPN_SW_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:OVRD_ON ['pa1l0_vfs_01']
PA1L0:VFS:01:OVRD_ON_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:POS_STATE_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:STATE_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:TRIG_RBV ['pa1l0_vfs_01']
PA1L0:VFS:01:VAC_FAULT_OK_RBV ['pa1l0_vfs_01']
PIEZO:FEE1:M1H:STOP ['fee_m1h']
PIEZO:FEE1:M1H:VRBV ['fee_m1h']
PIEZO:FEE1:M2H:STOP ['fee_m2h']
PIEZO:FEE1:M2H:VRBV ['fee_m2h']
PPS:FEH1:45:S45STPRSUM ['sh45']
PPS:FEH1:4:S4STPRSUM ['sh4']
PPS:FEH1:5:S5STPRSUM ['sh5']
PPS:FEH1:6:S6STPRSUM ['sh6']
PPS:NEH1:1:SH1INSUM ['sh1']
PPS:NEH1:1:ST1L0INSUM ['st1l0_pps']
PPS:NEH1:1:ST3K4INSUM ['st3k4_pps']
PPS:NEH1:1:ST3K4OUTSUM ['st3k4_pps']
SATT:FEE1:320:EACT ['at1l0']
SATT:FEE1:320:EDES ['at1l0']
SATT:FEE1:320:ETOA ['at1l0']
SATT:FEE1:320:GO ['at1l0']
SATT:FEE1:320:RACT ['at1l0']
SATT:FEE1:320:RDES ['at1l0']
SATT:FEE1:320:R_CEIL ['at1l0']
SATT:FEE1:320:R_FLOOR ['at1l0']
SATT:FEE1:321:CMD ['at1l0']
SATT:FEE1:321:STATE ['at1l0']
SATT:FEE1:322:CMD ['at1l0']
SATT:FEE1:322:STATE ['at1l0']
SATT:FEE1:323:CMD ['at1l0']
SATT:FEE1:323:STATE ['at1l0']
SATT:FEE1:324:CMD ['at1l0']
SATT:FEE1:324:STATE ['at1l0']
SATT:FEE1:325:CMD ['at1l0']
SATT:FEE1:325:STATE ['at1l0']
SATT:FEE1:326:CMD ['at1l0']
SATT:FEE1:326:STATE ['at1l0']
SATT:FEE1:327:CMD ['at1l0']
SATT:FEE1:327:STATE ['at1l0']
SATT:FEE1:328:CMD ['at1l0']
SATT:FEE1:328:STATE ['at1l0']
SATT:FEE1:329:CMD ['at1l0']
SATT:FEE1:329:STATE ['at1l0']
STEP:FEE1:611:MOTR:DECOUPLE ['fee_m1h']
STEP:FEE1:611:MOTR:GDIF ['fee_m1h']
STEP:FEE1:861:MOTR:DECOUPLE ['fee_m2h']
STEP:FEE1:861:MOTR:GDIF ['fee_m2h']
STEP:M1H:X:P:DMOV ['fee_m1h']
STEP:M1H:X:P:ENABLED ['fee_m1h']
STEP:M1H:X:P:HLS ['fee_m1h']
STEP:M1H:X:P:INTERLOCK ['fee_m1h']
STEP:M1H:X:P:LLS ['fee_m1h']
STEP:M1H:X:P:RBV ['fee_m1h']
STEP:M1H:X:P:VAL ['fee_m1h']
STEP:M1H:X:S:HLS ['fee_m1h']
STEP:M1H:X:S:LLS ['fee_m1h']
STEP:M1H:X:S:RBV ['fee_m1h']
STEP:M1H:Y:P:DMOV ['fee_m1h']
STEP:M1H:Y:P:ENABLED ['fee_m1h']
STEP:M1H:Y:P:HLS ['fee_m1h']
STEP:M1H:Y:P:INTERLOCK ['fee_m1h']
STEP:M1H:Y:P:LLS ['fee_m1h']
STEP:M1H:Y:P:RBV ['fee_m1h']
STEP:M1H:Y:P:VAL ['fee_m1h']
STEP:M1H:Y:S:HLS ['fee_m1h']
STEP:M1H:Y:S:LLS ['fee_m1h']
STEP:M1H:Y:S:RBV ['fee_m1h']
STEP:M2H:X:P:DMOV ['fee_m2h']
STEP:M2H:X:P:ENABLED ['fee_m2h']
STEP:M2H:X:P:HLS ['fee_m2h']
STEP:M2H:X:P:INTERLOCK ['fee_m2h']
STEP:M2H:X:P:LLS ['fee_m2h']
STEP:M2H:X:P:RBV ['fee_m2h']
STEP:M2H:X:P:VAL ['fee_m2h']
STEP:M2H:X:S:HLS ['fee_m2h']
STEP:M2H:X:S:LLS ['fee_m2h']
STEP:M2H:X:S:RBV ['fee_m2h']
STEP:M2H:Y:P:DMOV ['fee_m2h']
STEP:M2H:Y:P:ENABLED ['fee_m2h']
STEP:M2H:Y:P:HLS ['fee_m2h']
STEP:M2H:Y:P:INTERLOCK ['fee_m2h']
STEP:M2H:Y:P:LLS ['fee_m2h']
STEP:M2H:Y:P:RBV ['fee_m2h']
STEP:M2H:Y:P:VAL ['fee_m2h']
STEP:M2H:Y:S:HLS ['fee_m2h']
STEP:M2H:Y:S:LLS ['fee_m2h']
STEP:M2H:Y:S:RBV ['fee_m2h']
STPR:NEH1:2200:ST1K2IN ['st1k2_pps']
STPR:NEH1:2200:ST1K2OUT ['st1k2_pps']
STPR:XRT1:1:SH2_PPSSUM ['sh2']
XCS:GIGE:04:HDF51:FileNumber_Sync ['xcs_sb2_pim']
XCS:GIGE:04:HDF51:FileNumber_write ['xcs_sb2_pim']
XCS:LODCM:FOIL:MOTOR ['xcs_lodcm']
XCS:LODCM:FOIL:MOTOR:SEQ_SELN ['xcs_lodcm']
XCS:LODCM:H2N:OFF_C_SET ['xcs_lodcm']
XCS:LODCM:H2N:OFF_Si_SET ['xcs_lodcm']
XCS:REFLASER1:MIRROR ['xcs_reference_laser']
XCS:REFLASER1:MIRROR:GO ['xcs_reference_laser']
XCS:REFLASER1:MIRROR:MOTOR ['xcs_reference_laser']
XCS:REFLASER1:MIRROR:MOTOR:SEQ_SELN ['xcs_reference_laser']
XCS:XFLS ['xcs_xfls']
XCS:XFLS:GO ['xcs_xfls']
XCS:XFLS:MOTOR ['xcs_xfls']
XCS:XFLS:MOTOR:SEQ_SELN ['xcs_xfls']
XPP:LODCM:FOIL:MOTOR ['xpp_lodcm']
XPP:LODCM:FOIL:MOTOR:SEQ_SELN ['xpp_lodcm']
XPP:LODCM:H2N:OFF_C_SET ['xpp_lodcm']
XPP:LODCM:H2N:OFF_Si_SET ['xpp_lodcm']
XPP:MON:MPZ:08:POSITIONGET ['xpp_ccm']
XPP:MON:MPZ:08:POSITIONSET ['xpp_ccm']
XPP:MON:PIC:05 ['xpp_ccm']
XPP:MON:PIC:06 ['xpp_ccm']
XPP:SB2:VGC:01:CLS_DI ['xpp_sb2_valve']
XPP:SB2:VGC:01:OPN_DI ['xpp_sb2_valve']
XPP:SB2:VGC:01:OPN_OK ['xpp_sb2_valve']
XPP:SB2:VGC:01:OPN_SW ['xpp_sb2_valve']
XPP:SB2:XFLS:MOTOR ['xpp_xfls']
XPP:SB2:XFLS:MOTOR:SEQ_SELN ['xpp_xfls']
XRT:M2H:MOTOR ['xrt_m2h']
XRT:M2H:MOTOR:SEQ_SELN ['xrt_m2h']
{{ioc_alias}} ['lm2k2_com_dp2_tf1_pm1', 'lm2k2_com_dp3_tf1_pm1', 'lm2k2_inj_dp2_tf1_pm1']

Additionally, the following PIMs may still have detector prefix issues (picking a single PV from the list):

HX2:SB1:CVV:01IMAGE2:ArrayData ['hx2_pim']
MEC:PIM1:CVV:01:IMAGE2:ArrayData ['mec_pim1']
MEC:PIM2:CVV:01:IMAGE2:ArrayData ['mec_yag2']
MEC:PIM3:CVV:01:IMAGE2:ArrayData ['mec_yag3']
MFX:DIA:CVV:01:IMAGE2:ArrayData ['mfx_dia_pim']
XCS:PBT:CVV:01:IMAGE2:ArrayData ['xcs_pbt_pim']
XCS:SB1:CVV:01:IMAGE2:ArrayData ['xcs_sb1_pim']
XPP:SB3:CVV:01:IMAGE2:ArrayData ['xpp_sb3_pim']

various devices cannot be loaded, device cannot be found.

name class
cxi_leviton_r51_h pcdsdevices.fms.Leviton9
cxi_leviton_r51_l pcdsdevices.fms.Leviton17
cxi_leviton_r51_t pcdsdevices.fms.Leviton1
cxi_leviton_r52_h pcdsdevices.fms.Leviton10
cxi_leviton_r52_l pcdsdevices.fms.Leviton18
cxi_leviton_r52_t pcdsdevices.fms.Leviton2
cxi_leviton_r53_h pcdsdevices.fms.Leviton11
cxi_leviton_r53_l pcdsdevices.fms.Leviton19
cxi_leviton_r53_t pcdsdevices.fms.Leviton3
cxi_leviton_r54_h pcdsdevices.fms.Leviton12
cxi_leviton_r54_l pcdsdevices.fms.Leviton20
cxi_leviton_r54_t pcdsdevices.fms.Leviton4
cxi_leviton_r56_h pcdsdevices.fms.Leviton13
cxi_leviton_r56_l pcdsdevices.fms.Leviton21
cxi_leviton_r56_t pcdsdevices.fms.Leviton5
cxi_leviton_r57_h pcdsdevices.fms.Leviton14
cxi_leviton_r57_l pcdsdevices.fms.Leviton22
cxi_leviton_r57_t pcdsdevices.fms.Leviton6
cxi_leviton_r58_h pcdsdevices.fms.Leviton15
cxi_leviton_r58_l pcdsdevices.fms.Leviton23
cxi_leviton_r58_t pcdsdevices.fms.Leviton7
cxi_leviton_r59_h pcdsdevices.fms.Leviton16
cxi_leviton_r59_l pcdsdevices.fms.Leviton24
cxi_leviton_r59_t pcdsdevices.fms.Leviton8
feh_setra pcdsdevices.fms.Setra5000
homs_env pcdsdevices.rtds_homs.HomsEnvironment
mec_jj_1 pcdsdevices.slits.JJSlits
mec_jj_2 pcdsdevices.slits.JJSlits
mec_jj_3 pcdsdevices.slits.JJSlits
mec_jj_4 pcdsdevices.slits.JJSlits
mec_leviton_r60_t pcdsdevices.fms.Leviton53
mec_leviton_r62_t pcdsdevices.fms.Leviton51
mec_leviton_rpci_h pcdsdevices.fms.Leviton60
mec_leviton_rpci_t pcdsdevices.fms.Leviton49
mec_leviton_rs67c_t pcdsdevices.fms.Leviton50
mec_leviton_s60_t pcdsdevices.fms.Leviton52
mfx_leviton_r45_h pcdsdevices.fms.Leviton41
mfx_leviton_r45_p pcdsdevices.fms.Leviton45
mfx_leviton_r45_t pcdsdevices.fms.Leviton37
mfx_leviton_r46_h pcdsdevices.fms.Leviton42
mfx_leviton_r46_p pcdsdevices.fms.Leviton46
mfx_leviton_r46_t pcdsdevices.fms.Leviton38
mfx_leviton_r49_h pcdsdevices.fms.Leviton43
mfx_leviton_r49_p pcdsdevices.fms.Leviton47
mfx_leviton_r49_t pcdsdevices.fms.Leviton39
mfx_leviton_sampletbl_h pcdsdevices.fms.Leviton44
mfx_leviton_sampletbl_p pcdsdevices.fms.Leviton48
mfx_leviton_sampletbl_t pcdsdevices.fms.Leviton40
mfx_lib pcdsdevices.n_axis_device.get_n_axis_device
neh_setra pcdsdevices.fms.Setra5000
sq1_lamp pcdsdevices.sq1.Sq1
xcs_leviton_r40_h pcdsdevices.fms.Leviton29
xcs_leviton_r40_p pcdsdevices.fms.Leviton33
xcs_leviton_r40_t pcdsdevices.fms.Leviton25
xcs_leviton_r42_h pcdsdevices.fms.Leviton30
xcs_leviton_r42_p pcdsdevices.fms.Leviton34
xcs_leviton_r42_t pcdsdevices.fms.Leviton26
xcs_leviton_r43_h pcdsdevices.fms.Leviton31
xcs_leviton_r43_p pcdsdevices.fms.Leviton35
xcs_leviton_r43_t pcdsdevices.fms.Leviton27
xcs_leviton_r44_h pcdsdevices.fms.Leviton32
xcs_leviton_r44_p pcdsdevices.fms.Leviton36
xcs_leviton_r44_t pcdsdevices.fms.Leviton28
xpp_leviton_mon_t pcdsdevices.fms.Leviton82
xpp_leviton_r32_t pcdsdevices.fms.Leviton83

Update branch protection rules

  • deploy is our as-deployed, unreviewed, production configuration
  • master is our reviewed and approved reference

Rules:

  • master should be protected from accidental pushes
  • Force push should be disabled

`mfx_lj` / `mfx_von_hamos_6crystal` class names invalid?

[2023-08-08 14:28:45] - ERROR - Unable to load Happi entry: 'mfx_lj'
Traceback (most recent call last):
  File "/cds/home/k/klauer/Repos/typhos/typhos/cli.py", line 502, in create_devices
    device = happi_client.load_device(name=device_name)
  File "/cds/group/pcds/pyps/conda/py39/envs/pcds-5.7.3/lib/python3.9/site-packages/happi/client.py", line 369, in load_device
    return from_container(cntr, use_cache=use_cache)
  File "/cds/group/pcds/pyps/conda/py39/envs/pcds-5.7.3/lib/python3.9/site-packages/happi/loader.py", line 172, in from_container
    cls = import_class(item.device_class)
  File "/cds/group/pcds/pyps/conda/py39/envs/pcds-5.7.3/lib/python3.9/site-packages/happi/loader.py", line 243, in import_class
    mod = importlib.import_module(mod)
  File "/cds/group/pcds/pyps/conda/py39/envs/pcds-5.7.3/lib/python3.9/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'pcdsdevices.liquid_jet'
[2023-08-08 14:28:47] - ERROR - Unable to load Happi entry: 'mfx_von_hamos_6crystal'
Traceback (most recent call last):
  File "/cds/group/pcds/pyps/conda/py39/envs/pcds-5.7.3/lib/python3.9/site-packages/happi/loader.py", line 246, in import_class
    return getattr(mod, cls)
AttributeError: module 'pcdsdevices.spectrometer' has no attribute 'VonHamos6Crystal'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/cds/home/k/klauer/Repos/typhos/typhos/cli.py", line 502, in create_devices
    device = happi_client.load_device(name=device_name)
  File "/cds/group/pcds/pyps/conda/py39/envs/pcds-5.7.3/lib/python3.9/site-packages/happi/client.py", line 369, in load_device
    return from_container(cntr, use_cache=use_cache)
  File "/cds/group/pcds/pyps/conda/py39/envs/pcds-5.7.3/lib/python3.9/site-packages/happi/loader.py", line 172, in from_container
    cls = import_class(item.device_class)
  File "/cds/group/pcds/pyps/conda/py39/envs/pcds-5.7.3/lib/python3.9/site-packages/happi/loader.py", line 248, in import_class
    raise ImportError("Unable to import %s from %s" %
ImportError: Unable to import VonHamos6Crystal from pcdsdevices.spectrometer

Avoiding dev/prod conflicts of device definitions

Issue

Per @ZLLentz:

I wonder if there's any way to avoid this problem:

  1. A new class is added to pcdsdevices
  2. happi is updated to expect the new class
  3. All old code that referenced this device needs a pcdsdevices update or the load fails

It makes me wonder if we need to do versioning on these or have some other way to maintain backward compatibility in this sort of environment...

Originally posted by @ZLLentz in #41 (comment)

Possibilities

Our thoughts for avoiding this:

  1. Device-specific classes as in AT1K4 with helpful docstrings (@klauer)
  2. Factory methods for creating devices (@tangkong)

Branch `backup` missing?

README.md indicates the backup branch should exist. Is the cron job not running or is this outdated information?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.