What is FastCS?#

FastCS is a Python framework for building device drivers for scientific instruments. It separates the logic of communicating with a device from the control system used to expose it, so the same driver works with EPICS (CA or PVA), Tango, REST, and GraphQL without modification.


eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dWVfbyFx1MDAxMn7Pr+BwX+aeM/St3rvzRlhcdTAwMTJC2LeQmTlcdTAwMWMvMlxijGRsmSX35L/falx1MDAxOSxZi7FBXHTmXHUwMDA2T1x1MDAwZVx1MDAwM2pJbnXXV/VVdVXrv+/m5uaju443/35u3rtt1Np+s1u7mf/TXHUwMDFkv/a6PT9cZrCJxX/3wn63XHUwMDExn3lcdTAwMTZFnd77//yn1umQ5CrSXGIvXHUwMDA3V3pt79JcdTAwMGKiXHUwMDFlnvtcdTAwMTf+PTf33/gntvhNd73x9X7L+2D5/k7TO/5Cd6LV1kF8aXzSQ4fafuAlR29dR5iRxDIqwVrOjZJm2HyHzVx1MDAwYkZzXHUwMDAyUlEqpdSGXHUwMDBiPWy+8ZvRXHUwMDE5nlx1MDAwMsMjZ55/elx1MDAxNuEhIzVcdTAwMDGgVmpccoJaNTyjXHUwMDE2nLa9kWt6UTe88JbCdth1XHUwMDFk/Fx1MDAxN/Xcf0lcdTAwMWbrtcbFaTfsXHUwMDA3zeScmmyaVis5p+W323vRXXxnXHUwMDFjU1x1MDAxY7v5zP2P7vtKM8eHVzVrvTMvdVx1MDAxOX7j6Vng9XojXHUwMDE3hZ1aw4/cuMjkXHRcXO86a814av5J+tStXXprbm6Cfrs9POxcdTAwMDdNz1xy+3zt08iXXHUwMDA1zfsvXHUwMDFiObvnee5cdTAwMGVUU2OZNMl3JoJEgbPs4c0wiKWK4eBcdTAwMWKwxiRz6veWUZSi+LatWrvnJVx1MDAwM+06sZJcdTAwMTKz5Fn6nWYtuu+J5oJxrTWD5KYoVVx1MDAxN9mut8PGRcG3dEI/LcXuk/w2l8hF/Mfw93/+fPzsrMwlXHUwMDE3v8vcZL5d60VL4eWlXHUwMDFm4VNtu1x1MDAxZeVcdTAwMDY+qnWjXHUwMDBmOFl+cJpt84JmSUt81WK3XHUwMDFi3px5tdzU43WlbZ2wfXdcdTAwMWHPZzxcXPHhXHUwMDFmf1x1MDAxNlx1MDAwMZ1Dw/vy6eoo2N/RXHUwMDFmm5+vb8/s8n5cdTAwMWXokXdcdTAwMWJlgG60IYZaoY1kmiueoHJcdTAwMDB0XHUwMDA2XHUwMDA051ZbjSpBXHUwMDE4kzQ/XHUwMDAwnSpFlNSSXHUwMDFirVx1MDAwNM+jXlx0Yoy1eFxu11xuT0lcdTAwMDRkXHUwMDAy2FtNXHUwMDFibCzso24t6HVqXZTPSqGfueox5FN4NvTPXHUwMDBmp8A+VdbifGhRXHUwMDAwfktzR1x1MDAxZrCP+kJzXHUwMDAwZSuGPlxuhrLyKdCPRVx1MDAxMlx1MDAxZr+F6Gv0UlNcdTAwMThcdTAwMDbRnv/ddVpSYimKXHUwMDAyk1x1MDAxNqhAmyNGzlqtXfrtWPuO3HSx7Z9cdTAwMDaxdfNaKdHAXHUwMDAxiXy0pMPmKOwkrVxyvF9ccq1hNz9RYdc/9YNae7+kw7V+XHUwMDE07nq9QZejbt9Lj4b36Vx1MDAwMVx1MDAwZZQwOVx1MDAwNshH9eXFj41cdTAwMWV0edO35nqpfrqyaydcdTAwMDEyqnRNmOCggHIm0lBcdTAwMWNcdTAwMDBcdTAwMTkkQamh+DFcXIqU4DxcdTAwMDCZWUlcdTAwMDQoRLK0kiZcdTAwMTKSIJlcdTAwMTGpXHUwMDE5xX/4XHUwMDA1IGTyXHKPI5m1rCfEb4Lki2mAzK3kgmuTltB7IGtts0dcdTAwMWaAjPiXSoI2yTxWZMSFRUPwfCQvoNR43WI8XHUwMDAzckf8NjTJ0jKuzMhJL1xu52yvq1x1MDAwMfVm/UPrcFx1MDAwNc4vXHUwMDFhsNP77onVztnJ9UTWXHUwMDE5tVx1MDAxZGFMgbHUXHUwMDFhYDqZmFx1MDAxONQoXHUwMDAxRHCmOGOa4oAmnG9onaklnFpcdTAwMGVcdTAwMDbVvuaSXHUwMDE2WGjBXGIwo1x1MDAxY/YpXHUwMDE3aKvfLHQxrm+nwLXEcWSUyVwiXFxzW45rSplVoHWFuFZcdTAwMWF1XHUwMDA1emlMPstCrzp+vFeIaM6JYszi43JcctqmjMdcdTAwMGJcIjrb32qwvLtcdTAwMWOt6W77cHO1eVx1MDAwNSeLR6ec92FcIixLKoiiQktUsai4XHUwMDEzXHUwMDE5jaFMXHUwMDA1XHUwMDEwxangXHUwMDAzXHUwMDFhbvNcdTAwMWU1Ujfi/DpQaOaVSbD+XHUwMDA25KmBPFx1MDAwNdW2OKScXHUwMDBiS9NcdTAwMTJ6XHUwMDBmZGlLmTY1OFx1MDAxM8hYbdLZKYB835BIX0pcdTAwMDL3w4tcdTAwMGYrW0Gj+/n8e91cdTAwMDTs9nAl+Dp8nlx1MDAxMSmsOc9yftjy489x993pe02xvNVcdTAwMGbs7cHpx9ZRa3N7Y3Gy+97/9lPVz1pcdTAwMTB53Voj8q+9vTOv3Z5MXHUwMDExyZGzXkhcdTAwMTOVd71cdTAwMWGddEqbXHUwMDFih1SsXl6c3lx1MDAxY5ngZv2mfsjyOqnrNaKBXCJcdTAwMThVTNxYQoU1XHUwMDE0tYtcdTAwMDCTXHT1SatcdGfWsX5uKZf5XGKAXHUwMDA0Q4BzsMYyJXmB54DKXGKfwFBkKohcYnQxZkoxiczxXHUwMDE3VEx30zBcZmSHOOy8iGFgg85cdTAwMWVcdTAwMWVqJoZTJaWl1Wum+qZdX/9cdTAwMWMt6ejgmKv+2idcdTAwMTGeVqCZTs52XHUwMDE3pVq9Xjlf31o8OPiy9fnwZLOC++6fsYta+1x1MDAxMz/4urja+Ua/Nq86q+bFNN5cdTAwMTiAXHUwMDFmbWq7XFz/snhcdTAwMWS2Plx1MDAwNedr30AuXHUwMDFmyclcdTAwMWNcYk6JZSDRRVx1MDAxMJpnSYdUgkhcdTAwMTdWXHUwMDExXHUwMDFhT1x1MDAwMmFz2Fx1MDAxNkxcdTAwMTKqXFyo2Vx1MDAwNVCV1iqPbmaBSKBWoStcdTAwMDJcXFx0OlvwLo/uhy7S+yvxXYdp4vugjEBcblx1MDAwMapcdTAwMDDghuaOPuBbUIFcdTAwMTPF9Fx1MDAxYvGohnh41zg4J+0w7LyfW3G/f8Ff/1x1MDAwZf5cdTAwMGVcdTAwMWNcdTAwMDPohu22130/tzT83bVcZiQ27Ea993Ntv1x1MDAxN/21/3DgXHUwMDFm11xc7/vt5kmt4//xb/dnt1x1MDAxZvzx70I6w1x1MDAxNDFcdTAwMTbZJ1x1MDAwMDqFiqNvUExn+Einfzad+dVcdTAwMDMyOUlcdTAwMWGjQtX3aH9r9dare1e3d5fL1+ffl+jGxFx1MDAxY4lqt1x1MDAwZaK54IZRMGlvYFx1MDAxMIhBRcqMXHUwMDBi5HGuJKRcdTAwMTY5hopUXHUwMDAxoVqiX8bBMFx1MDAxN2QtUKRGXHUwMDExib5cdTAwMDZlWlx0ZVXyJbNcdTAwMTBgnVx1MDAxZJpUh52plknRJTC2cJlUpVRDRo1Ka1xmeuLwpFXSl2Azza2N/Vx1MDAxM2/162dcdTAwMDM7x9eHzbrpQ1SBXHUwMDFh1cBcdTAwMDCNNFXA0sB7OpvxtkRcdTAwMDTBttfdO77Yv1x0RdBY/n420Vx1MDAxYYfmllx1MDAxOM24YMJwbSCDQk3RVTFcdTAwMDadP66YXHUwMDE2Ou+qMMGQzljgXGZccoNWjFx1MDAxNtCZ50RRXnCZY9pcXIUqYLg7XHUwMDA1XGaRikrBlC1yV1x1MDAxNPAyXHUwMDE4XG6JXHUwMDEzaszTYDhGoJWSTIkpXHUwMDA0OsdcdTAwMGJW3FJBYuZeT2C0tOPVRCMuv3yu7VxiXHUwMDE2bbDrr/Zk5dqsXHUwMDFlbfQng7dkRCG4qaHCOmnJXHUwMDE4WVx1MDAxY02Kjqtb6NBcdTAwMTTNbVx1MDAwZd5cXFE0oOj74i0kt7xgsYNJQ1x1MDAxOONWoVShhjBTOSu/XHUwMDE5vPemgbdhyFNFcUJcdTAwMDKUWllcbjibMr1cdTAwMDY447FcYumfyq/B2lJ0srh+cnXYbG9vrVx1MDAxZldlZZ+vlOJJRZK9XHUwMDE4Rd3do7/8wFx1MDAxMWzvtlx1MDAxM/b6XW94uNVcdTAwMGVrrqFR60R4vHnfcH/630Gte+lcdTAwMTj85WUtaDry7p+eXHUwMDBlOP39kabfXHUwMDFiPeVcdTAwMTV5Ly8+QpW4M8erS1x1MDAxYnstOGt7jVx1MDAwYnPX3fWPor6XV7Il7lxmXHUwMDA3KXFulMap0VarTMhcdTAwMTeZXHUwMDFlQfpcdTAwMGKOIXE8Lc+jXHUwMDA0eipcdTAwMTQsXHUwMDE4ZVxcalhqXTqJ+WpGOKfKSGlAI5maJl2kXHUwMDA1plx1MDAwMfAzXHUwMDE17Sx5M1PkiyhcdTAwMWNKdDJ1oTczLl9cdTAwMDT5MpWgVILBl1e0Y1x1MDAxNWLlQVS52LriX1x1MDAxNr9AcLV0cfvd0jV2PFFqXHUwMDE1R8Xs/HLpOsSlUZksXGapLNFWMFxyUmh07vNZXHUwMDE4jFx1MDAwMVx1MDAwMUWtRC4oXHUwMDFj78jDXHUwMDA1v1x1MDAwMlUl+pxcdTAwMTShgnx3muzon4+WmaIl7cnhgt4gSC1cdTAwMGKzq6hcdTAwMTalcFHIMlx1MDAxOVxiOXtZXHUwMDE4neuTTtdr+bfv53AqnCnq+yedWnT2fm5cdTAwMWJ/vlwiQzzxk1RiMENB/c2G/rZ33deLn9jG8mXQrk+G/oGtVNa6Wlxilk3BXHUwMDEyljBFudDGMkNNflx0XHUwMDA1XHUwMDFkXHUwMDFhYo2LIFJOnTnNg/85IYffXGb8l9OskILLU2VF6ydcYodSU4mTTJ1cdTAwMWF+kqn8qeBf2V5b2ptbWpxcdTAwMWKGz19R1GFM36tcdDyc711cdTAwMWMtbTZb9NPX3b3WxuZieNrpTGjgXHKhllxuxDpcdTAwMDBwluHDXFxcdTAwMGJcIlGYXHUwMDE4TqJFiaL55CzEP1x1MDAwMSFcdTAwMDSaXHJcdTAwMDPozpqC0MObiX/o1KMoXHUwMDBmp1xuLDKGylPlXG6eXFyjhVx1MDAxY1NcdTAwMWXiXFxcImHjSOiqXyh9el7Bn+PuO+NcdTAwMGKlqFxmXHUwMDAy9Df/SEKLi9tr8YJez+tee69qjXOKZ6mEnlxcrG6u7zV35HZYu4u+e9tXx1x1MDAxZv1cdTAwMDLdNZjWXHUwMDEx5cVkvOqhLFx1MDAxYS1ktClOXHUwMDFi6y40XHUwMDAzxMXPUbkprSSkqjaG+VtcdTAwMWF1XHUwMDE3ZVRxbSRPRdpcdTAwMTNfnlx1MDAxOIWm1KI9tWhW+DRcdTAwMGKTv1NiaV2tlGSWJmh+mEt2f+RH0vt7heby5ChiMpfBXHUwMDE1myqR82WS3HGthULCMzvEpdLCzjI5dZ+FnIgmd8vpvpmo9ESp9zOhOa9dXHUwMDBmb1xuRvEyvPY2/EFPe0d+dHY/b/OPXHUwMDA3PT7UL75cdTAwMWVcdTAwMDarnZvrPXt30DxZ9FfaXHUwMDA1qaFcdTAwMDV6XHUwMDA1SbAm6DtcdTAwMWJFnVx1MDAwM81TvvBQsUCcyC4k5UrlOVx1MDAxMZWGuHVcdTAwMTaJ9lm51NC8YkGKStCl4lx1MDAwMslcdTAwMTUoodgr4UQvoFk+Pl+xXGL0LYVOZ+gmikWwMbFDxJWiwJ9ElGZfr1BcdTAwMTCEXHTBuGLSMCuSKKr7SEVcdTAwMTjqXHUwMDFjXG5cdTAwMTIppqbUPHq7MrGPXHUwMDFic1x1MDAwMv9r9FRKTO43jYiFbX7jKPh814ZQNM/tx53zTrB+ZlspSom6p1x1MDAxOUt82K376WxcdTAwMTJE0W3SqZHBJ1xuXHUwMDFmX2mUNVBcXCZcdOODRlx1MDAwZZzitFNpuVx1MDAxMozK3PP/XHUwMDE4fbqJ9WlGh2WU6Vx1MDAxOFx1MDAxZDl+XGbG+Y1cXFx1MDAwMVx1MDAxMZpcdCnR61x1MDAxM4JmVCSVjFx1MDAxOG05yo9wJr2Ae7nokVsh0Vx1MDAwMl1LXHUwMDE0voLgULk3/6ZcIkdV5DTJtZKBQF+cXHUwMDE1kSzGS8t6hFx1MDAwNUVcdTAwMTnwyterx1x1MDAxYupcdTAwMTFBfFx03277sLg2f1Lv7dfGmkZ6W01wabzvPZZIUcqIllx1MDAwZeBcdTAwMWMpbDpvZUCklFtcdTAwMWNCVci4wf/bglxuXHUwMDFijlRMXHUwMDE54+g9SqxcdTAwMDZWoCYo14RZVyus3Jxr80alyvTE5+dTKZxcdTAwMTEjXGaHXCL1oVl5zMlVWTGuaYX6o9A+pSS317xqhp9cdTAwMWGtXHUwMDE287f3Vlx1MDAwZbRcbjf9y1+kPirlaVx1MDAwYpQqwl1cYlx1MDAxNvlcdTAwMDVa3FRk331cXCszmlxu7K+STFxu/uhccstxXHUwMDE13zCHqCq5Wlx1MDAxOSNcdTAwMWJcdTAwMWbFflwiI6PMXHUwMDE4pCmccVx1MDAwYlQnXHUwMDAxgkErXHUwMDBlXHUwMDFh+ng4blxunEU0ucdM5H9cIlI5vlxc6YmPYKRwyfNSc25talxyPp4pguZcXEkjlVx1MDAwMVx0jnr+XCJWWYWLXozPSegnsmhcdTAwMWNcdTAwMTYrmUtkNDa7NGk5oUK4sky3dsF1fmnS1SSwXHUwMDAyt/yNct736XFTMkUluVx1MDAxNFajOslXZs7HgZBSm8GQc0pXYFu5+43+aXLTJ7DCZr39zKh+XHQvbHiuZHpcZjO89JvNdOhslFx1MDAxYz7G1rJ8MfNcdTAwMWPVMMbxdVx1MDAxZWND+tRSV5EtXHUwMDE0Negnm+y2L8Jgs7RcdTAwMDBgtDSuXHUwMDFhXCKHbMYlsSBcdTAwMTH+3OWycFFcdTAwMTDVt1x1MDAwNJ1zNpAtptGgelx1MDAwYilcdTAwMGZ2XHUwMDE2sqFZ5vhLXCL9i3k+a2RMXHUwMDE59Fx1MDAxZVnRUiWT5SpASJfzx1KU/v8qXHUwMDAwVy6s7rNQKKdVUrHXXHUwMDFi3lx1MDAxZr/SPNYrXHUwMDA1XHUwMDFjdK2U1VpR9GNkZuNHgdRcdTAwMThcclx1MDAwNM6Go1ZU5UNXSFx1MDAxOYlBViGo21x1MDAxYdLtYZZXMYxcdTAwMDA1aL5cdTAwMTQyNqbTxXSzQCRmSr1UXHUwMDEw35dcdTAwMDJA8aLUYFx1MDAwNqY0pMWAguRCPK1gfPa1y0K5oMbNOVx1MDAxOX1TLfOP5nWPpS+KUlx1MDAxMm9cdTAwMDdcdTAwMDNuSFlmJ0ouXHUwMDA1UZair6ZxKqQuXGKKa6d7qFvldZWeRbvKXCL3wjugu49erVbplOy3jISMYqlcIiNcdTAwMDH9QCNcbsLi83F4s3QrXG5KLVp1aiss3pwlzVIqp+6Tk9A3tVx1MDAxMquVsZuIPJLoZIlwNUfcWPQsWTaOblxm0cIwt8wtXHUwMDA0N1wiX1x1MDAxZupWX+NFWYmmQODUJaBLxdGBXGIltLBui3TOaMJcdTAwMTLeVMuoatl4tmaxXGa0XHUwMDAxla9cdTAwMGZ1iiVfKp5kJOA0u73GZqc+o1LFYlx1MDAxNHH7qVx0ozlqXHUwMDBmy0b8IVx1MDAwNegsKY2EzVx1MDAwMHWF0I/drVxc6uPWnLz/XHUwMDFhRVVcdTAwMTY8XHUwMDFlv8Hm3NOCx9K41Fx1MDAwZdRcdTAwMWPCcic8I7NB0NfBf9Tt3KLcLnj5OP/sRo9te/9uu75yeL3u6Vx1MDAwZlcgO+2lheW8Pi3d14ZcdTAwMWFcdTAwMTckXHUwMDE2XHUwMDE2Jd9YJrI61VpiXHUwMDAwT3I7+HPGn7avXHJlXHUwMDA2XXhr3UZkXHUwMDAyKfbbvjYlXHUwMDFhVXvFXHUwMDFhtSiajFMm3d6kJZWgpa//kOC2cpS6wljSoHbdrWxPXHUwMDEzTVx1MDAxZSPUmyxcXLysrVx1MDAxZnX2lvtcdTAwMTdf9y6/2aVjOsmSiNtcdTAwMDSbKOHSq9xG91LmfFx1MDAwZkYsTpTFkWNSXHUwMDE1ZS2ySXbWnSaO8XttXHUwMDFhoVuTizDFaVBmpN4mtSdMfiuJxK1QXHUwMDEy1ZWCXG4jXHUwMDE2VW5cbuO2XG7w6/3IW9t6RfVZpT2vZjmkv8/aatur7V9fIJFfvbnd2l2dqDpcdTAwMGKNM6KPO1x1MDAxM1x1MDAwZS7VzmZWQ5hcdTAwMTGEu9przqyR2lx1MDAxNCRcIrO4fpujoCH/XHUwMDAxXHJFXHUwMDAxXHUwMDA1Zlx0qlxma1x1MDAwNHXvM1x1MDAxMTBNROE3g/jpXHUwMDE0XHUwMDEwV0ClXHUwMDExKl+1MOjLmFx1MDAxN1xcIMZccoCusJjh3k5BelxmnoDxwS3/uK9cdTAwMDZcbprut1dU2jS++5VUM43fJGf80qfLiJVcIn4hlU7v4DSw35SO8NGCXHJrXHUwMDE1cVx1MDAxNZrIM4FcdTAwMGKtUlVcdTAwMGJcdNTBvVDITVxid1x1MDAxNTNGTpMp93vx0bNipE/h4aPj6TZhMEX4T4eGcy+qYq5cdTAwMTB3hrZ9q3bFXHUwMDEzxZhyjd0xqFx1MDAxYty+6+nLXHUwMDE3uNtQRFxuytyGLUKnX1tXfL9cdTAwMDUmXGJ6XHUwMDAzSOsl4473wkgsciEv8slcdTAwMWTfZe78fFx1MDAxN378XHUwMDBlcHNPc+E1Q/ONalx1MDAwMSxcdTAwMWFoK0eqKoCgV6kpSGZcdTAwMDHVXHUwMDA2oFx1MDAwNsg93+y68P291r74sFx1MDAwMt5xfUt/3TzYO+tcdTAwMWVcdTAwMTfsh1m+Na2r8ORuo1x1MDAwM/fCXHUwMDE5yFx1MDAxNK9TQJdcdTAwMDdcdTAwMTBPkiHx0elXVkzjw2tJXHUwMDE4XGLtVordT/GmM8t0pj9cdTAwMDU7Msq6l1wiXHUwMDE2akdXdlWmXHUwMDFlJVg58o7PirSjXHUwMDE1LFx1MDAxNVx1MDAxM3+WXHUwMDBmXHUwMDBmYm356LNe713umN7x1s3dhv5cdTAwMTZOyPeVq/M0UqDHrbNhfkdcdTAwMTBcXNG+kJpTR6tcbraBXHUwMDE0MVwiXFx+pJW8MMPxzaGfWJ7Pp3Ho3cvK0DcvSnDSdFxchaGIM3uqlmdjIfVcdTAwMDauXG78+V2vVUj1X4VLP9L5arz6UJ/Xulx1MDAwN99N4/bm5DzqXXT6wW5BXHUwMDAyUiHKhUtLXHUwMDFmLOVorbPvq5SEIzeiyFx1MDAxZYWgnOaZ/iRePWfIXGY0+lxuSI2kTe9g/Vx1MDAwNvO5UZhP89JKQa1cdTAwMDZlis1cdTAwMTbIUrOF3FS78peqY89cdTAwMWHQJ3xWfVu/68fbkL0mPz7X5Up89/HbyI/z3SnOXHUwMDA10eiwKMMst5Ddv1m7rGXliqbAXHUwMDAw51x1MDAwNfs3K1x1MDAwNL3bZE1Lrd2rplxulue5tFx1MDAwNOm/ditcdTAwMWZcdTAwMTb1XHUwMDAzm62M5VlcIqIl+yROtWNA/Fx1MDAwZbvC+Hx6Q4js7omauZdcdTAwMThWXHUwMDFlupv6JVx1MDAwNMPD1SZcdTAwMTSiXGJqY9x+OlxuKPpWo867c7gkqlx0QFx1MDAxOUbjw+Rj95NEUce90UG3QihlRnzbhbzEJzd8l7nx83338e9JmXua71x1MDAwZcYyirbaXG7OUItm199Hm2k+U2omfPd39+M8X+t09lwilMzhKM5f+97Nh7wu+Vcr/rhay/hcdJxcdTAwMWXxYlxi/nj3439xXHUwMDE5mlx1MDAxMyJ9fastcsfastcs-eigerFastCSInteractiveShellevent_loop: EventLoopcontroller: Controllertransports: list[Transport]build_api()run()EigerControllerframes: AttrRW[int]exposure: AttrRW[float]captured: AttrR[int]arm: Commandtrigger: Commanddisarm: Commandpv_prefix: strui_path: PathEPICS CA Transportconnect(ControllerAPI)serve()PVsdbl()EigerAttributeIOupdate()send()EigerAttributeIORefuri: str

Architecture#

A FastCS application has three layers:

Controller - a Python class that models the device. It holds attributes and commands, implements connection logic, and creates periodic polling tasks. The controller can create AttributeIOs to handle update and send operations between attributes and the device.

Attributes and commands - typed values (AttrR, AttrW, AttrRW) and callable actions (@command) declared on the controller. Attributes represent the device’s readable and writable parameters and carry metadata such as units, limits, and alarm thresholds. Commands are actions that can be triggered to run.

Transport - the protocol layer that exposes the controller’s attributes and commands to a control system. FastCS provides transports for EPICS CA, EPICS PVA, Tango, REST, and GraphQL.


eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dWXfaSlx1MDAxMn7Pr8jxvF40vS/z5oXYON6JbZyZOT4yXGJb7Fx1MDAwMeFtTv77VMtcdNpaXHUwMDAyXGbOJTGc3CXaaLrrq/pq6dL/Pnz8uFx1MDAxMTxccryNf33c8Fx1MDAxZetux29cZt2Hjb/M8XtvOPL7PThFwr+P+uNhPbzyLlxiXHUwMDA2o3/985/uYOBEdzn1fvflTq/jdb1eMIJr/1xyf//48X/hv+GM3zD3VzrqrvXYVPT6VnpcdTAwMGacXFxI+cVcdTAwMGZvXHIv+jkgdzjsP0SHXHUwMDFm4Vx1MDAxOJdcbjtcXDEuJeVMcz45+1x1MDAwNGcxUsRhjEmCkURS6cnZXHUwMDA3v1x1MDAxMdzBXHUwMDE1aHLkzvNv74LwJuFcdTAwMTDBMZaYXG5OtVx1MDAxMpNr3N5tx0vcNVxuhv22t93v9IdmhP/AWuI6icZ449bbt8P+uNeYXFxcdTAwMTNcZt3eaOBcdTAwMGVhQqLrmn6nU1xynsKnw8TCXHUwMDA0bqS+4/LHiEnqeN5d8KW3dz1vZCZcdTAwMWRPjvZcdTAwMDdu3Vx1MDAwZl7mJvpcdTAwMTVmhINKI1xcn/9GY1x1MDAxYbpdr2JcdTAwMTaoN+50Jof9XsMzU79xI3qJr+s1fnzdz9WNlo78OPI9XHUwMDFhvOeZJ2OuXHUwMDEwkZRhNTlcdTAwMTOJXHUwMDE5pipz+KjfXHUwMDBiZY4rTqlEKlpwf7RcdTAwMDNyXHUwMDE2hI9tup2RXHUwMDE3LYJcdTAwMTlbOSaD0W9cdTAwMWNcdTAwMGZcdTAwMWHuyy1cdTAwMTgkSHCOtEIsmpmO32unJ6DTr7ct3zLo+3FcdTAwMTE3n+j/PkYyXHUwMDEz/mXy///9a/rVWYmMbv+QesxGx1x1MDAxZFx1MDAwNdv9btdcdTAwMGbgd52YMaXHP1xu3GGwXHUwMDA1y+j3btPnvF4j50x416ZB4J3nZoRcdTAwMDLui59LQ9Xr3PRcdTAwMWYsc9bt33uH/sswR5d+cPdjlX5e+CEmNCmdsbfz7XJcdTAwMDc3q/290e5o/OTuN4/b7Zl0hsBYOyD+jGBcdTAwMDKyXHUwMDE3XHUwMDEzvVx1MDAxMFx1MDAxN1iDRlx1MDAxMZJSxCTSXGaz2ZSGdlx1MDAxNMFcdTAwMDIhIZRQXHUwMDFjRXK5Vlx1MDAxYUmlMVhcXGkwQoRcdTAwMDQwRIOJKVxygmSe0qCCIUmJjuzAn6s0SlmRXFxrjY1gS5yc9Vx1MDAwZsp+6fCLOz45U9fnx9dZrTH06sFcdTAwMGJuk2xcdTAwMDNm0mGUKUm4wppGzMCAg1PuSKk1XGJcdTAwMDTXjIro7E/FXHUwMDAxkuJwJlxiXFzEMFY8XHUwMDEy1IlcItFcdTAwMTHspiuOJlJ1hN6L4lxiZlVcdTAwMWM0V3FcdTAwMDBcdTAwMWMoKFtcdTAwMWTp9EhxcFFANqRcdTAwMTRgfV9FNibDi1x1MDAwNjpcdTAwMTFH9+x2t76HXHUwMDFho0rteHuvdrp7vePubsRhPFx1MDAxMcnAe1xmNiYnvmdcdTAwMTC8uFIqgE3xOJNjTFwiRmnmMCB5mHBOONFJxFx1MDAwMJyKXHUwMDExo5XDsyAh81jX91x1MDAwNZKxXHUwMDFkJEml/Fx1MDAwM1xyWmFEXHUwMDE15jY0sJiwp9BAXHUwMDEwXHUwMDE4XHUwMDE1qrnEr4HDm5jRUPDg939cdFx1MDAxN7I/jC9jv1x1MDAxN1T955eBJ45+crt+J1x1MDAxNMPEczY7/q2ZgY06XGbZXHUwMDFibsSnIfDBuZ1cXND1XHUwMDFijbiJqMNDXb/nXHIrs9ia/tC/9Xtu50v+2N1x0D/zRi+jXHUwMDBmhmMvPjfe3oR8OoRcdTAwMTeA97R2cTBcdTAwMTQj/7ZcIj4/b5Hq4VPwMJ7D5knhIHBBNNNKMSyTLjZlXHUwMDFh/G+pueZcZlxiMyFZusypcjC45kyBXHUwMDBiXHUwMDBlrnqkZtdWbzqg7+dcdTAwMDC0JFx1MDAwMjNNSFxcZH/gWapcXDxjXCKxIOBcbi3buu13Kv6R37h7wGf1XHUwMDEy5Sffbr3BYFx1MDAwNa1b8TiLrFx1MDAxYsy1ozRcdTAwMDbzpsC6MZmEhlwi06DBwDhS+DBcbvRcXPFcdTAwMTgvWdu66dB4mFx1MDAwM1x1MDAxYYgjxiWiNlsnXG6woZCSXHUwMDE0cbk6LuNPW3c+ilx1MDAxYqe/z8xNMS9pM5dcdTAwMWP2cizcw9HOOOiRXHUwMDFh2Tw+2CqV77+djlx1MDAwZt05LFx1MDAxY9eORlxuUVx1MDAwNFx1MDAxY1/TXHUwMDA0iDHW4EZcdTAwMDM4kYJcdTAwMGKo1lx1MDAxMcYn9k1Ih2vDYsEzpJws6tW9r3DQ81x1MDAxYyBmXHUwMDE4yFxiplbCKlnm6Fx1MDAwNMRCgXNBNH1cdTAwMTVhLbRwu4/jy/rJjnSDs06j5FXklbe3ilx1MDAxNq5wnIVcdTAwMTZcdTAwMGUhh0omXGZ3XHUwMDAzU5WKlVx1MDAxMkqmgENcdEeYXHUwMDBmg2s55VhkwTGXhXtX4JBoXHUwMDFlcFCkJWfCglxyITOR0lx0NjDHXHUwMDA0zuvVc+b23GHjXHUwMDAxlnFcdTAwMTWM3Fx1MDAxNFx1MDAwYpM2ctmhL8fQ7XyqlfdcdTAwMWbvdL2hn/uH366OxLdcdTAwMWKZxbHX6fiDUcbMXHUwMDEx5FxiXHUwMDBlSKZcdTAwMTK8Nk2SjpxEXHUwMDA2yoyAplRcXIlcYlx1MDAwNT+RXGa3OoarSoZcYlx1MDAxMFZp46pIOkxJJpEgmEmA/Fx1MDAxY8gmTe0x9rcgu+GO7rxfXGZtPFx1MDAwN7Rh0WDWpVx1MDAxNdsyXHUwMDE2hkljW4LXh5BYumP3XHUwMDEwfK3dPDz1v3qfR335dVx1MDAwZvdu7k6XafZwXHUwMDFjXHUwMDFkrzd7RHS++qdlt/Rp/2TAdqv7p1+ah7PWXHUwMDE1UEdoRFx1MDAxOFxmXG70ajJuqYRJIEolwauA/8YyiJNcdTAwMTShXHUwMDAzwi80XHUwMDAzOok1xpjSLFrgXG74XG5cZo9cdTAwMTGUIVxy6vv3QMvfYFx1MDAwN7FaOGkopVx1MDAwNs2ms5ZwIyw0oLkgQkQpgjR7XHUwMDE1in6DpGGupJpPVkaj52WwPHdcdTAwMTIxtnw/SoRerG15OKhstyulk+ftnWs+8J6uusiN6ZeNbr9cdTAwMTGKot9cdTAwMWL5XHIvfqbpP0bfnfydJlx1MDAwMkBDsiOkXHUwMDE2RCR+p4NcdTAwMDSVXHUwMDA0K66pwkCjVOZ3Rlx1MDAxMvX7pDtZvXvub/X9c8E292vbrd1g7/BqxlwiXHSCXHUwMDFkLjVHnGrwXHUwMDAyXCJrbzCtNXJcdTAwMDBOXHUwMDA0XHUwMDFib1xmXHUwMDBilk3cIFx1MDAwN4E8KS4lx+BcdTAwMTljSS15XHUwMDFjI11SmOBcdTAwMTlWlFx1MDAxMFx1MDAxOYuQrTVgSlx1MDAwM+4urFx1MDAwMbGG9Vx1MDAwNPYnbPFhWO7cslx0XGbUj0tcdTAwMDJcdTAwMDD5M1VgqUBYw/NZOV2mXHUwMDE2zC+lyNOP94/3pd2j5qN7c9N6wjW5WW1cdTAwMWZ4S9CPnCqCOdMmwVx1MDAxN2XDzVx1MDAwN/QjXHUwMDEzzNTOXHUwMDEw+Fx1MDAwM+58gXpcXDUlqPavtset2zLrXHUwMDFk35ev79tHu0FwM6tcdTAwMTKkXHUwMDBlgd+NXHUwMDExpVx1MDAxOLEkXHUwMDBilFxmOzBPTCDCgSFEyI90IHhBgilFlVx1MDAwNHeLSFx1MDAxYT0gVjnGXHUwMDFjXHUwMDEwPkpcdTAwMDFjlJhM+VpcdTAwMDfm6cCLZZSOIcyB5thCiCD1ub6UxCD0wJNWJ1x1MDAwZrBsXHUwMDE1mCur4fmsmP5cblwi+EaKXHUwMDBlU0YxU1xmtFx1MDAxZFx1MDAwMqX2V3JcIoyjrShXXG70IMNIZ+vmfkcqWOyzXHUwMDE3hoAx6DlcZoRcdTAwMTmIsWCapeJGmjlYI6SQkVx1MDAxYc6ygSNpJEdcYiBcdTAwMTHMlNOiRUPA70vpXHUwMDExu86zXHUwMDE39HBBqFx1MDAwMpm1KDeZLVx1MDAwYvip25RcdTAwMGXDRG9cdTAwMTNcdTAwMDKeJ5RcdTAwMTNJ44846mZcdTAwMTBcZs8uVyFcdTAwMDA8JfKaXHUwMDBlXHUwMDAwp1x1MDAwN76c8G+xOpyW51x1MDAwNOtcdTAwMDY0llx1MDAwMo/XlIFcdTAwMDKM5OGFzWhHXHUwMDAz0SFcdTAwMDQoIObZrTJcdTAwMDTujsd/uVx1MDAwNcc49tA1kJNAplx1MDAwYpevXHUwMDEyQbRU1MpdeD68wWprKYhES49cdTAwMDNcdTAwMTeHXHUwMDE3XHUwMDEyMvli4CZnvv9V9Nxixv765za22pvN21Pi31x1MDAwZjtPtfrluHSx3V3BuHXxOFx1MDAwYmy1QFx1MDAxYTw1rSmRXHUwMDE4K52sR5KaOqxcYuFcXIV1XGZaMXBtgFx1MDAxYS1cXI70vlx1MDAwMM5mt9QwuUhgzK07WJjOL0diUlCuSSxcXL1SpnpcdTAwMTUs9Vx1MDAxNCNptdTLNtTFXHUwMDAx7Fx1MDAxOUpupYNcdTAwMDTXnFAg3yq5zSRmqDmiIENcdTAwMTZLjZOWem2o58ExX9hQS1Cw4FxmWe10tngpSteaMmtMxavAXWT3ivOgXHSRnMuejsbuVsDlqVx1MDAxN+xcctTl4KTl33/KKX+a67llv9mqXHUwMDBmXHUwMDAyvNuq+sPH6vjxM71dxfxy8e+fkl/mjqJCUi6Z0ihpqUHHO8ZRNlx1MDAxOVx1MDAxNlx1MDAxMFxui6m2bUFcdTAwMDXUY6Xg94GbLVxiU2uA51x1MDAwMXxcdHFEoSXMNJXWfevx7b9pkHPBiJSS/6G5lOTG9bRIRndngPpcdTAwMGLSJm+UVsZMKFx1MDAwNWtOiFx1MDAwMjgn0sphZolwYuqqXHUwMDE4J4xjnU2gr27mpFhcdTAwMGZcdTAwMTfFXGYlJ1x1MDAwZXghgiEsuGKZmOHEXHUwMDEzyaEwXFyvXZFcdTAwMDU0nJgjaEg5NTVO1qAhJ1x1MDAwNUXVoHiEpvpNOnAs7IqsRNBwilx1MDAxYmBzRZZcdTAwMWUzLKFWc2u0u99Ccr99u3vjV3WbzMpRpFx1MDAwMzZcdTAwMGWUm8KIsWTtN2PSMZv5QHKAqlx1MDAxMFx1MDAxZNtDXHUwMDEzq1x1MDAwMZGEaUHNXHUwMDA2KImZbWeE1I5cdTAwMTRcdTAwMTLUI1x1MDAwMkWJ1FxcrOVd7XaSenHSQlx1MDAxNEIm92mrI8XxnS8prMNcdTAwMWFrrP7U8o98MTWfjID+XHUwMDFhXHUwMDBls9K5xM98X5VbXHUwMDA3JXT69WFcdTAwMWNcZnnv6Vx1MDAxM5qtooJzYVpgaFxy861xfM9pWFdLicklMpOMovGas1x1MDAwMreHYelQuIUxIFx1MDAwYkzNVULmXHUwMDAx+aB41Vx1MDAxNEg03uUqkE9L8HpcdTAwMDRcdTAwMDdf1ZJKNFx1MDAwYiFyXHUwMDBiyGBdXHUwMDE08MDXXHUwMDE1T0yGl1xiXHUwMDE0WLlnTERcdTAwMDdn+1x1MDAwZv7d551n3azJbrM6blx1MDAxY11cdTAwMWPOXHUwMDEzKNBEXHUwMDEyXHUwMDFj2660XHUwMDEyXHUwMDBlVUbYV15cdTAwMTlcdTAwMDVDP1x1MDAxNeFM6aNcdTAwMDI1Y1/DWdxcdTAwMGbws1x1MDAxY1xuOp2bskaMklx1MDAwMVSMsHIoaHRCsVx1MDAxMlx1MDAxOPyyjJ5cdNtcdTAwMDaaLZ3aTDLBlrotNo/38b5cdTAwMTRNTqmqvWVcdTAwMDGlyCySzfsg+TtbwEhcdTAwMGJAXHUwMDAxfVx1MDAxM+cjMiGvcD6qgFx1MDAwMKvvXHUwMDEx61x1MDAxNvUrfI8pNjrteySHvVx1MDAxY9ej++S2rj1V6Vf3+d7NsHX/rexaXHUwMDFhj9hcbi9cdTAwMDG8jtHAWlxuXHUwMDE2X5CXXadMOUb7wSllgmmW7TdcdTAwMTa8XHUwMDEy6YBGJ6ZnXHUwMDAz55TLefamvS/87i1MXHUwMDE0zDZ6Q6VtjkZBny3QzDB+uHWJjbamXHUwMDExhZvDm1ZTadrd2nm+apVr+utndfXbXHUwMDEzhVJW3P9oqmBfxVx1MDAxOaiCIFx1MDAwMrRcdTAwMTij4P5cdTAwMTFTXHUwMDA3l1I1YJtcdTAwMWNcdTAwMTRufmJcdTAwMTLzbIk3hmmmZn+7ksj0Z1WW5kZrppCraSpzlEwgU7TGsNX3yNZRxJKqXHUwMDAyIED56jGF8/CRq8BcdTAwMTWmXHUwMDE46kxcdTAwMGKX1MCXw1x1MDAxNs5cdTAwMGaean6Dd+vtNjo/6F1dXdx/sextt7NcdTAwMDVuukxQkzxcdTAwMDeUJlx1MDAwM5XAXHUwMDBmXHUwMDFjjVx1MDAwNMOmSVx1MDAwNcJ8JrZANahPRoRSXHUwMDE0XHUwMDAzqDlbh1x1MDAxNfIwvL8wWyCm53KY6rHRhfxqKCVghZB6XHUwMDFktF/HXHUwMDE2+tfq6Kh34YsxOdkptVsn1eblxe/PXHUwMDE2suL+R7NcdTAwMDX7Ks7GXHUwMDE2mKOwKcxQStJUgSXn0lx1MDAwMaqFhJDENJq20Vx1MDAwNexcYr1cdTAwMGUsvFLVfJ6dLlx1MDAxOG1cdTAwMDJ0XHUwMDAxWSOV+TtdXHUwMDExJVx1MDAxYUlO32Sb10Js4WR80/FHd6tAXHUwMDE3pljqNF3IjHw5fFx1MDAwMZdLT+Vj7Fx1MDAxZVTdvYutg4Py/TBozZGEMPt8NdEyLiNh20bTzk1QYFx1MDAxMsqQfiGyTa2s4Vx1MDAwNWBcdTAwMTlcdTAwMWFcdTAwMWNcdKK10pjFZGyN4iSKXHUwMDBmXHUwMDE2z0NgjTjiwlqzIFh+L1x1MDAwZnDQqDKb2X9cdTAwMWRjaKPaUFx1MDAxZJZuyiebpFs5fEKH3p3+7Vx1MDAxOUNW3P9owmBfxFx1MDAxOVxiXHUwMDAz5zBRWFx1MDAxOVViRE+mXHSDduBcdTAwMWbTbFxizkuadU2AbkjwbCRcIsQ0XHUwMDFikuvwwjya5nB2vkA0zL+g1jdcdTAwMDPQXFxcdTAwMGaEc1g28UY7J6NvfVx1MDAxNV2w90D/xVRhipHOUoWldz+vyC/jJ9roXHUwMDBlvlX2g/r95v1D7aA6x1ZcZlx1MDAwM1HKXHUwMDA0XHUwMDEzXHUwMDE4XHUwMDAwKJKZRODxjqaMXHUwMDEwTVx1MDAwMedUWXqfXHUwMDBik2o0b1x1MDAxM6KIcmnDr2mvXHUwMDBl56UgXHUwMDA0XFwvReeJNLyvbpjVWYlD/lx1MDAwYkBcdTAwMThcdTAwMDFkmeSEXHUwMDA15pxcdTAwMTdUbWNcdTAwMGVrxJdcdTAwMTlqeFx1MDAxMc/NreOzTmuzQZ9OR9vXtdaVbFeW2iN9SVtcdTAwMWSKx1nYPoBcdTAwMDLZ1piaPimK0yTZNjXAjnnPXHUwMDE2lkxQqUi2k1x1MDAxNFx1MDAxMVx1MDAwZTG7mShXUphcdTAwMTZcdTAwMTWLllx1MDAwMr8v0HyZ3Vx1MDAwNlJcdDxDXHUwMDEzbtvTwLKWcfI+XHUwMDEwjFx1MDAxOFx1MDAwMv23gptcdTAwMTIrx6tQXHUwMDA2PMVcdTAwMDSljWB80MuxgZeDXHUwMDFhXHUwMDFhdp9P9fbTqLLb0aSs44XGxVx1MDAxZJC4Y6JZlJnOsVwiWo1wvoDcUsRgmaSWVGfL+NdcdTAwMTXAy4Ty+TJcIu1cdTAwMTJcdTAwMTaLWDuoY0Jy02hcdTAwMTTojVx1MDAwMP/jT33dZmFcdHBpXVx1MDAwM/wxo1Pqg9Fu+fPtdfmucX2xR8jd871cdTAwMTYzXHUwMDExXHUwMDAymGVcdTAwMDdcdTAwMGKYcNM1SKLk1iAhkFx1MDAwM7ZcdTAwMDZmXHUwMDE5a9NZMqtTMOVcdTAwMGVcdTAwMTfF/YRiXCK1XG5bg1jq+N/aePpcImf3o73ztJacgN9i48sqV1uY1SOYrtLbeX8ygut+73owXHUwMDBlrsF8d8xC/6dcdTAwMTfuunFcdTAwMDY5/jKez19cdTAwMWWGXHUwMDAymM9cdTAwMTSC/iCPJiR+RZpcdTAwMTPMNOzlkIUj97l76DW3n9uDO6/j6vFgWLdU7VmBLVx1MDAxZESkUZCIcJzkXG7aXHUwMDE0JFFg8khQqpUlNzZcdTAwMDOuyVx1MDAxYde5uK7NXHUwMDAza1gkyZHVXHLOb4VtXlx1MDAwZqDUKnXCzkP1MqDc8Zq/XHUwMDAyycuG70OJPtzqq9HFqFxcq1x1MDAxZH456nzbrlx1MDAxZc1cdTAwMDRfiZBcdTAwMTPm/qnpTZPy07GJY1NJgT2ajZ+Wd5mB4camzVx1MDAxZlNKMPDmIzl/XHUwMDFkfN/eTV8p+F7NXHUwMDBlX3C1TLGh9V1mXHUwMDA1bcBcdTAwMDQhVFx1MDAxMqTfxE1fXGK+lWNnlFc2v1x1MDAxYajNjHA5YEVl7/G0/alSXHUwMDFknm6dsnp3c+v03PJcdTAwMTJ7SyFcbmbKXHUwMDExYGNcdTAwMDVcdTAwMDdrKkRcdTAwMWGtlDiUXHUwMDEw825cbqpcYlDtXGZapZq6w2WN1ny0fp2jXHUwMDEyXHUwMDA1oEq0sFx1MDAxNreR/EpcdTAwMTTAquk9q1bP2Fx1MDAwMlx1MDAxNsb5pasrg9f0XHUwMDE4l4PYqzN//1x1MDAwNPVLT/T8cYtcdTAwMWZtb1dZuzFcdTAwMWJizWtwlaZMU9NqPun2amyKVE37J81cdTAwMTBcIjRbc1x1MDAxMr6JXHUwMDAzT6k0X9PjXFzEurMjlmBcdTAwMDHAI9hcdTAwMTZcdTAwMDdX+VxyMVx1MDAxOJhlXHSOy+q9Se3lkSnn8Wz1UTzjuJeD7Fx1MDAwMOPjwZa89IPnqiBfWzV1WZ+JOKeRndxCXCLA0lx1MDAxMlNoxuFcdTAwMGZcdTAwMDJcdTAwMWGdRbbEjq1H39rZzUdzY1x1MDAxZTRTzqR5449cdTAwMDXOsULPTFNskyt+o30jXHUwMDBiO7spZIxWXHUwMDE4xMXDnVx1MDAxYrtcdTAwMWZ+XHUwMDA02zfcwaBcdTAwMWFcdTAwMTg98DNcdTAwMDOyce97XHUwMDBmW1m5/0cz/JjUeYh8I/NemDj5/uH7/1x1MDAwMXuzV+wifQ==TransportUserHardwareAttrRWAttrRAttrWSendUpdatePublishPutIO_on_put_callbackAttrW.put_on_put_callbackIO.sendIO.updateupdate_callbackAttrR.update_on_update_callbacks

Sub-controllers let you model hierarchical devices — a sub-controller’s attributes are exposed under a prefixed path, and a set of identical sub-controllers can be grouped using ControllerVector. See Controllers for details.

Writing a driver#

To create a driver, subclass Controller, declare attributes and commands as typed class members, and implement lifecycle hooks (connect, reconnect, disconnect) and periodic scan tasks. The tutorials walk through a complete example.

Deploying as an application#

Passing the controller class to launch() generates a standard CLI with run and schema commands. The run command takes a YAML configuration file that specifies both the controller’s settings and which transports to start. Swapping or adding transports requires only a config change, not a code change. See Launching the framework for details.

Benefits#

Simple API — a driver is a plain Python class with typed class-variable attributes. There is no boilerplate or protocol-specific code in the driver itself.

Control-system-agnostic testing — controllers have no dependency on EPICS, Tango, or any other control system and can be unit-tested as ordinary Python objects. Testing device logic does not require a running IOC or device server.

Multiple transports from a single driver — the same controller can serve EPICS CA, EPICS PVA, Tango, REST, and GraphQL simultaneously or in any combination.

Automatic reconnection — if a scan task raises an exception, FastCS pauses all tasks and calls reconnect() automatically, resuming once the connection is restored.

Auto-generated OPI screens — EPICS transports generate CSS-Phoebus screen files from the controller’s attribute metadata, with no additional effort from the driver author.

Interactive shell — FastCS starts an IPython shell alongside the running driver, giving direct access to the live controller instance for inspection and ad-hoc commands without restarting.

Structured logging and per-attribute tracing — FastCS uses loguru for structured logging. The Tracer mixin adds TRACE-level logging to individual attributes, allowing fine-grained visibility into specific values without increasing the verbosity of the whole driver.

Graylog integration — the generated CLI accepts a --graylog-endpoint option that forwards all log output to a Graylog instance, with support for static and environment-variable-sourced fields for log enrichment.