<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.w9cr.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bryan</id>
	<title>W9CR - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.w9cr.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bryan"/>
	<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php/Special:Contributions/Bryan"/>
	<updated>2026-04-19T08:18:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.34.4</generator>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=User:K9CHA&amp;diff=8427</id>
		<title>User:K9CHA</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=User:K9CHA&amp;diff=8427"/>
		<updated>2026-02-10T09:26:34Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I am a long time radio programmer and HAM radio enthusiast. I look forward to sharing information with the community.&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=User_talk:K9CHA&amp;diff=8428</id>
		<title>User talk:K9CHA</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=User_talk:K9CHA&amp;diff=8428"/>
		<updated>2026-02-10T09:26:34Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to ''W9CR''!'''&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Bryan|Bryan]] ([[User talk:Bryan|talk]]) 04:26, 10 February 2026 (EST)&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=User_talk:WV8FK&amp;diff=8426</id>
		<title>User talk:WV8FK</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=User_talk:WV8FK&amp;diff=8426"/>
		<updated>2026-02-10T09:26:15Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Welcome!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Welcome to ''W9CR''!'''&lt;br /&gt;
We hope you will contribute much and well.&lt;br /&gt;
You will probably want to read the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents help pages].&lt;br /&gt;
Again, welcome and have fun! [[User:Bryan|Bryan]] ([[User talk:Bryan|talk]]) 04:26, 10 February 2026 (EST)&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=User:WV8FK&amp;diff=8425</id>
		<title>User:WV8FK</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=User:WV8FK&amp;diff=8425"/>
		<updated>2026-02-10T09:26:14Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Creating user page for new user.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;WVSIRN P-25 system Technician State of Wv&lt;br /&gt;
Former WV State Police radio system Technician &lt;br /&gt;
WV8FK amateur radio &lt;br /&gt;
&lt;br /&gt;
I enjoy working with Motorola site infrastructure equipment and subscribers&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Strongswan_IKEv2_VPN_to_Windows_11_client_with_EAP&amp;diff=8424</id>
		<title>Strongswan IKEv2 VPN to Windows 11 client with EAP</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Strongswan_IKEv2_VPN_to_Windows_11_client_with_EAP&amp;diff=8424"/>
		<updated>2026-01-16T15:17:59Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Created page with &amp;quot;   = how to start this at boot =  https://dariancabot.com/2010/11/15/automatically-connect-to-vpn-at-windows-startup/  https://woshub.com/autoredial-for-vpn-connections-in-win...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= how to start this at boot =&lt;br /&gt;
&lt;br /&gt;
https://dariancabot.com/2010/11/15/automatically-connect-to-vpn-at-windows-startup/&lt;br /&gt;
&lt;br /&gt;
https://woshub.com/autoredial-for-vpn-connections-in-windows-8102012/&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_IOS&amp;diff=8423</id>
		<title>Letsencrypt SSL certs on IOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_IOS&amp;diff=8423"/>
		<updated>2026-01-10T16:15:43Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Bryan moved page Letsencrypt SSL certs on IOS to Letsencrypt SSL certs on Cisco IOS Classic 2900/3900: Made it more descriptive.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Letsencrypt SSL certs on Cisco IOS Classic 2900/3900]]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8422</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8422"/>
		<updated>2026-01-10T16:15:42Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Bryan moved page Letsencrypt SSL certs on IOS to Letsencrypt SSL certs on Cisco IOS Classic 2900/3900: Made it more descriptive. &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
 &lt;br /&gt;
 dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
 dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco.  Note the ''-legacy'' and ''-macalg SHA1'' on the command line.  This is needed for the router to understand the encrypted file as it needs 3DES, but openssl uses AES now unless legacy is used. The macalg sha1 there is the entire file hash, the individual keys can support sha256, but cisco cannot understand anything other than sha1 on the pkcs12 file.   &lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Automate this via certbot = &lt;br /&gt;
&lt;br /&gt;
== renewal hook ==&lt;br /&gt;
&lt;br /&gt;
This is a script that will do the above and push it to the router via ssh.&lt;br /&gt;
&lt;br /&gt;
 '''/usr/local/bin/cisco-renewal-hook.sh'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd $RENEWED_LINEAGE&lt;br /&gt;
if [ -f privkey.pem ] &amp;amp;&amp;amp; [ -f fullchain.pem ]; then&lt;br /&gt;
   cat privkey.pem fullchain.pem &amp;gt; combined.pem&lt;br /&gt;
   openssl pkcs12 -export -legacy -macalg SHA1 -in combined.pem -name VPNCERT -passout pass:cisco -out ciscoautocert.p12&lt;br /&gt;
   scp -O -o PubkeyAcceptedKeyTypes=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group14-sha1 \&lt;br /&gt;
   -o HostkeyAlgorithms=+ssh-rsa,ssh-dss -i ~/.ssh/rancid_id_rsa ciscoautocert.p12 rancid@cisco.keekles.org:/VPNCERT.p12&lt;br /&gt;
   echo &amp;quot;$(date) - SUCCESS - Certificate in $RENEWED_LINEAGE was renewed, and is ready to be imported into IOS.&amp;quot;&lt;br /&gt;
   exit 0&lt;br /&gt;
else&lt;br /&gt;
   echo &amp;quot;$(date) - FAILURE - Could not find the certificate files, something went wrong. Aborting.&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
make this executable &lt;br /&gt;
== Renewal config ==&lt;br /&gt;
update the /etc/letsencrypt/renewal/.conf file to use this hook bye adding the following:&lt;br /&gt;
 renew_hook = /usr/local/bin/cisco-renewal-hook.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= IOS EEM script = &lt;br /&gt;
&lt;br /&gt;
I stole this from https://github.com/techfil/ciscoautocert &amp;lt;br&amp;gt;&lt;br /&gt;
I had to modify the EEM app for classic IOS.   &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I don't like the script doesn't verify the cert is importable before blowing the old cert away, but this is a limitation of Cisco. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
no event manager applet ciscoautocert&lt;br /&gt;
event manager applet ciscoautocert&lt;br /&gt;
 event timer cron cron-entry &amp;quot;*/5 * * * *&amp;quot; maxrun 60&lt;br /&gt;
 action 010 syslog msg &amp;quot;[VPNCERT] Looking for VPNCERT.p12 in flash...&amp;quot;&lt;br /&gt;
 action 020 cli command &amp;quot;enable&amp;quot;&lt;br /&gt;
 action 030 cli command &amp;quot;dir flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 040 regexp &amp;quot;.*File not found&amp;quot; &amp;quot;$_cli_result&amp;quot;&lt;br /&gt;
 action 050 if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 060  syslog msg &amp;quot;[VPNCERT] New Let's Encrypt certificate found! Will proceed to install it.&amp;quot;&lt;br /&gt;
 action 070  cli command &amp;quot;config t&amp;quot; pattern &amp;quot;#&amp;quot;&lt;br /&gt;
 action 080  cli command &amp;quot;file prompt quiet&amp;quot; pattern &amp;quot;#&amp;quot;&lt;br /&gt;
 action 090  cli command &amp;quot;no crypto pki trustpoint VPNCERT&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 092  regexp &amp;quot;.*[yes/no]:&amp;quot; &amp;quot;$_cli_result&amp;quot; &lt;br /&gt;
 action 093  if $_regexp_result eq &amp;quot;1&amp;quot;&lt;br /&gt;
 action 100   cli command &amp;quot;yes&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 101  end&lt;br /&gt;
 action 102  syslog msg &amp;quot;[VPNCERT] VPNCERT trustpoint removed&amp;quot; &lt;br /&gt;
 action 110  cli command &amp;quot;crypto key zeroize rsa VPNCERT&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 115  regexp &amp;quot;.*[yes/no]:&amp;quot; &amp;quot;$_cli_result&amp;quot; &lt;br /&gt;
 action 116  if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 120   cli command &amp;quot;yes&amp;quot;&lt;br /&gt;
 action 121  end&lt;br /&gt;
 action 122  syslog msg &amp;quot;[VPNCERT] VPNCERT Zeroized&amp;quot;&lt;br /&gt;
 action 130  cli command &amp;quot;crypto pki import VPNCERT pkcs12 flash:/VPNCERT.p12 password cisco&amp;quot; pattern &amp;quot;.*&amp;quot;&lt;br /&gt;
 action 140   cli command &amp;quot;yes&amp;quot; &lt;br /&gt;
 action 150  syslog msg &amp;quot;[VPNCERT] Let's Encrypt certificate updated. Deleting the p12 file...&amp;quot;&lt;br /&gt;
 action 160  cli command &amp;quot;default file prompt&amp;quot; &lt;br /&gt;
 action 170  cli command &amp;quot;do delete /force flash:/VPNCERT.p12&amp;quot; &lt;br /&gt;
 action 180  syslog msg &amp;quot;[VPNCERT] Cleanup complete.&amp;quot;&lt;br /&gt;
 action 190  cli command &amp;quot;end&amp;quot;&lt;br /&gt;
 action 200 else&lt;br /&gt;
 action 210  syslog msg &amp;quot;[VPNCERT] No new certificate found. Nothing to do.&amp;quot;&lt;br /&gt;
 action 220 end&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8421</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8421"/>
		<updated>2026-01-10T15:30:34Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* IOS EEM script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
 &lt;br /&gt;
 dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
 dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco.  Note the ''-legacy'' and ''-macalg SHA1'' on the command line.  This is needed for the router to understand the encrypted file as it needs 3DES, but openssl uses AES now unless legacy is used. The macalg sha1 there is the entire file hash, the individual keys can support sha256, but cisco cannot understand anything other than sha1 on the pkcs12 file.   &lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Automate this via certbot = &lt;br /&gt;
&lt;br /&gt;
== renewal hook ==&lt;br /&gt;
&lt;br /&gt;
This is a script that will do the above and push it to the router via ssh.&lt;br /&gt;
&lt;br /&gt;
 '''/usr/local/bin/cisco-renewal-hook.sh'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd $RENEWED_LINEAGE&lt;br /&gt;
if [ -f privkey.pem ] &amp;amp;&amp;amp; [ -f fullchain.pem ]; then&lt;br /&gt;
   cat privkey.pem fullchain.pem &amp;gt; combined.pem&lt;br /&gt;
   openssl pkcs12 -export -legacy -macalg SHA1 -in combined.pem -name VPNCERT -passout pass:cisco -out ciscoautocert.p12&lt;br /&gt;
   scp -O -o PubkeyAcceptedKeyTypes=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group14-sha1 \&lt;br /&gt;
   -o HostkeyAlgorithms=+ssh-rsa,ssh-dss -i ~/.ssh/rancid_id_rsa ciscoautocert.p12 rancid@cisco.keekles.org:/VPNCERT.p12&lt;br /&gt;
   echo &amp;quot;$(date) - SUCCESS - Certificate in $RENEWED_LINEAGE was renewed, and is ready to be imported into IOS.&amp;quot;&lt;br /&gt;
   exit 0&lt;br /&gt;
else&lt;br /&gt;
   echo &amp;quot;$(date) - FAILURE - Could not find the certificate files, something went wrong. Aborting.&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
make this executable &lt;br /&gt;
== Renewal config ==&lt;br /&gt;
update the /etc/letsencrypt/renewal/.conf file to use this hook bye adding the following:&lt;br /&gt;
 renew_hook = /usr/local/bin/cisco-renewal-hook.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= IOS EEM script = &lt;br /&gt;
&lt;br /&gt;
I stole this from https://github.com/techfil/ciscoautocert &amp;lt;br&amp;gt;&lt;br /&gt;
I had to modify the EEM app for classic IOS.   &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I don't like the script doesn't verify the cert is importable before blowing the old cert away, but this is a limitation of Cisco. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
no event manager applet ciscoautocert&lt;br /&gt;
event manager applet ciscoautocert&lt;br /&gt;
 event timer cron cron-entry &amp;quot;*/5 * * * *&amp;quot; maxrun 60&lt;br /&gt;
 action 010 syslog msg &amp;quot;[VPNCERT] Looking for VPNCERT.p12 in flash...&amp;quot;&lt;br /&gt;
 action 020 cli command &amp;quot;enable&amp;quot;&lt;br /&gt;
 action 030 cli command &amp;quot;dir flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 040 regexp &amp;quot;.*File not found&amp;quot; &amp;quot;$_cli_result&amp;quot;&lt;br /&gt;
 action 050 if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 060  syslog msg &amp;quot;[VPNCERT] New Let's Encrypt certificate found! Will proceed to install it.&amp;quot;&lt;br /&gt;
 action 070  cli command &amp;quot;config t&amp;quot; pattern &amp;quot;#&amp;quot;&lt;br /&gt;
 action 080  cli command &amp;quot;file prompt quiet&amp;quot; pattern &amp;quot;#&amp;quot;&lt;br /&gt;
 action 090  cli command &amp;quot;no crypto pki trustpoint VPNCERT&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 092  regexp &amp;quot;.*[yes/no]:&amp;quot; &amp;quot;$_cli_result&amp;quot; &lt;br /&gt;
 action 093  if $_regexp_result eq &amp;quot;1&amp;quot;&lt;br /&gt;
 action 100   cli command &amp;quot;yes&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 101  end&lt;br /&gt;
 action 102  syslog msg &amp;quot;[VPNCERT] VPNCERT trustpoint removed&amp;quot; &lt;br /&gt;
 action 110  cli command &amp;quot;crypto key zeroize rsa VPNCERT&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 115  regexp &amp;quot;.*[yes/no]:&amp;quot; &amp;quot;$_cli_result&amp;quot; &lt;br /&gt;
 action 116  if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 120   cli command &amp;quot;yes&amp;quot;&lt;br /&gt;
 action 121  end&lt;br /&gt;
 action 122  syslog msg &amp;quot;[VPNCERT] VPNCERT Zeroized&amp;quot;&lt;br /&gt;
 action 130  cli command &amp;quot;crypto pki import VPNCERT pkcs12 flash:/VPNCERT.p12 password cisco&amp;quot; pattern &amp;quot;.*&amp;quot;&lt;br /&gt;
 action 140   cli command &amp;quot;yes&amp;quot; &lt;br /&gt;
 action 150  syslog msg &amp;quot;[VPNCERT] Let's Encrypt certificate updated. Deleting the p12 file...&amp;quot;&lt;br /&gt;
 action 160  cli command &amp;quot;default file prompt&amp;quot; &lt;br /&gt;
 action 170  cli command &amp;quot;do delete /force flash:/VPNCERT.p12&amp;quot; &lt;br /&gt;
 action 180  syslog msg &amp;quot;[VPNCERT] Cleanup complete.&amp;quot;&lt;br /&gt;
 action 190  cli command &amp;quot;end&amp;quot;&lt;br /&gt;
 action 200 else&lt;br /&gt;
 action 210  syslog msg &amp;quot;[VPNCERT] No new certificate found. Nothing to do.&amp;quot;&lt;br /&gt;
 action 220 end&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8420</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8420"/>
		<updated>2026-01-10T08:05:22Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* IOS EEM script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
 &lt;br /&gt;
 dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
 dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco.  Note the ''-legacy'' and ''-macalg SHA1'' on the command line.  This is needed for the router to understand the encrypted file as it needs 3DES, but openssl uses AES now unless legacy is used. The macalg sha1 there is the entire file hash, the individual keys can support sha256, but cisco cannot understand anything other than sha1 on the pkcs12 file.   &lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Automate this via certbot = &lt;br /&gt;
&lt;br /&gt;
== renewal hook ==&lt;br /&gt;
&lt;br /&gt;
This is a script that will do the above and push it to the router via ssh.&lt;br /&gt;
&lt;br /&gt;
 '''/usr/local/bin/cisco-renewal-hook.sh'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
cd $RENEWED_LINEAGE&lt;br /&gt;
if [ -f privkey.pem ] &amp;amp;&amp;amp; [ -f fullchain.pem ]; then&lt;br /&gt;
   cat privkey.pem fullchain.pem &amp;gt; combined.pem&lt;br /&gt;
   openssl pkcs12 -export -legacy -macalg SHA1 -in combined.pem -name VPNCERT -passout pass:cisco -out ciscoautocert.p12&lt;br /&gt;
   scp -O -o PubkeyAcceptedKeyTypes=+ssh-rsa -o KexAlgorithms=+diffie-hellman-group14-sha1 \&lt;br /&gt;
   -o HostkeyAlgorithms=+ssh-rsa,ssh-dss -i ~/.ssh/rancid_id_rsa ciscoautocert.p12 rancid@cisco.keekles.org:/VPNCERT.p12&lt;br /&gt;
   echo &amp;quot;$(date) - SUCCESS - Certificate in $RENEWED_LINEAGE was renewed, and is ready to be imported into IOS.&amp;quot;&lt;br /&gt;
   exit 0&lt;br /&gt;
else&lt;br /&gt;
   echo &amp;quot;$(date) - FAILURE - Could not find the certificate files, something went wrong. Aborting.&amp;quot;&lt;br /&gt;
   exit 1&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
make this executable &lt;br /&gt;
== Renewal config ==&lt;br /&gt;
update the /etc/letsencrypt/renewal/.conf file to use this hook bye adding the following:&lt;br /&gt;
 renew_hook = /usr/local/bin/cisco-renewal-hook.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= IOS EEM script = &lt;br /&gt;
&lt;br /&gt;
I stole this from https://github.com/techfil/ciscoautocert &amp;lt;br&amp;gt;&lt;br /&gt;
I had to modify the EEM app for classic IOS.   &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I don't like the script doesn't verify the cert is importable before blowing the old cert away, but this is a limitation of Cisco. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
event manager applet ciscoautocert&lt;br /&gt;
 event timer cron cron-entry &amp;quot;*/30 * * * *&amp;quot; maxrun 60&lt;br /&gt;
 action 010 syslog msg &amp;quot;[VPNCERT] Looking for VPNCERT.p12 in flash...&amp;quot;&lt;br /&gt;
 action 020 cli command &amp;quot;enable&amp;quot;&lt;br /&gt;
 action 030 cli command &amp;quot;dir flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 040 regexp &amp;quot;.*File not found&amp;quot; &amp;quot;$_cli_result&amp;quot;&lt;br /&gt;
 action 050 if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 060  syslog msg &amp;quot;[VPNCERT] New Let's Encrypt certificate found! Will proceed to install it.&amp;quot;&lt;br /&gt;
 action 070  cli command &amp;quot;config t&amp;quot; pattern &amp;quot;#&amp;quot;&lt;br /&gt;
 action 080  cli command &amp;quot;file prompt quiet&amp;quot; pattern &amp;quot;#&amp;quot;&lt;br /&gt;
 action 090  cli command &amp;quot;no crypto pki trustpoint VPNCERT&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 092  regexp &amp;quot;.*[yes/no]:&amp;quot; &amp;quot;$_cli_result&amp;quot; &lt;br /&gt;
 action 093  if $_regexp_result eq &amp;quot;1&amp;quot;&lt;br /&gt;
 action 100   cli command &amp;quot;yes&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 101  end&lt;br /&gt;
 action 102  syslog msg &amp;quot;[VPNCERT] VPNCERT trustpoint removed&amp;quot;&lt;br /&gt;
 action 110  cli command &amp;quot;crypto key zeroize rsa VPNCERT&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 115  regexp &amp;quot;.*[yes/no]:&amp;quot; &amp;quot;$_cli_result&amp;quot; &lt;br /&gt;
 action 116  if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 120   cli command &amp;quot;yes&amp;quot;&lt;br /&gt;
 action 121  end&lt;br /&gt;
 action 122  syslog msg &amp;quot;[VPNCERT] VPNCERT Zeroized&amp;quot;&lt;br /&gt;
 action 130  cli command &amp;quot;crypto pki import VPNCERT pkcs12 flash:/VPNCERT.p12 password cisco&amp;quot;&lt;br /&gt;
 action 140   cli command &amp;quot;yes&amp;quot; &lt;br /&gt;
 action 150  syslog msg &amp;quot;[VPNCERT] Let's Encrypt certificate updated. Deleting the p12 file...&amp;quot;&lt;br /&gt;
 action 160  cli command &amp;quot;default file prompt&amp;quot; &lt;br /&gt;
 action 170  cli command &amp;quot;do delete /force flash:/VPNCERT.p12&amp;quot; &lt;br /&gt;
 action 180  syslog msg &amp;quot;[VPNCERT] Cleanup complete.&amp;quot;&lt;br /&gt;
 action 190  cli command &amp;quot;end&amp;quot;&lt;br /&gt;
 action 200 else&lt;br /&gt;
 action 210  syslog msg &amp;quot;[VPNCERT] No new certificate found. Nothing to do.&amp;quot;&lt;br /&gt;
 action 220 end&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8419</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8419"/>
		<updated>2026-01-10T07:59:52Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* IOS EEM script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
 &lt;br /&gt;
 dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
 dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco.  Note the ''-legacy'' and ''-macalg SHA1'' on the command line.  This is needed for the router to understand the encrypted file as it needs 3DES, but openssl uses AES now unless legacy is used. The macalg sha1 there is the entire file hash, the individual keys can support sha256, but cisco cannot understand anything other than sha1 on the pkcs12 file.   &lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IOS EEM script = &lt;br /&gt;
&lt;br /&gt;
I stole this from https://github.com/techfil/ciscoautocert &amp;lt;br&amp;gt;&lt;br /&gt;
I had to modify the EEM app for classic IOS.   &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I don't like the script doesn't verify the cert is importable before blowing the old cert away, but this is a limitation of Cisco. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
event manager applet ciscoautocert&lt;br /&gt;
 event timer cron cron-entry &amp;quot;*/30 * * * *&amp;quot; maxrun 60&lt;br /&gt;
 action 010 syslog msg &amp;quot;[VPNCERT] Looking for VPNCERT.p12 in flash...&amp;quot;&lt;br /&gt;
 action 020 cli command &amp;quot;enable&amp;quot;&lt;br /&gt;
 action 030 cli command &amp;quot;dir flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 040 regexp &amp;quot;.*File not found&amp;quot; &amp;quot;$_cli_result&amp;quot;&lt;br /&gt;
 action 050 if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 060  syslog msg &amp;quot;[VPNCERT] New Let's Encrypt certificate found! Will proceed to install it.&amp;quot;&lt;br /&gt;
 action 070  cli command &amp;quot;config t&amp;quot; pattern &amp;quot;#&amp;quot;&lt;br /&gt;
 action 080  cli command &amp;quot;file prompt quiet&amp;quot; pattern &amp;quot;#&amp;quot;&lt;br /&gt;
 action 090  cli command &amp;quot;no crypto pki trustpoint VPNCERT&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 092  regexp &amp;quot;.*[yes/no]:&amp;quot; &amp;quot;$_cli_result&amp;quot; &lt;br /&gt;
 action 093  if $_regexp_result eq &amp;quot;1&amp;quot;&lt;br /&gt;
 action 100   cli command &amp;quot;yes&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 101  end&lt;br /&gt;
 action 102  syslog msg &amp;quot;[VPNCERT] VPNCERT trustpoint removed&amp;quot;&lt;br /&gt;
 action 110  cli command &amp;quot;crypto key zeroize rsa VPNCERT&amp;quot; pattern &amp;quot;[yes/no]&amp;quot;&lt;br /&gt;
 action 115  regexp &amp;quot;.*[yes/no]:&amp;quot; &amp;quot;$_cli_result&amp;quot; &lt;br /&gt;
 action 116  if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 120   cli command &amp;quot;yes&amp;quot;&lt;br /&gt;
 action 121  end&lt;br /&gt;
 action 122  syslog msg &amp;quot;[VPNCERT] VPNCERT Zeroized&amp;quot;&lt;br /&gt;
 action 130  cli command &amp;quot;crypto pki import VPNCERT pkcs12 flash:/VPNCERT.p12 password cisco&amp;quot;&lt;br /&gt;
 action 140   cli command &amp;quot;yes&amp;quot; &lt;br /&gt;
 action 150  syslog msg &amp;quot;[VPNCERT] Let's Encrypt certificate updated. Deleting the p12 file...&amp;quot;&lt;br /&gt;
 action 160  cli command &amp;quot;default file prompt&amp;quot; &lt;br /&gt;
 action 170  cli command &amp;quot;do delete /force flash:/VPNCERT.p12&amp;quot; &lt;br /&gt;
 action 180  syslog msg &amp;quot;[VPNCERT] Cleanup complete.&amp;quot;&lt;br /&gt;
 action 190  cli command &amp;quot;end&amp;quot;&lt;br /&gt;
 action 200 else&lt;br /&gt;
 action 210  syslog msg &amp;quot;[VPNCERT] No new certificate found. Nothing to do.&amp;quot;&lt;br /&gt;
 action 220 end&lt;br /&gt;
exit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8418</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8418"/>
		<updated>2026-01-09T06:35:14Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Open SSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
 &lt;br /&gt;
 dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
 dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco.  Note the ''-legacy'' and ''-macalg SHA1'' on the command line.  This is needed for the router to understand the encrypted file as it needs 3DES, but openssl uses AES now unless legacy is used. The macalg sha1 there is the entire file hash, the individual keys can support sha256, but cisco cannot understand anything other than sha1 on the pkcs12 file.   &lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IOS EEM script = &lt;br /&gt;
&lt;br /&gt;
I stole this from https://github.com/techfil/ciscoautocert &amp;lt;br&amp;gt;&lt;br /&gt;
I had to modify the EEM app for classic IOS.   &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I don't like the script doesn't verify the cert is importable before blowing the old cert away, but this is a limitation of Cisco. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
event manager applet ciscoautocert&lt;br /&gt;
 event timer cron cron-entry &amp;quot;*/30 * * * *&amp;quot;&lt;br /&gt;
 action 010 syslog msg &amp;quot;[VPNCERT] Looking for VPNCERT.p12 in flash...&amp;quot;&lt;br /&gt;
 action 020 cli command &amp;quot;enable&amp;quot;&lt;br /&gt;
 action 030 cli command &amp;quot;dir flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 040 regexp &amp;quot;.*File not found&amp;quot; &amp;quot;$_cli_result&amp;quot;&lt;br /&gt;
 action 050 if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 060  syslog msg &amp;quot;[VPNCERT] New Let's Encrypt certificate found! Will proceed to install it.&amp;quot;&lt;br /&gt;
 action 070  cli command &amp;quot;config t&amp;quot;&lt;br /&gt;
 action 080  cli command &amp;quot;file prompt quiet&amp;quot;&lt;br /&gt;
 action 090  cli command &amp;quot;no crypto pki trustpoint VPNCERT&amp;quot;&lt;br /&gt;
 action 100  cli command &amp;quot;y&amp;quot;&lt;br /&gt;
 action 110  cli command &amp;quot;crypto key zeroize rsa VPNCERT&amp;quot;&lt;br /&gt;
 action 120  cli command &amp;quot;y&amp;quot;&lt;br /&gt;
 action 130  cli command &amp;quot;crypto pki import VPNCERT pkcs12 flash:/VPNCERT.p12 password cisco&amp;quot;&lt;br /&gt;
 action 140  cli command &amp;quot;no&amp;quot;&lt;br /&gt;
 action 150  syslog msg &amp;quot;[VPNCERT] Let's Encrypt certificate updated. Deleting the p12 file...&amp;quot;&lt;br /&gt;
 action 160  cli command &amp;quot;default file prompt&amp;quot;&lt;br /&gt;
 action 170  cli command &amp;quot;do delete /force flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 180  syslog msg &amp;quot;[VPNCERT] Cleanup complete.&amp;quot;&lt;br /&gt;
 action 190  cli command &amp;quot;end&amp;quot;&lt;br /&gt;
 action 200 else&lt;br /&gt;
 action 210  syslog msg &amp;quot;[VPNCERT] No new certificate found. Nothing to do.&amp;quot;&lt;br /&gt;
 action 220 end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8417</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8417"/>
		<updated>2026-01-08T19:26:43Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Certbot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
 &lt;br /&gt;
 dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
 dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco&lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IOS EEM script = &lt;br /&gt;
&lt;br /&gt;
I stole this from https://github.com/techfil/ciscoautocert &amp;lt;br&amp;gt;&lt;br /&gt;
I had to modify the EEM app for classic IOS.   &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I don't like the script doesn't verify the cert is importable before blowing the old cert away, but this is a limitation of Cisco. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
event manager applet ciscoautocert&lt;br /&gt;
 event timer cron cron-entry &amp;quot;*/30 * * * *&amp;quot;&lt;br /&gt;
 action 010 syslog msg &amp;quot;[VPNCERT] Looking for VPNCERT.p12 in flash...&amp;quot;&lt;br /&gt;
 action 020 cli command &amp;quot;enable&amp;quot;&lt;br /&gt;
 action 030 cli command &amp;quot;dir flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 040 regexp &amp;quot;.*File not found&amp;quot; &amp;quot;$_cli_result&amp;quot;&lt;br /&gt;
 action 050 if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 060  syslog msg &amp;quot;[VPNCERT] New Let's Encrypt certificate found! Will proceed to install it.&amp;quot;&lt;br /&gt;
 action 070  cli command &amp;quot;config t&amp;quot;&lt;br /&gt;
 action 080  cli command &amp;quot;file prompt quiet&amp;quot;&lt;br /&gt;
 action 090  cli command &amp;quot;no crypto pki trustpoint VPNCERT&amp;quot;&lt;br /&gt;
 action 100  cli command &amp;quot;y&amp;quot;&lt;br /&gt;
 action 110  cli command &amp;quot;crypto key zeroize rsa VPNCERT&amp;quot;&lt;br /&gt;
 action 120  cli command &amp;quot;y&amp;quot;&lt;br /&gt;
 action 130  cli command &amp;quot;crypto pki import VPNCERT pkcs12 flash:/VPNCERT.p12 password cisco&amp;quot;&lt;br /&gt;
 action 140  cli command &amp;quot;no&amp;quot;&lt;br /&gt;
 action 150  syslog msg &amp;quot;[VPNCERT] Let's Encrypt certificate updated. Deleting the p12 file...&amp;quot;&lt;br /&gt;
 action 160  cli command &amp;quot;default file prompt&amp;quot;&lt;br /&gt;
 action 170  cli command &amp;quot;do delete /force flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 180  syslog msg &amp;quot;[VPNCERT] Cleanup complete.&amp;quot;&lt;br /&gt;
 action 190  cli command &amp;quot;end&amp;quot;&lt;br /&gt;
 action 200 else&lt;br /&gt;
 action 210  syslog msg &amp;quot;[VPNCERT] No new certificate found. Nothing to do.&amp;quot;&lt;br /&gt;
 action 220 end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8416</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8416"/>
		<updated>2026-01-08T18:46:08Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* IOS EEM script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco&lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IOS EEM script = &lt;br /&gt;
&lt;br /&gt;
I stole this from https://github.com/techfil/ciscoautocert &amp;lt;br&amp;gt;&lt;br /&gt;
I had to modify the EEM app for classic IOS.   &lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
I don't like the script doesn't verify the cert is importable before blowing the old cert away, but this is a limitation of Cisco. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
event manager applet ciscoautocert&lt;br /&gt;
 event timer cron cron-entry &amp;quot;*/30 * * * *&amp;quot;&lt;br /&gt;
 action 010 syslog msg &amp;quot;[VPNCERT] Looking for VPNCERT.p12 in flash...&amp;quot;&lt;br /&gt;
 action 020 cli command &amp;quot;enable&amp;quot;&lt;br /&gt;
 action 030 cli command &amp;quot;dir flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 040 regexp &amp;quot;.*File not found&amp;quot; &amp;quot;$_cli_result&amp;quot;&lt;br /&gt;
 action 050 if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 060  syslog msg &amp;quot;[VPNCERT] New Let's Encrypt certificate found! Will proceed to install it.&amp;quot;&lt;br /&gt;
 action 070  cli command &amp;quot;config t&amp;quot;&lt;br /&gt;
 action 080  cli command &amp;quot;file prompt quiet&amp;quot;&lt;br /&gt;
 action 090  cli command &amp;quot;no crypto pki trustpoint VPNCERT&amp;quot;&lt;br /&gt;
 action 100  cli command &amp;quot;y&amp;quot;&lt;br /&gt;
 action 110  cli command &amp;quot;crypto key zeroize rsa VPNCERT&amp;quot;&lt;br /&gt;
 action 120  cli command &amp;quot;y&amp;quot;&lt;br /&gt;
 action 130  cli command &amp;quot;crypto pki import VPNCERT pkcs12 flash:/VPNCERT.p12 password cisco&amp;quot;&lt;br /&gt;
 action 140  cli command &amp;quot;no&amp;quot;&lt;br /&gt;
 action 150  syslog msg &amp;quot;[VPNCERT] Let's Encrypt certificate updated. Deleting the p12 file...&amp;quot;&lt;br /&gt;
 action 160  cli command &amp;quot;default file prompt&amp;quot;&lt;br /&gt;
 action 170  cli command &amp;quot;do delete /force flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 180  syslog msg &amp;quot;[VPNCERT] Cleanup complete.&amp;quot;&lt;br /&gt;
 action 190  cli command &amp;quot;end&amp;quot;&lt;br /&gt;
 action 200 else&lt;br /&gt;
 action 210  syslog msg &amp;quot;[VPNCERT] No new certificate found. Nothing to do.&amp;quot;&lt;br /&gt;
 action 220 end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8415</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8415"/>
		<updated>2026-01-08T18:25:05Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco&lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= IOS EEM script = &lt;br /&gt;
&lt;br /&gt;
I stole this from https://github.com/techfil/ciscoautocert &lt;br /&gt;
I had to modify the EEM app for classic IOS. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
event manager applet ciscoautocert&lt;br /&gt;
 event timer cron cron-entry &amp;quot;*/30 * * * *&amp;quot;&lt;br /&gt;
 action 010 syslog msg &amp;quot;[VPNCERT] Looking for VPNCERT.p12 in flash...&amp;quot;&lt;br /&gt;
 action 020 cli command &amp;quot;enable&amp;quot;&lt;br /&gt;
 action 030 cli command &amp;quot;dir flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 040 regexp &amp;quot;.*File not found&amp;quot; &amp;quot;$_cli_result&amp;quot;&lt;br /&gt;
 action 050 if $_regexp_result eq &amp;quot;0&amp;quot;&lt;br /&gt;
 action 060  syslog msg &amp;quot;[VPNCERT] New Let's Encrypt certificate found! Will proceed to install it.&amp;quot;&lt;br /&gt;
 action 070  cli command &amp;quot;config t&amp;quot;&lt;br /&gt;
 action 080  cli command &amp;quot;file prompt quiet&amp;quot;&lt;br /&gt;
 action 090  cli command &amp;quot;no crypto pki trustpoint VPNCERT&amp;quot;&lt;br /&gt;
 action 100  cli command &amp;quot;y&amp;quot;&lt;br /&gt;
 action 110  cli command &amp;quot;crypto key zeroize rsa VPNCERT&amp;quot;&lt;br /&gt;
 action 120  cli command &amp;quot;y&amp;quot;&lt;br /&gt;
 action 130  cli command &amp;quot;crypto pki import VPNCERT pkcs12 flash:/VPNCERT.p12 password cisco&amp;quot;&lt;br /&gt;
 action 140  cli command &amp;quot;no&amp;quot;&lt;br /&gt;
 action 150  syslog msg &amp;quot;[VPNCERT] Let's Encrypt certificate updated. Deleting the p12 file...&amp;quot;&lt;br /&gt;
 action 160  cli command &amp;quot;default file prompt&amp;quot;&lt;br /&gt;
 action 170  cli command &amp;quot;do delete /force flash:/VPNCERT.p12&amp;quot;&lt;br /&gt;
 action 180  syslog msg &amp;quot;[VPNCERT] Cleanup complete.&amp;quot;&lt;br /&gt;
 action 190  cli command &amp;quot;end&amp;quot;&lt;br /&gt;
 action 200 else&lt;br /&gt;
 action 210  syslog msg &amp;quot;[VPNCERT] No new certificate found. Nothing to do.&amp;quot;&lt;br /&gt;
 action 220 end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8414</id>
		<title>Letsencrypt SSL certs on Cisco IOS Classic 2900/3900</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Letsencrypt_SSL_certs_on_Cisco_IOS_Classic_2900/3900&amp;diff=8414"/>
		<updated>2026-01-08T18:05:10Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Created page with &amp;quot;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.    '''Fucking certs, I'm a network engineer, not a cryptographer.'''   = Certb...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I have a number of classic IOS 15.7 2900/3900 devices that I'm installing lets encrypt certs on.  &lt;br /&gt;
&lt;br /&gt;
'''Fucking certs, I'm a network engineer, not a cryptographer.''' &lt;br /&gt;
&lt;br /&gt;
= Certbot =&lt;br /&gt;
&lt;br /&gt;
I'm using power DNS and have installed the power dns plugin for this.  I have a config file for the API at ~/cerbot-pnds.ini, and I'm running this on the authoritative server it self.  If you're doing it on another server, you need to open up API access for remote clients. &lt;br /&gt;
&lt;br /&gt;
 '''~/cerbot-pnds.ini'''&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dns_powerdns_api_url = http://127.0.0.1:8081&lt;br /&gt;
dns_powerdns_api_key = 'SEKRETDATA'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now you need to request a key&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
This is for a RSA only key&lt;br /&gt;
certbot certonly --key-type rsa --rsa-key-size 4096 -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&lt;br /&gt;
This will use the more secure format. ECDSA, but this doesn't work on classic IOS 15.7 on the 2900&lt;br /&gt;
certbot certonly -m bryan@bryanfields.net --preferred-challenges=dns -d cisco.keekles.org  --authenticator dns-powerdns --dns-powerdns-credentials  ~/cerbot-pnds.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://community.cisco.com/t5/vpn/eckeypair-vs-rsakeypair-in-pki/td-p/2969061 Info here if you get] &lt;br /&gt;
 CRYPTO_PKI: status = 0x71E(E_PRIVATE_KEY : private key is null or doesn't match public key): Imported PKCS12 file failure&lt;br /&gt;
&lt;br /&gt;
= Open SSL =&lt;br /&gt;
&lt;br /&gt;
Cat all the keys together&lt;br /&gt;
&lt;br /&gt;
 cat /etc/letsencrypt/live/cisco.keekles.org/privkey.pem /etc/letsencrypt/live/cisco.keekles.org/fullchain.pem &amp;gt; /etc/letsencrypt/live/cisco.keekles.org/combined.pem&lt;br /&gt;
&lt;br /&gt;
Make a P12 format file to load on the cisco&lt;br /&gt;
 openssl pkcs12 -export -legacy -macalg SHA1  -in /etc/letsencrypt/live/cisco.keekles.org/combined.pem -name VPNCERT -passout pass:cisco -out /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= copy it to the router = &lt;br /&gt;
&lt;br /&gt;
 scp -O -o KexAlgorithms=+diffie-hellman-group14-sha1 -o HostkeyAlgorithms=+ssh-rsa,ssh-dss /etc/letsencrypt/live/cisco.keekles.org/ciscoautocert.p12 bryan@cisco.keekles.org:/ciscoautocert.p12&lt;br /&gt;
&lt;br /&gt;
= import it on the router =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
conf t&lt;br /&gt;
#crypto pki import VPNCERT pkcs12 flash:/ciscoautocert.p12 password cisco&lt;br /&gt;
% Importing pkcs12...&lt;br /&gt;
Source filename [ciscoautocert.p12]?&lt;br /&gt;
Reading file from flash0:/ciscoautocert.p12&lt;br /&gt;
CRYPTO_PKI: Imported PKCS12 file successfully.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= validate it = &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#show crypto pki certificates VPNCERT&lt;br /&gt;
Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 06F63C8350E38A8F228B1F53D55F9AD98503&lt;br /&gt;
  Certificate Usage: General Purpose&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    Name: cisco.keekles.org&lt;br /&gt;
    cn=cisco.keekles.org&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://r13.c.lencr.org/4.crl&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 17:01:28 UTC Jan 8 2026&lt;br /&gt;
    end   date: 17:01:27 UTC Apr 8 2026&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&lt;br /&gt;
CA Certificate&lt;br /&gt;
  Status: Available&lt;br /&gt;
  Certificate Serial Number (hex): 5A00F212D8D4B480F3924157EA298305&lt;br /&gt;
  Certificate Usage: Signature&lt;br /&gt;
  Issuer:&lt;br /&gt;
    cn=ISRG Root X1&lt;br /&gt;
    o=Internet Security Research Group&lt;br /&gt;
    c=US&lt;br /&gt;
  Subject:&lt;br /&gt;
    cn=R13&lt;br /&gt;
    o=Let's Encrypt&lt;br /&gt;
    c=US&lt;br /&gt;
  CRL Distribution Points:&lt;br /&gt;
    http://x1.c.lencr.org/&lt;br /&gt;
  Validity Date:&lt;br /&gt;
    start date: 00:00:00 UTC Mar 13 2024&lt;br /&gt;
    end   date: 23:59:59 UTC Mar 12 2027&lt;br /&gt;
  Associated Trustpoints: VPNCERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Quantar&amp;diff=8413</id>
		<title>Quantar</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Quantar&amp;diff=8413"/>
		<updated>2025-12-25T19:38:52Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Manuals */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quantar/Quantro info ==&lt;br /&gt;
&lt;br /&gt;
There is a bunch of info here about the technical aspects of the Quantar Stations. &lt;br /&gt;
&lt;br /&gt;
The info on the modification and changing ranges of the various modules is on the respective pages.  There is some conversion info below, but it's being migrated and reformatted under the respective pages.  I feel this is more logical.&lt;br /&gt;
&lt;br /&gt;
If you find anything to be wrong here, please feel free to make an account and change it.  I've had to lock down account creation, so you'll need to have it approved.  If you want to email me directly, my email is [mailto:bryan@bryanfields.net bryan@bryanfields.net]&lt;br /&gt;
&lt;br /&gt;
=== Specifications ===&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar Specifications VHF, UHF, 800 MHz.pdf|Quantar Specifications VHF, UHF, 800 MHz]] - This is the combined spec sheet for the VHF/UHF and 800 base stations.&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar Data Base Sation Specification Sheet 800 900 MHz.pdf|Quantar Data Base Station Specification Sheet 800 900 MHz]]&lt;br /&gt;
&lt;br /&gt;
[[Media:ASTRO TAC QUANTAR receiver manual.pdf|ASTRO TAC QUANTAR receiver manual]]&lt;br /&gt;
&lt;br /&gt;
=== Programming ===&lt;br /&gt;
&lt;br /&gt;
Links to programming stuff&lt;br /&gt;
&lt;br /&gt;
[[media:CSS_007.13.R022.00.035_12-04.exe|CSS 007.13.R022.0035 for EPIC4 Smart Zone SCM]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS_R14.08.01.zip|WinRSS 14.08.01 Windows RSS]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar WinRSS R14.10.00 release July 15 2011.zip|WinRSS 14.10.00 release July 15 2011.zip]] &lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS R14.11.00.zip| WinRSS 14.11.00]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS R14.12.00.zip| WinRSS R14.12.00]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS_R14.13.00.zip|WinRSS 14.13.00 April 2015]] Current Winrss - narrowband only.  Use the rsscore.dll from 14.12.00 will re-enable wideband. Or just run 14.12.00.&lt;br /&gt;
&lt;br /&gt;
[[Media:DIU CSS Installation.zip|DIU3000 CPS/CSS software 8.00.18 30-APR-2005]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Firmware ====&lt;br /&gt;
&lt;br /&gt;
The newer SCM modules can be upgraded via SLIP connection over the tty port, or via IP over the 10Base2 connector (anyone have a hub?).&lt;br /&gt;
&lt;br /&gt;
The Wireline typically will upgrade during this too, unless it has the older EPROM memory.  At that point you'll have to swap the chips.&lt;br /&gt;
&lt;br /&gt;
The exciter is still a hard chip swap upgrade, but programed EPROM's are $20 shipped on eBay.  Unless you have more than a few to upgrade it's not cost effective to buy the programer and chips yourself.&lt;br /&gt;
&lt;br /&gt;
:: [[Media:Quantar Conventional Firmware Upgrade Package R020-14-048.zip|Quantar Conventional Firmware Upgrade Package R020-14-048 ]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== SIMM Images =====&lt;br /&gt;
&lt;br /&gt;
The SIMM has a boot1 image which is a basic bootloader (0x460-0x3ffff).  This runs just after the bootstrap code (0x000 0x45f). The bootloader (boot.o) contains basic code to initialize the hardware and validate the boot2.o, sc.o and wl.o images stored in the SIMM. It also has a slip loader in it.  With only the boot.o code running it's possible to reload the entire OS at 9600 baud via the front port.  &lt;br /&gt;
&lt;br /&gt;
The boot.o is the only code not able to be upgraded on the SIMM via SLIP/FTP.  To upgrade boot.o you need to flash the SIMM directly.  Normally boot.o does not matter, but it is different for IR and NIR stations.  The other issue is the newer (EPIC III) SCM cards will not boot with boot.o 020.10.001, and need at least the 020.10.008 code.  The newest boot code is 020.10.012, and the images below have that code on them.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Conventional Firmware for U1-U4 on the SIMM module 20.14.048&lt;br /&gt;
&lt;br /&gt;
:: [[media:NIR-R020.12.048 B2-R020.14.15 B1-R020.10.12.zip]] -- Most current firmware, works on all SCM boards.&lt;br /&gt;
&lt;br /&gt;
:: [[media:Quantar-Flash-Simm-EPIC2-NON-IR-FW-20.14.048-Boot-020.10.001.zip]]  -- '''Don't use, older code for historical reference only'''&lt;br /&gt;
&lt;br /&gt;
IntelliRepeater (IR) Firmware for U1-U8 on the two bank SIMM module 20.14.520&lt;br /&gt;
&lt;br /&gt;
:: [[Media:IR-SIMM-20.14.520.zip]]&lt;br /&gt;
&lt;br /&gt;
This is for the old B013.05.014 EPIC I firmware that would run from the 27C040 PROMs.  It's here for reference, don't use it.&lt;br /&gt;
&lt;br /&gt;
:: [[Media:Quantar 27C040 SCM B013.05.014 EPROM images.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hacking info &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
How to combine the firmware into a single binary image&lt;br /&gt;
&lt;br /&gt;
srec_cat -Output 20.14.038-SIMM.bin -Binary \&lt;br /&gt;
&amp;quot;U4.bin&amp;quot; -Binary -unsplit 4 0 \&lt;br /&gt;
&amp;quot;U3.bin&amp;quot; -Binary -unsplit 4 1 \&lt;br /&gt;
&amp;quot;U2.bin&amp;quot; -Binary -unsplit 4 2 \&lt;br /&gt;
&amp;quot;U1.bin&amp;quot; -Binary -unsplit 4 3&lt;br /&gt;
&lt;br /&gt;
srec_cat -Output 20.14.048-SIMM.bin -Binary \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u4.bin&amp;quot; -Binary -unsplit 4 0 \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u3.bin&amp;quot; -Binary -unsplit 4 1 \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u2.bin&amp;quot; -Binary -unsplit 4 2 \&lt;br /&gt;
&amp;quot;20.14.048 - EPIC 2 - U1.bin&amp;quot; -Binary -unsplit 4 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How to Split it back into a per chip image.&lt;br /&gt;
&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 0 -Output U4-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 1 -Output U3-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 2 -Output U2-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 3 -Output U1-920.bin -Binary&lt;br /&gt;
&lt;br /&gt;
0x00000 is the start of boot1 &lt;br /&gt;
&lt;br /&gt;
boot1 is never updated by the station.  When you go to flash the station, the ftp server an everything runs from this code.  The main sc.o code doesn't have the FTP server in it. &lt;br /&gt;
&lt;br /&gt;
0x40000 is the start of boot2  &lt;br /&gt;
BEBE CAFE BEBE CAFE then object name&lt;br /&gt;
FEED BEEF FEED BEEF is the end then  4 bytes &lt;br /&gt;
EEnd of ROM&lt;br /&gt;
0x80000 is the start of sc.o&lt;br /&gt;
0018FC54 is the start of wl.o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Wireline Images =====&lt;br /&gt;
&lt;br /&gt;
'''Go check out the [[Wireline|wireline page]] for updated info the below is not the most current.'''&lt;br /&gt;
&lt;br /&gt;
Wireline 20.10.816 for AT27C010 Chips.  This works with the 20.14.048 Conventional Firmware&lt;br /&gt;
&lt;br /&gt;
:: [[Media:wlb_2000_20.10.816_u134_upper_AT27C010.bin|Wireline U134 Upper 20.10.816 ]]&lt;br /&gt;
:: [[Media:wlb_2000_20.10.816_u135_lower_AT27C010.bin|Wireline U135 Lower 20.10.816 ]]&lt;br /&gt;
&lt;br /&gt;
===== Exciter Images =====&lt;br /&gt;
&lt;br /&gt;
This is the matching Exciter Image for a AM27C512 UV EPROM&lt;br /&gt;
&lt;br /&gt;
:: [[Media:exciter_r020.09.018_matches-scm-20.14.048__U3701__am27c512.bin|Exciter 020.09.018]]&lt;br /&gt;
&lt;br /&gt;
==== Code Plug format ====&lt;br /&gt;
&lt;br /&gt;
=== Manuals ===&lt;br /&gt;
* [[Media:Motorola Quantar Instruction Manual.pdf|Motorola Quantar Instruction Manual 68P81095E05-B with updates]] - Most comprehensive manual&lt;br /&gt;
&lt;br /&gt;
* [[media:Quantar Satellite Receiver Instruction Manual 68P81087E25-O.pdf|Quantar Satellite Receiver Instruction Manual 68P81087E25-O.pdf]] - This is the manual for Satellite Receiver (not AstroTac Receiver), which is basically a Quantar minus the PA/Exciter.  The advantage to this is it can be used where wildcard functions are need. &lt;br /&gt;
&lt;br /&gt;
* [[media:Service_manual.pdf|Quantar Service Manual 68P81088E90-G]] - this is the full service manual for the Quantar/Quantro and AstroTac&lt;br /&gt;
* [[media:Quantar RSS Manual R14.10.00.pdf|Quantar RSS Manual R14.10.00]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:6881085E35-AT Quantar RSS Manual R14.13.00.pdf|Quantar RSS Manual R14.13.00]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Quantar Service Bulletin |a complete listing of service bulletins for the Quantar]]&lt;br /&gt;
&lt;br /&gt;
The [[PDR 3500|PDR3500]] is basically a Quantar in a portable format using a PA from a Spectra mid power radio.  The basic service manual has a diagram of the backplane and glue circuits that tie this all together.  It's very interesting to read as it explains quite a bit more of how the ID resistors and SPI bus works.  If you're hacking quantar's, it's a must read.&lt;br /&gt;
&lt;br /&gt;
* [[Media:PDR 3500 Transportable Repeater Basic Service Manual.pdf|PDR 3500 Transportable Repeater Basic Service Manual]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:ASTRO 25 Conventional Systems System Planner ASTRO 3.1 Convl Sys.Planner.pdf|ASTRO 25 Conventional Systems System Planner ASTRO 3.1 Convl Sys.Planner]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:Zhone TeNSr 800 imacs-system-reference-guide-7.2.1.pdf|Zhone TeNSr 800 imacs-system-reference-guide-7.2.1]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:68P81003Y54-O Managing Network Transport Equipment.pdf|68P81003Y54-O Managing Network Transport Equipment]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:GPS Simulcast Installation Manual 68P81098E65-C.pdf|GPS Simulcast Installation Manual 68P81098E65-C]]&lt;br /&gt;
&lt;br /&gt;
* [[Winrss help|RSS Software Help file.]] - this is the help file from WinRSS and is quite useful for station programing tips.&lt;br /&gt;
&lt;br /&gt;
* [[Quantar Serial Commands]] - Info on the serial commands the quantar station supports from the RSS port.&lt;br /&gt;
&lt;br /&gt;
== Hardware info ==&lt;br /&gt;
&lt;br /&gt;
=== Part numbers ===&lt;br /&gt;
Here are part numbers and what the correspond to.  &lt;br /&gt;
&lt;br /&gt;
=== Power Supplies ===&lt;br /&gt;
&lt;br /&gt;
The -48v supplies are easy to see as they have a side to side DC breaker style switch.  The Motorola/Onan column refers to the manufacturer of the PS.  Many people rag on the Onan power supplies, but I've not had one fail in service yet.  The Onan do have a heat activated fan, whereas the Motorola run continuously.  This can be good for base use or in the lab, as the base station will not make noise unless it's keyed down for some time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Quantar power supplies&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| P/N ||Description||Motorola/Onan||Watts&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1031||48/60v input||Yes||600&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1049||AC no charger||Yes||265&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1050||AC with Charger||Yes||265&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1047||AC no charger||Yes||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1048||AC with Charger||Yes||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7802||12/24v DC||No||210&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7803||48/60v input||No||210&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7801||24v input||No||600&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1042||AC||No||700&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TPN6185||AC w/Charger|| ?||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TPN1186||No idea|| ? ||				&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Several PSUs have a DC input on the back using a special connector pictured below.  This is an [https://www.te.com/en/product-530521-3.html AMP/TE 530521-3] 4 position connector.  The contacts are 5-530519-2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
Quantar-DC-Connector-00001.jpg&lt;br /&gt;
Quantar-DC-Connector-00002.jpg&lt;br /&gt;
Quantar-DC-Connector-00003.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Quantro/Quantar-Backplane|BackPlane]] ===&lt;br /&gt;
&lt;br /&gt;
The [[Quantro/Quantar-Backplane|BackPlane]] modules are different for the Quantar and Quantro. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Station Control info ===&lt;br /&gt;
&lt;br /&gt;
'''Station Control Module''' or '''''SCM''''' is the heart of the Quantar station.  The SCM comes in different revisons known as EPIC. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* [[EPIC 1|EPIC I  - TTN4094]]&lt;br /&gt;
* [[EPIC II|EPIC II - CLN6686F]]&lt;br /&gt;
* EPIC III - Note the EPIC3 will not work out of band.  The modulation will be very low.&lt;br /&gt;
* EPIC IV - '''This is only for the Smart Zone trunking.  IT will not work for conventional'''&lt;br /&gt;
* [[EPIC V| EPIC V - MCLN8447]]&lt;br /&gt;
* EPIC 6 - lol it doesn't exist.  &amp;lt;ref&amp;gt;my theory on this is eBay sellers searched the part number CLN7692 and found this page and then read 'IV' as 6 not 4. https://www.youtube.com/watch?v=Exiy5eVMzg4&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Quantar&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||Conv/6809||IntelliRepeater||Astro 25 Trunking ONLY&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6&amp;quot;&lt;br /&gt;
| EPIC I||Board||TTN4094||TRN7900||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6;&lt;br /&gt;
| ||FRU||TLN3397||TLN3398||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6961||CLN6960||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU||CLN1293||CLN1294||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#E2EFDA;&lt;br /&gt;
| EPIC III||Board||CLN1614||N/A||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#E2EFDA;&lt;br /&gt;
| ||FRU||CLN1621||N/A||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FFF2CC;&lt;br /&gt;
| EPIC IV||Board||N/A||N/A||CLN7692&lt;br /&gt;
|- style=&amp;quot;background-color:#FFF2CC;&lt;br /&gt;
| ||FRU||N/A||N/A||DLN1229&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| [[EPIC V|EPIC V]]||Board||MCLN8426||MCLN8447||N/A&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||CLN8480||CLN8479||N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;ASTRO-TAC Receiver&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||Conv/6809||Astro 25 Trunking ONLY&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6&amp;quot;&lt;br /&gt;
| EPIC I||Board||TTN4094||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6;&lt;br /&gt;
| ||FRU||TLN3397||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6873||CLN6873&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU||CLN1273||CLN1273&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| EPIC V||Board||MCLN8426||MCLN8426&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||CLN8480||CLN8480&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 75%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Others&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||SecureNet||Limited||PDR 3500||DBS||ATAC 3000 ||ATAC9600&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6961||CLN7462||CLN6686||CLN7361||CLN7361||[[ASTRO-TAC#CCN4009|CCN4009]]&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU|| ||CLN1609||CLN1177||CLN1914||CLN1914||CCN1009&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| EPIC V||Board||MCLN8426||N/A||N/A||N/A||N/A||N/A&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||Unknown||N/A||N/A||N/A||N/A||N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The only difference between the various versions of the EPICs (excluding EPIC IV) is the hardware is newer.  There is no difference in functionality for conventional analog/astro/P25 operation.&lt;br /&gt;
&lt;br /&gt;
==== SIMM info ====&lt;br /&gt;
&lt;br /&gt;
The SIMM used for firmware in the Quantar EPIC 2/3 is an 80 pin SIMM and is basically unobtanimum.  It is possiable to use a Motorola [[COIM Modification|Console Operator Interface Module SIMM]] if you want to modify it. &lt;br /&gt;
&lt;br /&gt;
The conventional uses 4, 29F040 chips arranged to be 32 bits wide. This means each chip stores every 4th byte. &lt;br /&gt;
&lt;br /&gt;
Example we store &amp;quot;QUANTAR MOTOROLA&amp;quot; in the SIMM&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Chip 1 !! Chip 2 !! Chip 3 !! Chip 4&lt;br /&gt;
|-&lt;br /&gt;
| Q || U || A || N&lt;br /&gt;
|-&lt;br /&gt;
| T || A || R || &lt;br /&gt;
|-&lt;br /&gt;
| M || O || T || O&lt;br /&gt;
|-&lt;br /&gt;
| R || O || L || A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
So if we read Chip 1 we'd see QTMR.&lt;br /&gt;
&lt;br /&gt;
The IR uses a two bank SIMM with the same layout (8 chips total)&lt;br /&gt;
&lt;br /&gt;
It's possible to pull these chips and read/write them if you have the right programmer. Taking advantage of this I was able to build a SIMM programmer for the soldered in place SIMM's that essentially programs one chip at a time (8bits). &lt;br /&gt;
[[File:SIMM Programmer.jpeg|thumbnail|80 Pin SIMM Programmer]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's not pretty but it works. &lt;br /&gt;
&lt;br /&gt;
The SIMM has the ability to be upgraded via the SCM download procedure, but the IR SIMM and NON-IR SIMMs cannot be interchanged.  This is do to the boot code being different.  Using the SIMM programmer or the socketed SIMM you can reprogram the SIMM's for either.&lt;br /&gt;
&lt;br /&gt;
==== SIMM-less SCM ====&lt;br /&gt;
&lt;br /&gt;
It is possible to use 29F040 chips in the sockets on the EPIC 1 with just a flick of the Flash switch, this makes it easy to use the current Quantar Firmware in the EPIC 1 with just standard DIP chips.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the later revision EPIC's the DIP sockets are only used for 27c040 chips which have a slightly different pinout.  It's possible to use the SIMM images as u1-4 maps to U451-454 with a slight modification to the chips.  Typically I'll bend up pins 1, (A18 on Flash, VPP on EEPROM) and 31 (!WE on Flash, A18 on EEPROM), and then connect a wire from the board at pin 31 to pin 1 on the chip.  A connection to !WE on the chip is optional unless you want to be able to upgrade the chips.  In this case you'll need to make a conection from SIMM pins 53, 29, 6, &amp;amp; 5 to the !WE lines on U451-U454 respectively.  &lt;br /&gt;
&lt;br /&gt;
The Quantar doesn't care about the ID pins on the SIMM, but I typically will tie 74, 75, 76, 79 to ground/pin 80.  If you're doing an ATAC 3k, the ATAC does care about this and you need pins 76 and 79 tied to ground.   &lt;br /&gt;
&lt;br /&gt;
Of course the Intelerepeater and ATAC9k will not work in this configuration as they need two banks on the SIMM, so you can't do this if that's your requirement.  For most ham stuff, there's no reason you need anything more than NIR code for Quantar and ATAC 3000.&lt;br /&gt;
&lt;br /&gt;
=== Receiver ===&lt;br /&gt;
Like the rest of the unit the receivers are frequency dependent and consist of their own modules.  The basic receiver has a preselector which is 4 MHz wide on VHF and 6 MHz wide on UHF. &lt;br /&gt;
&lt;br /&gt;
The receiver is an excellent high side injection design (exception for 800/900 which is low side).  The first IF is +21.45 MHz on VHF and +73.35 MHZ on UHF/800/900.  The second IF is 455 KHz.  In many cases barefoot (minus preselector) the receiver sensitivity is under -120dBm for 12 dB SINAD.  Couple this with the great built in selectivity and it's truly a bullet proof design idea for high RF sites.&lt;br /&gt;
&lt;br /&gt;
The receiver is pretty dumb, there is not a μP on the board, making it easier to troubleshoot.  The devices receive their programming from the main CPU on the SCM via SPI bus.  The two main chips are the U2500 receiver IC and U2401 PLL IC.  U2401, the PLL, is a custom chip responsible for locking the VCOs to the proper frequency, and selecting the high or low VCO.  U2500, the receiver IC, contains the 2nd IF/VCO and final processing of the intended signal.  Unlike other designs, the receiver IC presents the recovered audio/data as two digital signals to the SCM where A/D conversion happens (if needed). &lt;br /&gt;
&lt;br /&gt;
There are a couple other chips which present various &lt;br /&gt;
&lt;br /&gt;
UHF R0 was added later and extends the coverage and tuning range of the unit down to 380 MHz.  The preselctor for this covers the whole range as well.  &lt;br /&gt;
&lt;br /&gt;
Each item has more information on it's own page and covers conversions there as well. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! CLD !! FRU P/N !! Range !! Preselector !! Description &lt;br /&gt;
|-&lt;br /&gt;
| TRD6361 || CLD1250 || TLN3250 || VHF R1  || [[VHF Preselector|TFD6511]] || [[VHF Receiver|VHF Receiver 132-154 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TRD6362 || CLD1260 || TLN3251 || VHF R2 || [[VHF Preselector|TFD6512]] || [[VHF Receiver|VHF Receiver 150-174 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CRX4022 || CRX1027 || DLN1215 || UHF R0 || [[UHF Preselector|CRX4001]] || [[UHF R0 Receiver|UHF Receiver 380-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6281 || CLE1190 || TLN3313 || UHF R1 || [[UHF Preselector|TLE5991]] || [[UHF Receiver|UHF Receiver 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6282 || CLE1200 || TLN3314 || UHF R2 || [[UHF Preselector|TLE5992]] || [[UHF Receiver|UHF Receiver 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6283 || CLE1210 || TLN3373 || UHF R3 || [[UHF Preselector|TLE5993]] || [[UHF Receiver|UHF Receiver 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6284 || CLE1220 || TLN3374 || UHF R4 || [[UHF Preselector|TLE5993]] ||[[UHF Receiver|UHF Receiver 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRF6551 || CLF1530 || TLN3315 || 800 || N/A || [[800 MHz Receiver|800 MHz Receiver 806-825 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRF6552 || CLF1540 || TLN3316 || 900 || N/A || [[900 MHz Receiver|900 MHz Receiver 935-941 MHz]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Exciter ===&lt;br /&gt;
&lt;br /&gt;
The exciters contain their own CPU which communicates with the SCM over a SPI bus.  This CPU runs it's own firmware and requires a socketed UV EPROM to upgrade it.  This also controls the PA meeting and the bit of EEPROM in the CPU stores the alignment settings for the exciter and PA.  Generally a Exciter/PA pair will not need to be realigned if moved from one chassis to another, although it should be checked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! CLD !! FRU P/N !! Range !! Description&lt;br /&gt;
|-&lt;br /&gt;
| TLD9831 || CLD1270 || TLN3252 || VHF R1  || [[VHF Exciter|VHF Exciter 132-154 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TLD9832 || CLD1280 || TLN3253 || VHF R2 || [[VHF Exciter|VHF Exciter 150-174 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLX4000 || CLX1000 || DLN1214 || UHF R0 || [[UHF R0 Exciter|UHF Exciter 380-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5971 || CLE1230 || TLN3305 || UHF R1 || [[UHF Exciter|UHF Exciter 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5972 || CLE1240 || TLN3306 || UHF R2 || [[UHF Exciter|UHF Exciter 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5973 || CLE1210 || TLN3375 || UHF R3 || [[UHF Exciter|UHF Exciter 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5974 || CLE1220 || TLN3376 || UHF R4 || [[UHF Exciter|UHF Exciter 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLF6920 || CLF1510 || TLN3307 || 900 || [[800 MHz Exciter|800 MHz Exciter 850-870 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLF6930 || CLF1520 || TLN3308 || 900 || [[900 MHz Exciter|900 MHz Exciter 935-941 MHz]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Station Access Module ===&lt;br /&gt;
[[Station Access Module|Check here for SAM info]]&lt;br /&gt;
&lt;br /&gt;
==== Troof Table ====&lt;br /&gt;
There is a ID code representing the exciter type, it consists of R3700 to R3710.  These are either pull up or down resistors on a 6 bit code and are identified on the schematic on the left side of U3700, the μP.  &lt;br /&gt;
Below is the table in MSB-LSB format, with a 1 being high (5v) and a 0 being a low (0v).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!'''Dip switch'''!&lt;br /&gt;
!'''Band'''!&lt;br /&gt;
!'''Binary'''!&lt;br /&gt;
!'''Notes in the RSS'''!&lt;br /&gt;
|-&lt;br /&gt;
| 0||VHF_R1||000000||&lt;br /&gt;
|-&lt;br /&gt;
| 1||VHF_R2||000001||VHF R2 SL&lt;br /&gt;
|-&lt;br /&gt;
| 2||UHF_R1||000010||&lt;br /&gt;
|-&lt;br /&gt;
| 3||UHF_R2||000011||&lt;br /&gt;
|-&lt;br /&gt;
| 4||800||000100||&lt;br /&gt;
|-&lt;br /&gt;
| 5||VHF_R3||000101||sl&lt;br /&gt;
|-&lt;br /&gt;
| 6||VHF_R4||000110||&lt;br /&gt;
|-&lt;br /&gt;
| 7||VHF_R1||000111||&lt;br /&gt;
|-&lt;br /&gt;
| 8||VHF_R2||001000||VHF R2 FL&lt;br /&gt;
|-&lt;br /&gt;
| 9||VHF_R3||001001||&lt;br /&gt;
|-&lt;br /&gt;
| 10||VHF_R4||001010||&lt;br /&gt;
|-&lt;br /&gt;
| 11||900||001011||&lt;br /&gt;
|-&lt;br /&gt;
| 12||UHF_R3||001100||&lt;br /&gt;
|-&lt;br /&gt;
| 13||UHF_R4||001101||&lt;br /&gt;
|-&lt;br /&gt;
| 14||blank||001110||&lt;br /&gt;
|-&lt;br /&gt;
| 15||blank||001111||&lt;br /&gt;
|-&lt;br /&gt;
| 16||blank||010000||&lt;br /&gt;
|-&lt;br /&gt;
| 17||blank||010001||&lt;br /&gt;
|-&lt;br /&gt;
| 18||blank||010010||&lt;br /&gt;
|-&lt;br /&gt;
| 19||blank||010011||uhf r0 from book&lt;br /&gt;
|-&lt;br /&gt;
| 20||blank||010100||&lt;br /&gt;
|-&lt;br /&gt;
| 21||blank||010101||&lt;br /&gt;
|-&lt;br /&gt;
| 22||blank||010110||&lt;br /&gt;
|-&lt;br /&gt;
| 23||blank||010111||&lt;br /&gt;
|-&lt;br /&gt;
| 24||blank||011000||&lt;br /&gt;
|-&lt;br /&gt;
| 25||blank||011001||&lt;br /&gt;
|-&lt;br /&gt;
| 26||blank||011010||&lt;br /&gt;
|-&lt;br /&gt;
| 27||blank||011011||&lt;br /&gt;
|-&lt;br /&gt;
| 28||blank||011100||&lt;br /&gt;
|-&lt;br /&gt;
| 29||blank||011101||&lt;br /&gt;
|-&lt;br /&gt;
| 30||blank||011110||&lt;br /&gt;
|-&lt;br /&gt;
| 31||blank||011111||&lt;br /&gt;
|-&lt;br /&gt;
| 32||blank||100000||&lt;br /&gt;
|-&lt;br /&gt;
| 33||blank||100001||&lt;br /&gt;
|-&lt;br /&gt;
| 34||blank||100010||&lt;br /&gt;
|-&lt;br /&gt;
| 35||blank||100011||&lt;br /&gt;
|-&lt;br /&gt;
| 36||blank||100100||&lt;br /&gt;
|-&lt;br /&gt;
| 37||blank||100101||boot&lt;br /&gt;
|-&lt;br /&gt;
| 38||blank||100110||&lt;br /&gt;
|-&lt;br /&gt;
| 39||blank||100111||&lt;br /&gt;
|-&lt;br /&gt;
| 40||blank||101000||&lt;br /&gt;
|-&lt;br /&gt;
| 41||blank||101001||&lt;br /&gt;
|-&lt;br /&gt;
| 42||blank||101010||&lt;br /&gt;
|-&lt;br /&gt;
| 43||blank||101011||&lt;br /&gt;
|-&lt;br /&gt;
| 44||blank||101100||&lt;br /&gt;
|-&lt;br /&gt;
| 45||blank||101101||&lt;br /&gt;
|-&lt;br /&gt;
| 46||blank||101110||&lt;br /&gt;
|-&lt;br /&gt;
| 47||blank||101111|| &amp;quot;RSS only&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 48||blank||110000||&lt;br /&gt;
|-&lt;br /&gt;
| 49||blank||110001||&lt;br /&gt;
|-&lt;br /&gt;
| 50||blank||110010||&lt;br /&gt;
|-&lt;br /&gt;
| 51||blank||110011||&lt;br /&gt;
|-&lt;br /&gt;
| 52||blank||110100||RAP says VHF_R2 SL&lt;br /&gt;
|-&lt;br /&gt;
| 53||blank||110101||&lt;br /&gt;
|-&lt;br /&gt;
| 54||blank||110110||&lt;br /&gt;
|-&lt;br /&gt;
| 55||blank||110111||&lt;br /&gt;
|-&lt;br /&gt;
| 56||blank||111000||&lt;br /&gt;
|-&lt;br /&gt;
| 57||blank||111001||&lt;br /&gt;
|-&lt;br /&gt;
| 58||blank||111010||&lt;br /&gt;
|-&lt;br /&gt;
| 59||blank||111011||&lt;br /&gt;
|-&lt;br /&gt;
| 60||blank||111100||&lt;br /&gt;
|-&lt;br /&gt;
| 61||blank||111101||&lt;br /&gt;
|-&lt;br /&gt;
| 62||blank||111110||&lt;br /&gt;
|-&lt;br /&gt;
| 63||INVALID||111111||Exciter is in reset all LED's are on and the PA fans turn on&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[PDR 3500|PDR3500]] ===&lt;br /&gt;
The PDR3500 is a portable version of the repeater.  Here's some details and internal pics of it.&lt;br /&gt;
&lt;br /&gt;
== Power Amp ==&lt;br /&gt;
The power amps are actually a cool design.&lt;br /&gt;
&lt;br /&gt;
Their are two basic power amps, a 25W, and a 100/110/125w (depending on band).  The power amps all use the same general board layout, with the frequency dependent parts separate from the support components.  The 25W PA is a passively cooled unit with a massive heatsink, while the 100/110/125W unit has active cooling with a horizontal heatsink and two cooling fans moving air front to back.&lt;br /&gt;
&lt;br /&gt;
There are a couple different revisions of the PA's so the main PCB has changed a bit over time.  &lt;br /&gt;
&lt;br /&gt;
[[File:125W VHF PA layout.png|400px|thumbnail|left|PCB Layout High Power]]&lt;br /&gt;
&lt;br /&gt;
[[File:25W UHF PA Layout.png|400px|thumbnail|center|PCB Layout Low Power]]&lt;br /&gt;
&lt;br /&gt;
[[|thumbnail|center]]&lt;br /&gt;
&lt;br /&gt;
The PA doesn't contain any CPU, it's controlled via the exciter CPU with basic analog level lines going over to the exciter.&lt;br /&gt;
Some of what's measured by the exciter&lt;br /&gt;
* Intermediate PA drive level - this is the output of the IPA to the final PA pallet&lt;br /&gt;
* Driver PA Level - output of the final PA before the circulator (FPA_DETECT).&lt;br /&gt;
* TX Power Forward - Output measured at the output of the Low Pass Filter&lt;br /&gt;
* TX Power Reverse - Reflected Power from the antenna port&lt;br /&gt;
* OMNI voltage - this is the control voltage on the IPA which comes from the SCM as a 0-5V control signal (V_CONT).  This 0-5v controls a transistor making a 0-14v signal to provide the gain of the IPA.  This is the basis of the power control.  The Control Voltage from the SCM is only present during keydown.&lt;br /&gt;
* IPA Current detect&lt;br /&gt;
* DPA Side A &amp;amp; B current sense&lt;br /&gt;
* Temperature of the PA 3.981v is 79f 2.0 is about 170f This looks like an 8 bit value with 0xFF == 5.000 V or .019608v per bit. &lt;br /&gt;
** PA Fans turn on at 2v and off at 2.90v.  &lt;br /&gt;
* Fan on/off and alarm&lt;br /&gt;
* PA_ID bits A &amp;amp; B - resistor divider that programs to reference voltages in .5v increments to ID the PA hardware to the exciter.&lt;br /&gt;
&lt;br /&gt;
All these are measured over an TDM bus that selects each at a 200ms interval using a single analog input on the exciter CPU.&lt;br /&gt;
&lt;br /&gt;
PA types&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! Other P/N !! Rated Power !! Range !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CLD1295A || || || 120? || VHF? || Unknown&lt;br /&gt;
|- &lt;br /&gt;
| TLD3102 || CLD1299 || 125     || VHF R2 || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| TLD3110 ||  || 25    || VHF R1/R2 || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| TLD3101 ||  TLN3379 CLD1298 || 125    || VHF R1 (NEW) || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| CTX1146 || DLN1216 || 110     || UHF R0  || [[Second Generation PA|Second Generation UHF PA 380-433 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TTE2061 || TLN3444 || 110     || UHF R1 || [[First Generation PA|First Generation UHF PA 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLE6164 || Example || 110 || UHF R1 || [[Second Generation PA|Second Generation UHF PA 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2062 || TLN3446 || 110     || UHF R2 || [[First Generation PA|First Generation UHF PA 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLE6165 || CLE1308 || 110 || UHF R2 || [[Second Generation PA|Second Generation UHF PA 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2063 ||         || 110     || UHF R3 || [[First Generation PA|First Generation UHF PA 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE6373 ||         || 110 || UHF R3 || [[Second Generation PA|Second Generation UHF PA 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2064 ||         || 100     || UHF R4 || [[First Generation PA|First Generation UHF PA 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE6374 ||         || 100 || UHF R4 || [[Second Generation PA|Second Generation UHF PA 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CTF1091A/TLF1930 || TLN3442 || 100 || 800 || [[800 MHz 100W PA| 800 MHz 100W PA]]&lt;br /&gt;
|-&lt;br /&gt;
| CTF1092A/TLF1800 || TLN3299 || 100 || 900 || [[900 MHz 100W PA| 900 MHz 100W PA]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PA Type !! PA_ID_A !! PA_ID_B !! R4162 !! R4163 !! R4164 !! R4165 !! Official?&lt;br /&gt;
|-&lt;br /&gt;
| 900 100W || 3.0 || .5 || 20.5k || 10k || 1k || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| 800 100W || 0.5 || 1.0 || OPEN || 0 || 1.5K || 15K || YES&lt;br /&gt;
|-&lt;br /&gt;
| 800 20W || 0.0 || 1.0 || OPEN || 1k || 1.5K || 15K || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R0 || 0.0 || 1.5 || OPEN || 0 || 390 || 1k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R1 || 1.0 || 0.5 || 15k || 1.5k || 560 || 10k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R2 || 1.5 || 0.5 || 1k || 390 || 100 || 1k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R3 || 3.0 || 1.0 || 2.2k || 2.7k || 1.5k || 15k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 100W R4 || 3.5 || 1.0 || 18k || 15k || 1.5k || 15k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 25W R1 || 5.0 || 0.0 || 33.2k || OPEN || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 25W R2 || 0.0 || 0.5 || OPEN || 0 || 1k  || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 125W R1 || 3.0 || 0.0 || 20.5k || 10k || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 125W R2 || 0.0 || 0.0  || OPEN || 0 || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 25W R1/R2 || 4.5  || 0.0 || 12k || 68k || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 25W R1 || 3.5 || 0.0 ||  || ||  || NO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UHF 110W Generation 1 &lt;br /&gt;
UHF 110W Generation 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CTF1091A 100 W 800 MHz&lt;br /&gt;
CTF1092A 100 W 900 MHz&lt;br /&gt;
CTX1146A Range 0 Power Amplifier&lt;br /&gt;
TLF1800B 100W Power Amplifier Module&lt;br /&gt;
TLF1930C 100W Power Amplifier Module&lt;br /&gt;
TLF1940B 20W Power Amplifier Module&lt;br /&gt;
TTE2061A 110W Power Amplifier UHF R1&lt;br /&gt;
TTE2062A 110W Power Amplifier UHF R2&lt;br /&gt;
TTE2063A 110W Power Amplifier UHF R3&lt;br /&gt;
TTE2064A 110W Power Amplifier UHF R4&lt;br /&gt;
&lt;br /&gt;
TLE2511A/ 110W Power Amplifier Module&lt;br /&gt;
TLE2512A&lt;br /&gt;
TLE2521&lt;br /&gt;
TLE2572&lt;br /&gt;
TLE2731B 25W Power Amplifier Module UHF R1&lt;br /&gt;
TLE2732B 25W Power Amplifier Module UHF R2&lt;br /&gt;
TLD3101G 125W Power Amplifier Module VHF R1&lt;br /&gt;
TLD3102G 125W Power Amplifier Module VHF R2&lt;br /&gt;
TLD3110C 25W Power Amplifier Module VHF R1/R2&lt;br /&gt;
CLX4002A 100/110W Power Amplifier Module (UHF; R1-R4)&lt;br /&gt;
CLE6164A 100/110W Power Amplifier CLE6165A Module (UHF; R1-R4)&lt;br /&gt;
&lt;br /&gt;
TTE6373A/ 100/110W Power Amplifier&lt;br /&gt;
TTE6374A Module (UHF; R1-R4)&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting notes ===&lt;br /&gt;
&lt;br /&gt;
Most of the time the PA's are rock solid.   I have some notes below on trouble shooting them.&lt;br /&gt;
&lt;br /&gt;
* swap with a known good PA, does the problem go away?&lt;br /&gt;
* Align the PA/init the PA&lt;br /&gt;
* Check the amp draw on both sides&lt;br /&gt;
* Always run it at 100% rated power for testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''Silly PA syndrome''' ====&lt;br /&gt;
Some times people run the PA at lower output to &amp;quot;make it easier on it&amp;quot;.  So long as cooling is working, running it at rated output is the least stressful way to operate it.  Running at reduced power output is actually harder on the PA.  &lt;br /&gt;
&lt;br /&gt;
The PA has an intermediate stage and a final amp stage.  The final amp runs at the same gain level all the time.  The power out is changed by varying the IPA voltage.  As this is done via a linear regulator, as the power output goes down, there is more and more power dissipated in the Q4100 (UHF) pass transistor.  This is due to running the IPA at lower and lower voltage to drop the power to the final.  Typically what happens is a station will key up, then fail and try to fall back in power, but this just makes it worse. &lt;br /&gt;
&lt;br /&gt;
What I've done to test this:&lt;br /&gt;
* Run the PA at 120% (ie 150w output) just for a bit.  ie init it and align it for 110w = 130W.  &lt;br /&gt;
* Test the station, key it down and check that it's solid for 2-3 min.  &lt;br /&gt;
* check the value of the OMNI Voltage in the station metering. &lt;br /&gt;
&lt;br /&gt;
If this is good, replace the Q4100, and check the operation of the power control circuits (q4101, V_CONT, VOMNI).  &lt;br /&gt;
&lt;br /&gt;
This normally fixes it.  &lt;br /&gt;
&lt;br /&gt;
[[Category:Quantar]]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Quantar_Serial_Commands&amp;diff=8412</id>
		<title>Quantar Serial Commands</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Quantar_Serial_Commands&amp;diff=8412"/>
		<updated>2025-12-25T19:36:59Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Quantar]]&lt;br /&gt;
The Quantar serial port on all but the trunking versions supports the following commands.  Some of these commands are obvious, some are not.  This all uses stardard ASCII terminal at 9600 bps 8N1.&lt;br /&gt;
&lt;br /&gt;
By default when connecting the WINRSS to the station it sets echo off, so you will need to reboot or turn it on to see the responses from the quantar.&lt;br /&gt;
&lt;br /&gt;
= Offical Docs =&lt;br /&gt;
&lt;br /&gt;
Motorola exposed some of these via an offical document in the instruction manual.  This should open to Page 470 which is the 68P81131E57 Serial Interface Spec Manual&lt;br /&gt;
[{{filepath:Motorola Quantar Instruction Manual.pdf}}#page=470 Motorola Quantar Instruction Manual 68P81095E05-B with updates]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Commands =&lt;br /&gt;
&lt;br /&gt;
These are very Javay. Any insights here are just reverse engineered, and could be wrong.  Update this page if something is wrong. &lt;br /&gt;
&lt;br /&gt;
== Rules for commands == &lt;br /&gt;
Commands below are listed as to what prompt you need to be at to execute them. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ASCII_CMDS_RULES_TABLE = { &lt;br /&gt;
{ new Integer(21002), &amp;quot;DOCSS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(25001), &amp;quot;DODEBUG&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(21003), &amp;quot;EXIT&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21020), &amp;quot;GET ADDR IP&amp;quot;, &amp;quot;IP ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21021), &amp;quot;GET ADDR PHYS&amp;quot;, &amp;quot;PHYS ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21022), &amp;quot;SET ADDR IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21023), &amp;quot;SET ADDR PHYS [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21024), &amp;quot;RESTART&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21025), &amp;quot; GET ADDR NETMASK&amp;quot;, &amp;quot;SUBNET MASK = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21026), &amp;quot; GET ADDR GATEWAY&amp;quot;, &amp;quot;DEF GATEWAY = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21027), &amp;quot;SET ADDR NETMASK [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21028), &amp;quot;SET ADDR GATEWAY [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21029), &amp;quot;GET BOX NUM&amp;quot;, &amp;quot;BOX NUMBER = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21030), &amp;quot;SET BOX NUM [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21031), &amp;quot;SET ECHO OFF&amp;quot;, &amp;quot;echo is off&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21032), &amp;quot;SET ECHO ON&amp;quot;, &amp;quot;echo is on&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21033), &amp;quot;GET BOX APP&amp;quot;, &amp;quot;BOX APPLICATION = [%s]&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21006), &amp;quot;DORSS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21007), &amp;quot;EXIT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21016), &amp;quot;DOLS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21017), &amp;quot;EXIT&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21162), &amp;quot;GET HW_VER &amp;quot;, &amp;quot;HW_VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21150), &amp;quot;GET BPN &amp;quot;, &amp;quot;BPN = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21151), &amp;quot;GET STN NAME &amp;quot;, &amp;quot;STN NAME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21152), &amp;quot;GET STN SN &amp;quot;, &amp;quot;STN SN  = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21153), &amp;quot;GET TIME &amp;quot;, &amp;quot; TIME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21154), “c”, &amp;quot; FW_VER SC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21155), &amp;quot;GET FW_VER EX&amp;quot;, &amp;quot; FW_VER EX = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21156), &amp;quot;GET FW_VER WL&amp;quot;, &amp;quot; FW_VER WL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21157), &amp;quot;GET CP VER&amp;quot;, &amp;quot; CP VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21158), &amp;quot;ALARM RD&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21163), &amp;quot;ALARM RD [%s]&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21159), &amp;quot; ALARM_EXT RD&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21160), &amp;quot; ALARM CLEAR&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21161), &amp;quot; ALARM_EXT CLEAR&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21300), &amp;quot;GET TIME&amp;quot;, &amp;quot; TIME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21250), &amp;quot;GET RX FREQ&amp;quot;, &amp;quot; RX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21251), &amp;quot;GET RX2 FREQ&amp;quot;, &amp;quot; RX2_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21252), &amp;quot;GET DSP BER [%s] [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot; BER [%s] = [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21253), &amp;quot;GET DSP RSSI [%s] [%s] [%s]&amp;quot;, &amp;quot; RSSI = [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21301), &amp;quot;SET DATE [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21302), &amp;quot;SET TIME [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21200), &amp;quot;FPM&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21201), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21550), &amp;quot;MTR WL_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21551), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21552), &amp;quot;MTR TX_PA_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21553), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21554), &amp;quot;MTR RX_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21555), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21563), &amp;quot;MTR RX2_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21564), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21556), &amp;quot;MTR PS_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21557), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21558), &amp;quot;MTR UHSO&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21559), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21562), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21350), &amp;quot; FP ACC_DIS ON&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21351), &amp;quot; FP ACC_DIS OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21352), &amp;quot; RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21353), &amp;quot; GET PA ON&amp;quot;, &amp;quot;PA ON = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21400), &amp;quot; GET PS EQUAL&amp;quot;, &amp;quot;PS EQUAL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21401), &amp;quot; SET PS EQUAL OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21402), &amp;quot; SET PS EQUAL ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21403), &amp;quot;GET PS BATT_TYPE&amp;quot;, &amp;quot;PS_BATT_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21450), &amp;quot; GET RX FREQ&amp;quot;, &amp;quot;RX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21454), &amp;quot; GET RX2 FREQ&amp;quot;, &amp;quot;RX2_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21451), &amp;quot; AL RSSI [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21452), &amp;quot; SET CHN CUR [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21453), &amp;quot; GET CHN CUR&amp;quot;, &amp;quot;CHN CUR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22001), &amp;quot; AL SQ RD&amp;quot;, &amp;quot;SQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22004), &amp;quot; GET WL SQL&amp;quot;, &amp;quot;WL SQL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22006), &amp;quot; AL SQ DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22007), &amp;quot; AL SQ UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22008), &amp;quot; AL SQ WR 127&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22005), &amp;quot; AL SQ WR 0&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22009), &amp;quot; SET WL SQL NORMAL&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22010), &amp;quot; SET WL SQL CSQ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22011), &amp;quot; AL SQ SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21600), &amp;quot; GET TX FREQ&amp;quot;, &amp;quot;TX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21601), &amp;quot; AL STNPWR RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21602), &amp;quot; SET TX PWR [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21603), &amp;quot; KEYUP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21604), &amp;quot; AL STNPWR WR [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21605), &amp;quot; AL STNPWR SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21606), &amp;quot; DEKEY&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21607), &amp;quot; SET FREQ TX [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21608), &amp;quot; SET FREQ TX 0&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21610), &amp;quot; AL PEND RD&amp;quot;, &amp;quot;PEND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21611), &amp;quot; AL PEND NOREF&amp;quot;, &amp;quot;TXFREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21612), &amp;quot; AL PEND STATUS&amp;quot;, &amp;quot;PEND [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21613), &amp;quot; AL PEND DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21614), &amp;quot; AL PEND UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21615), &amp;quot; AL PEND AUTO&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21616), &amp;quot; AL PEND SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21617), &amp;quot; SET REF [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21618), &amp;quot; SET REF INT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21619), &amp;quot; SET REF 5MHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21620), &amp;quot; SET REF 10MHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21621), &amp;quot; SET REF EXT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21622), &amp;quot; AL PEND ABORT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21623), &amp;quot; AL UHSO RD&amp;quot;, &amp;quot;UHSO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21624), &amp;quot; AL UHSO DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21625), &amp;quot; AL UHSO UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21626), &amp;quot; AL UHSO WARM&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21627), &amp;quot; AL UHSO SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21630), &amp;quot; GET ADDR ISV&amp;quot;, &amp;quot;ISV MULTICAST ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21631), &amp;quot; GET ADDR SCM&amp;quot;, &amp;quot;STN CTRL MULTICAST ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21632), &amp;quot; SET ADDR ISV [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21633), &amp;quot; SET ADDR SCM [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(20209), &amp;quot;GET STN SYS&amp;quot;, &amp;quot;STN SYS = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21008), &amp;quot;DORAP&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21009), &amp;quot;EXIT&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(25001), &amp;quot;DODEBUG&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(25002), &amp;quot;EXIT&amp;quot;, null, &amp;quot;DEBUG&amp;gt;&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(20210), &amp;quot;GET FP VER&amp;quot;, &amp;quot;FP VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21202), &amp;quot;FP SET IR_RPTR ENABLE&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21203), &amp;quot;FP SET IR_RPTR DISABLE&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21204), &amp;quot;FP ACC_DIS ON&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21205), &amp;quot;FP ACC_DIS OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21207), &amp;quot;RC SET PTT XMIT&amp;quot;, &amp;quot;  &amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21206), &amp;quot;RC SET PTT OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21560), &amp;quot;RC SET PA TEST ON&amp;quot;, &amp;quot;  &amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21561), &amp;quot;RC SET PA TEST OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21565), &amp;quot;GET PA TEST&amp;quot;, &amp;quot;PA TEST = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21510), &amp;quot; GET CP ISV&amp;quot;, &amp;quot;CP ISV = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21502), &amp;quot; GET CP SIZE&amp;quot;, &amp;quot;CP SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21511), &amp;quot; NEW CP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21512), &amp;quot; NEW WC [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21503), &amp;quot; GET MCS SIZE&amp;quot;, &amp;quot;MCS SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21504), &amp;quot; GET WC SIZE&amp;quot;, &amp;quot;WC SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21505), &amp;quot; GET FW_VER BOOT.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21506), &amp;quot; GET FW_VER BOOT2.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21507), &amp;quot; GET BPN&amp;quot;, &amp;quot;BPN = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21508), &amp;quot; GET ADDR IP&amp;quot;, &amp;quot;IP ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21509), &amp;quot; GET ADDR PHYS&amp;quot;, &amp;quot;PHYS ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21500), &amp;quot; RD CP [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21501), &amp;quot; RD WC [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21513), &amp;quot; WR CP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21514), &amp;quot; WR WC [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21515), &amp;quot; MOVE CP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21516), &amp;quot; MOVE CP_XL [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21521), &amp;quot; MOVE WC_XL [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21517), &amp;quot; MOVE WC&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21518), &amp;quot; RESET SITE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21519), &amp;quot; STOP CP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21520), &amp;quot; STOP WC&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21700), &amp;quot; GET MGR1 IP&amp;quot;, &amp;quot;IP MGR1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21701), &amp;quot; GET MGR2 IP&amp;quot;, &amp;quot;IP MGR2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21702), &amp;quot;SET MGR1 IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21703), &amp;quot;SET MGR2 IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21704), &amp;quot; SET ADDR IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21705), &amp;quot; SET ADDR PHYS [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21800), &amp;quot; AL REFMOD UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21802), &amp;quot; AL REFMOD DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21801), &amp;quot; AL REFMOD RD&amp;quot;, &amp;quot;REFMOD = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21803), &amp;quot; AL REFMOD F5&amp;quot;, &amp;quot;VCO1FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21804), &amp;quot; AL REFMOD F6&amp;quot;, &amp;quot;VCO2FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21805), &amp;quot; AL REFMOD SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21806), &amp;quot; SET TEST_TONE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21807), &amp;quot; SET EEP REFMOD -1&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21752), &amp;quot; AL TXDEV GO F1&amp;quot;, &amp;quot;TX1FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21753), &amp;quot; AL TXDEV GO F2&amp;quot;, &amp;quot;TX2FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21754), &amp;quot; AL TXDEV GO F3&amp;quot;, &amp;quot;TX3FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21755), &amp;quot; AL TXDEV GO F4&amp;quot;, &amp;quot;TX4FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21758), &amp;quot; SET EEP TXDEV -1&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21750), &amp;quot; AL TXDEV RD&amp;quot;, &amp;quot; TXDEV = [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21751), &amp;quot; AL TXDEV WR [%s] [%s] [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21760), &amp;quot; AL TXDEV SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21850), &amp;quot; GET ASTRO_TONE&amp;quot;, &amp;quot; ASTRO_TONE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21851), &amp;quot; SET ASTRO_TONE [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21852), &amp;quot; SET ASTRO_TONE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21853), &amp;quot; GET V52&amp;quot;, &amp;quot; V52 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21854), &amp;quot; SET V52 ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21855), &amp;quot; SET V52 OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21902), &amp;quot; GET FW_VER SC.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21903), &amp;quot; GET FW_VER WL.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21950), &amp;quot; GET STATE PASS&amp;quot;, &amp;quot;STATE PASS = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21951), &amp;quot; SETPASS [%s] [%s] [%s]&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(22000), &amp;quot; GET REF_CAL&amp;quot;, &amp;quot;REF_CAL = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22001), &amp;quot;SET REF_CAL [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22002), &amp;quot;SET REF_CAL_SAVE&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22003), &amp;quot;SET REF_CAL_ABORT &amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21033), &amp;quot;GET BOX APP&amp;quot;, &amp;quot;BOX APPLICATION = [%s]&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22060), &amp;quot;AL RXWL C1 RD 1KHZ&amp;quot;, &amp;quot;1KHZ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22061), &amp;quot;AL RXWL C2 RD 1KHZ&amp;quot;, &amp;quot;1KHZ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22062), &amp;quot;AL RXWL C1 RD LB&amp;quot;, &amp;quot;LB = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22063), &amp;quot;AL RXWL C1 RD HB&amp;quot;, &amp;quot;HB = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22064), &amp;quot;AL RXWL C1 RD HBF&amp;quot;, &amp;quot;HBF = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22065), &amp;quot;AL RXWL C1 RD ST&amp;quot;, &amp;quot;ST = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22066), &amp;quot;SET TEST_TONE WL C1 1KHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22067), &amp;quot;SET TEST_TONE WL C2 1KHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22068), &amp;quot;SET TEST_TONE WL C1 LB&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22069), &amp;quot;SET TEST_TONE WL C1 HB&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22070), &amp;quot;SET TEST_TONE WL C1 ST&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22071), &amp;quot;AL RXWL C1 WR 1KHZ [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22072), &amp;quot;AL RXWL C2 WR 1KHZ [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22073), &amp;quot;AL RXWL C1 WR LB [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22074), &amp;quot;AL RXWL C1 WR HB [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22075), &amp;quot;AL RXWL C1 WR HBF [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22076), &amp;quot;AL RXWL C1 WR ST [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22077), &amp;quot;AL RXWL C1 SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22078), &amp;quot;AL RXWL C2 SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22079), &amp;quot;AL RXWL C1 RD AT&amp;quot;, &amp;quot;AT = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22080), &amp;quot;AL RXWL C1 WR AT [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22120), &amp;quot;AL LTO RD&amp;quot;, &amp;quot;LTO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22121), &amp;quot;AL LTO WR  [%s]&amp;quot;, &amp;quot;LTO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22122), &amp;quot;AL LTO TEST_OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22123), &amp;quot;AL LTO TEST_ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22124), &amp;quot;AL LTO SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22125), &amp;quot;AL LTO RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22050), &amp;quot; GET FW_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22053), &amp;quot; GET OC_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22051), &amp;quot; CHECK ID [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22052), &amp;quot; SWDL [%s] [%s] SLIP [%s]&amp;quot;, &amp;quot;FLASH ME [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21275), &amp;quot;GET RX FREQ_BAND&amp;quot;, &amp;quot; RX_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21276), &amp;quot;GET RX2 FREQ_BAND&amp;quot;, &amp;quot; RX2_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21278), &amp;quot;GET RX TYPE&amp;quot;, &amp;quot; RX_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21279), &amp;quot;GET PA TYPE&amp;quot;, &amp;quot; PA_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21280), &amp;quot;GET PA ORD_PWR&amp;quot;, &amp;quot; PA_ORD_PWR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21281), &amp;quot;GET TX COMPA&amp;quot;, &amp;quot; TX_COMPA = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21282), &amp;quot;GET WL PORT_STAT&amp;quot;, &amp;quot; WL_PORT_STAT = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21283), &amp;quot;GET PS RATED_PWR&amp;quot;, &amp;quot; PS_RATED_PWR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21284), &amp;quot;GET PS BATT_TYPE&amp;quot;, &amp;quot; PS_BATT_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21285), &amp;quot;GET REF_TYPE&amp;quot;, &amp;quot; REF_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21277), &amp;quot;GET TX FREQ_BAND&amp;quot;, &amp;quot; TX_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22201), &amp;quot;AL TXWL RD_REF C1 5&amp;quot;, &amp;quot;C1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22202), &amp;quot;AL TXWL RD_REF C2 5&amp;quot;, &amp;quot;C2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22203), &amp;quot;AL TXWL WR_REF C1 [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22204), &amp;quot;AL TXWL WR_REF C2 [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22205), &amp;quot;AL TXWL KEYUP 10&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22206), &amp;quot;AL TXWL DEKEY&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22207), &amp;quot;AL TXWL GO C1 5&amp;quot;, &amp;quot;TXWL DONE&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22208), &amp;quot;AL TXWL GO C2 5&amp;quot;, &amp;quot;TXWL DONE&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22050), &amp;quot; GET FW_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22051), &amp;quot; CHECK ID [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22052), &amp;quot; SWDL [%s] [%s] SLIP [%s]&amp;quot;, &amp;quot;FLASH ME [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22250), &amp;quot; GET STATION_STATUS 4&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22253), &amp;quot; GET STATION_STATUS 3&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22251), &amp;quot; SET STATION_DISABLE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22252), &amp;quot; SET STATION_DISABLE ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21522), &amp;quot; RD MCS [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21523), &amp;quot; CLEAR MCS&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; },&lt;br /&gt;
{ new Integer(21475), &amp;quot; AL TDATA GO&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21476), &amp;quot; SET TDATA ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21477), &amp;quot; SET TDATA OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(20211), &amp;quot;FP SQ [%s]&amp;quot;, &amp;quot; SQ = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20219), &amp;quot;FP CHN [%s]&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20214), &amp;quot;FP INTCOM ON&amp;quot;, &amp;quot; INTCOM = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20215), &amp;quot;FP INTCOM OFF&amp;quot;, &amp;quot; INTCOM = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20216), &amp;quot;FP SPKRVOL [%s]&amp;quot;, &amp;quot; SPKRVOL = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20217), &amp;quot;FP SPKRVOL [%s]&amp;quot;, &amp;quot; SPKRVOL = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20218), &amp;quot;GET CHN MAX&amp;quot;, &amp;quot; CHN MAX = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22300), &amp;quot;SET SC_FAN ON&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22301), &amp;quot;SET SC_FAN AUTO&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22350), &amp;quot;GET OC NUM&amp;quot;, &amp;quot;OC NUM = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22351), &amp;quot;GET OC [%s] SW VER&amp;quot;, &amp;quot; OC [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22352), &amp;quot;GET OC [%s] SW PART&amp;quot;, &amp;quot;OC [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22353), &amp;quot;GET OC [%s] SW VER OC&amp;quot;, &amp;quot;OC [%s] SW VER OC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22354), &amp;quot;GET OC [%s] SW PART OC&amp;quot;, &amp;quot;OC [%s] SW PART OC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22355), &amp;quot;GET OC [%s] SW VER B1&amp;quot;, &amp;quot;OC [%s] SW VER B1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22356), &amp;quot;GET OC [%s] SW VER B2&amp;quot;, &amp;quot;OC [%s] SW VER B2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22357), &amp;quot;GET OC [%s] SW PART B1&amp;quot;, &amp;quot;OC [%s] SW PART B1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22358), &amp;quot;GET OC [%s] SW PART B2&amp;quot;, &amp;quot;OC [%s] SW PART B2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22359), &amp;quot;GET OC [%s] WL [%s] SW VER WL&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22360), &amp;quot;GET OC [%s] WL [%s] SW VER&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22364), &amp;quot;GET OC [%s] WL [%s] SW PART WB&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22363), &amp;quot;GET OC [%s] WL [%s] SW VER WB&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22361), &amp;quot;GET OC [%s] WL [%s] SW PART WL&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22362), &amp;quot;GET OC [%s] WL [%s] SW PART&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22450), &amp;quot;GET CM_MODE&amp;quot;, &amp;quot;CM_MODE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22451), &amp;quot;GET CM_NUM&amp;quot;, &amp;quot;CM_NUM = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22452), &amp;quot;GET LD&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22453), &amp;quot;LCM ON&amp;quot;, &amp;quot;LCM ON&amp;quot;, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22454), &amp;quot;LCM OFF&amp;quot;, &amp;quot;LCM OFF&amp;quot;, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22455), &amp;quot;FVP [%s] ON&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22456), &amp;quot;FVP [%s] OFF&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22457), &amp;quot;VDP [%s] ON&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22458), &amp;quot;VDP [%s] OFF&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21018), &amp;quot;LIST_ALL_ALERTS&amp;quot;, null, &amp;quot;DEBUG&amp;gt;&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(22500), &amp;quot;&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; } };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==RW commands table ==&lt;br /&gt;
These commands are for reading and writing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
READ_WRITE_CMDS_RULES_TABLE = { &lt;br /&gt;
{ new Integer(2), { &amp;quot;closeport&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21001) },&lt;br /&gt;
{ new Integer(1), { &amp;quot;openport&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21000) }, &lt;br /&gt;
{ new Integer(3), { &amp;quot;hardwareVersion&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21162) }, &lt;br /&gt;
{ new Integer(6), { &amp;quot;CPVersion&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21157) },&lt;br /&gt;
{ new Integer(7), { &amp;quot;CPSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21502) }, &lt;br /&gt;
{ new Integer(8), { &amp;quot;MCSSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21503) }, &lt;br /&gt;
{ new Integer(9), { &amp;quot;WCSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21504) }, &lt;br /&gt;
{ new Integer(10), { &amp;quot;FWVerSc&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21154) }, &lt;br /&gt;
{ new Integer(11), { &amp;quot;FWVerBoot1&amp;quot;, &amp;quot;Boot1Date&amp;quot;, &amp;quot;Boot1Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21505) }, &lt;br /&gt;
{ new Integer(12), { &amp;quot;FWVerBoot2&amp;quot;, &amp;quot;Boot2Date&amp;quot;, &amp;quot;Boot2Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21506) }, &lt;br /&gt;
{ new Integer(13), { &amp;quot;FWVerWl&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21156) }, &lt;br /&gt;
{ new Integer(14), { &amp;quot;Bpn&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21507) }, &lt;br /&gt;
{ new Integer(15), { &amp;quot;AddrIp&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21508) }, &lt;br /&gt;
{ new Integer(16), { &amp;quot;AddrPhys&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21509) }, &lt;br /&gt;
{ new Integer(5), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21501) }, &lt;br /&gt;
{ new Integer(4), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21500) }, &lt;br /&gt;
{ new Integer(17), { &amp;quot;date&amp;quot;, &amp;quot;time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21510) }, &lt;br /&gt;
{ new Integer(18), { &amp;quot;cpSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21511) }, &lt;br /&gt;
{ new Integer(19), { &amp;quot;wcSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21512) }, &lt;br /&gt;
{ new Integer(20), { &amp;quot;SRecord&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21513) }, &lt;br /&gt;
{ new Integer(21), { &amp;quot;SRecord&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21514) }, &lt;br /&gt;
{ new Integer(22), { &amp;quot;Date&amp;quot;, &amp;quot;Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21516) }, &lt;br /&gt;
{ new Integer(24), null, null, new Integer(21515) }, &lt;br /&gt;
{ new Integer(23), { &amp;quot;Date&amp;quot;, &amp;quot;Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21521) }, &lt;br /&gt;
{ new Integer(25), null, null, new Integer(21517) }, &lt;br /&gt;
{ new Integer(26), null, null, new Integer(21519) }, &lt;br /&gt;
{ new Integer(27), null, null, new Integer(21520) }, &lt;br /&gt;
{ new Integer(28), null, null, new Integer(21518) }, &lt;br /&gt;
{ new Integer(29), null, null, new Integer(21352) }, &lt;br /&gt;
{ new Integer(31), null, null, new Integer(21007) }, &lt;br /&gt;
{ new Integer(30), { &amp;quot;SerialNo&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21152) }, &lt;br /&gt;
{ new Integer(32), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21522) }, &lt;br /&gt;
{ new Integer(33), { &amp;quot;FWVerEx&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21155) }, &lt;br /&gt;
{ new Integer(34), null, null, new Integer(21523) }, &lt;br /&gt;
{ new Integer(35), { &amp;quot;dateAndTime&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21300) }, &lt;br /&gt;
{ new Integer(21005), null, null, new Integer(21005) }, &lt;br /&gt;
{ new Integer(36), null, null, new Integer(21011) }, &lt;br /&gt;
{ new Integer(37), null, null, new Integer(21012) }, &lt;br /&gt;
{ new Integer(38), null, null, new Integer(21013) }, &lt;br /&gt;
{ new Integer(39), null, null, new Integer(21014) }, &lt;br /&gt;
{ new Integer(40), null, null, new Integer(21015) } };&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RSS: GET ADDR PHYS                                                              &lt;br /&gt;
PHYS ADDR = 08003ecec448                                                        &lt;br /&gt;
RSS: get rx_freq                                                                &lt;br /&gt;
?(0017) invalid option                                                          &lt;br /&gt;
RSS: GET RX FREQ                                                                &lt;br /&gt;
RX_FREQ = 430975000                                                             &lt;br /&gt;
RSS: GET TX FREQ                                                                &lt;br /&gt;
TX_FREQ = 469975000                                                             &lt;br /&gt;
RSS: AL TXDEV RD                                                                &lt;br /&gt;
TXDEV = 6470 6880 5240 5620                                                     &lt;br /&gt;
RSS: AL TXDEV GO F2                                                             &lt;br /&gt;
TX2FREQ = 453975000                                                             &lt;br /&gt;
RSS: AL TX DEV WR 6470 6880 5240 5620                                           &lt;br /&gt;
?(0014) invalid command                                                         &lt;br /&gt;
RSS: AL TXDEV WR 6470 6880 5240 5620                                            &lt;br /&gt;
RSS: AL TXDEV SAVE                     &lt;br /&gt;
&lt;br /&gt;
AL TXDEV GO F2 &lt;br /&gt;
SET FREQ TX 444000000&lt;br /&gt;
AL TXDEV WR 6470 2000 5240 5620&lt;br /&gt;
&lt;br /&gt;
DORSS&lt;br /&gt;
KEYUP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 224028000&lt;br /&gt;
SET FREQ TX 444005000&lt;br /&gt;
SET FREQ TX 444010000&lt;br /&gt;
SET FREQ TX 444015000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444020000&lt;br /&gt;
SET FREQ TX 444025000&lt;br /&gt;
SET FREQ TX 444030000&lt;br /&gt;
SET FREQ TX 444035000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444040000&lt;br /&gt;
SET FREQ TX 444045000&lt;br /&gt;
SET FREQ TX 444050000&lt;br /&gt;
SET FREQ TX 444055000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444060000&lt;br /&gt;
SET FREQ TX 444065000&lt;br /&gt;
SET FREQ TX 444070000&lt;br /&gt;
SET FREQ TX 444075000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444080000&lt;br /&gt;
SET FREQ TX 444085000&lt;br /&gt;
SET FREQ TX 444090000&lt;br /&gt;
SET FREQ TX 444095000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444100000&lt;br /&gt;
DEKEY&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 454000000&lt;br /&gt;
SET FREQ TX 454005000&lt;br /&gt;
SET FREQ TX 454010000&lt;br /&gt;
SET FREQ TX 454015000&lt;br /&gt;
SET FREQ TX 454020000&lt;br /&gt;
SET FREQ TX 454025000&lt;br /&gt;
SET FREQ TX 454030000&lt;br /&gt;
SET FREQ TX 454035000&lt;br /&gt;
SET FREQ TX 454040000&lt;br /&gt;
SET FREQ TX 454045000&lt;br /&gt;
SET FREQ TX 454050000&lt;br /&gt;
SET FREQ TX 454055000&lt;br /&gt;
SET FREQ TX 454060000&lt;br /&gt;
SET FREQ TX 454065000&lt;br /&gt;
SET FREQ TX 454070000&lt;br /&gt;
SET FREQ TX 454075000&lt;br /&gt;
SET FREQ TX 454080000&lt;br /&gt;
SET FREQ TX 454085000&lt;br /&gt;
SET FREQ TX 454090000&lt;br /&gt;
SET FREQ TX 454095000&lt;br /&gt;
SET FREQ TX 45410000S&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]-O dodbs&lt;br /&gt;
&lt;br /&gt;
DBS Console Task started.  Press &amp;lt;CR&amp;gt; to exit:&lt;br /&gt;
&lt;br /&gt;
]-O dobt&lt;br /&gt;
PB17 Not GNDed or BT Task Not Active ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]-O&lt;br /&gt;
]-O DOASYNC&lt;br /&gt;
?(0088) DOASYNC Error! Not an IR station&lt;br /&gt;
&lt;br /&gt;
DORSS&lt;br /&gt;
get chn cur&lt;br /&gt;
7&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Quantar&amp;diff=8411</id>
		<title>Quantar</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Quantar&amp;diff=8411"/>
		<updated>2025-12-25T19:26:31Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Manuals */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quantar/Quantro info ==&lt;br /&gt;
&lt;br /&gt;
There is a bunch of info here about the technical aspects of the Quantar Stations. &lt;br /&gt;
&lt;br /&gt;
The info on the modification and changing ranges of the various modules is on the respective pages.  There is some conversion info below, but it's being migrated and reformatted under the respective pages.  I feel this is more logical.&lt;br /&gt;
&lt;br /&gt;
If you find anything to be wrong here, please feel free to make an account and change it.  I've had to lock down account creation, so you'll need to have it approved.  If you want to email me directly, my email is [mailto:bryan@bryanfields.net bryan@bryanfields.net]&lt;br /&gt;
&lt;br /&gt;
=== Specifications ===&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar Specifications VHF, UHF, 800 MHz.pdf|Quantar Specifications VHF, UHF, 800 MHz]] - This is the combined spec sheet for the VHF/UHF and 800 base stations.&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar Data Base Sation Specification Sheet 800 900 MHz.pdf|Quantar Data Base Station Specification Sheet 800 900 MHz]]&lt;br /&gt;
&lt;br /&gt;
[[Media:ASTRO TAC QUANTAR receiver manual.pdf|ASTRO TAC QUANTAR receiver manual]]&lt;br /&gt;
&lt;br /&gt;
=== Programming ===&lt;br /&gt;
&lt;br /&gt;
Links to programming stuff&lt;br /&gt;
&lt;br /&gt;
[[media:CSS_007.13.R022.00.035_12-04.exe|CSS 007.13.R022.0035 for EPIC4 Smart Zone SCM]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS_R14.08.01.zip|WinRSS 14.08.01 Windows RSS]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar WinRSS R14.10.00 release July 15 2011.zip|WinRSS 14.10.00 release July 15 2011.zip]] &lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS R14.11.00.zip| WinRSS 14.11.00]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS R14.12.00.zip| WinRSS R14.12.00]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS_R14.13.00.zip|WinRSS 14.13.00 April 2015]] Current Winrss - narrowband only.  Use the rsscore.dll from 14.12.00 will re-enable wideband. Or just run 14.12.00.&lt;br /&gt;
&lt;br /&gt;
[[Media:DIU CSS Installation.zip|DIU3000 CPS/CSS software 8.00.18 30-APR-2005]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Firmware ====&lt;br /&gt;
&lt;br /&gt;
The newer SCM modules can be upgraded via SLIP connection over the tty port, or via IP over the 10Base2 connector (anyone have a hub?).&lt;br /&gt;
&lt;br /&gt;
The Wireline typically will upgrade during this too, unless it has the older EPROM memory.  At that point you'll have to swap the chips.&lt;br /&gt;
&lt;br /&gt;
The exciter is still a hard chip swap upgrade, but programed EPROM's are $20 shipped on eBay.  Unless you have more than a few to upgrade it's not cost effective to buy the programer and chips yourself.&lt;br /&gt;
&lt;br /&gt;
:: [[Media:Quantar Conventional Firmware Upgrade Package R020-14-048.zip|Quantar Conventional Firmware Upgrade Package R020-14-048 ]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== SIMM Images =====&lt;br /&gt;
&lt;br /&gt;
The SIMM has a boot1 image which is a basic bootloader (0x460-0x3ffff).  This runs just after the bootstrap code (0x000 0x45f). The bootloader (boot.o) contains basic code to initialize the hardware and validate the boot2.o, sc.o and wl.o images stored in the SIMM. It also has a slip loader in it.  With only the boot.o code running it's possible to reload the entire OS at 9600 baud via the front port.  &lt;br /&gt;
&lt;br /&gt;
The boot.o is the only code not able to be upgraded on the SIMM via SLIP/FTP.  To upgrade boot.o you need to flash the SIMM directly.  Normally boot.o does not matter, but it is different for IR and NIR stations.  The other issue is the newer (EPIC III) SCM cards will not boot with boot.o 020.10.001, and need at least the 020.10.008 code.  The newest boot code is 020.10.012, and the images below have that code on them.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Conventional Firmware for U1-U4 on the SIMM module 20.14.048&lt;br /&gt;
&lt;br /&gt;
:: [[media:NIR-R020.12.048 B2-R020.14.15 B1-R020.10.12.zip]] -- Most current firmware, works on all SCM boards.&lt;br /&gt;
&lt;br /&gt;
:: [[media:Quantar-Flash-Simm-EPIC2-NON-IR-FW-20.14.048-Boot-020.10.001.zip]]  -- '''Don't use, older code for historical reference only'''&lt;br /&gt;
&lt;br /&gt;
IntelliRepeater (IR) Firmware for U1-U8 on the two bank SIMM module 20.14.520&lt;br /&gt;
&lt;br /&gt;
:: [[Media:IR-SIMM-20.14.520.zip]]&lt;br /&gt;
&lt;br /&gt;
This is for the old B013.05.014 EPIC I firmware that would run from the 27C040 PROMs.  It's here for reference, don't use it.&lt;br /&gt;
&lt;br /&gt;
:: [[Media:Quantar 27C040 SCM B013.05.014 EPROM images.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hacking info &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
How to combine the firmware into a single binary image&lt;br /&gt;
&lt;br /&gt;
srec_cat -Output 20.14.038-SIMM.bin -Binary \&lt;br /&gt;
&amp;quot;U4.bin&amp;quot; -Binary -unsplit 4 0 \&lt;br /&gt;
&amp;quot;U3.bin&amp;quot; -Binary -unsplit 4 1 \&lt;br /&gt;
&amp;quot;U2.bin&amp;quot; -Binary -unsplit 4 2 \&lt;br /&gt;
&amp;quot;U1.bin&amp;quot; -Binary -unsplit 4 3&lt;br /&gt;
&lt;br /&gt;
srec_cat -Output 20.14.048-SIMM.bin -Binary \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u4.bin&amp;quot; -Binary -unsplit 4 0 \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u3.bin&amp;quot; -Binary -unsplit 4 1 \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u2.bin&amp;quot; -Binary -unsplit 4 2 \&lt;br /&gt;
&amp;quot;20.14.048 - EPIC 2 - U1.bin&amp;quot; -Binary -unsplit 4 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How to Split it back into a per chip image.&lt;br /&gt;
&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 0 -Output U4-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 1 -Output U3-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 2 -Output U2-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 3 -Output U1-920.bin -Binary&lt;br /&gt;
&lt;br /&gt;
0x00000 is the start of boot1 &lt;br /&gt;
&lt;br /&gt;
boot1 is never updated by the station.  When you go to flash the station, the ftp server an everything runs from this code.  The main sc.o code doesn't have the FTP server in it. &lt;br /&gt;
&lt;br /&gt;
0x40000 is the start of boot2  &lt;br /&gt;
BEBE CAFE BEBE CAFE then object name&lt;br /&gt;
FEED BEEF FEED BEEF is the end then  4 bytes &lt;br /&gt;
EEnd of ROM&lt;br /&gt;
0x80000 is the start of sc.o&lt;br /&gt;
0018FC54 is the start of wl.o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Wireline Images =====&lt;br /&gt;
&lt;br /&gt;
'''Go check out the [[Wireline|wireline page]] for updated info the below is not the most current.'''&lt;br /&gt;
&lt;br /&gt;
Wireline 20.10.816 for AT27C010 Chips.  This works with the 20.14.048 Conventional Firmware&lt;br /&gt;
&lt;br /&gt;
:: [[Media:wlb_2000_20.10.816_u134_upper_AT27C010.bin|Wireline U134 Upper 20.10.816 ]]&lt;br /&gt;
:: [[Media:wlb_2000_20.10.816_u135_lower_AT27C010.bin|Wireline U135 Lower 20.10.816 ]]&lt;br /&gt;
&lt;br /&gt;
===== Exciter Images =====&lt;br /&gt;
&lt;br /&gt;
This is the matching Exciter Image for a AM27C512 UV EPROM&lt;br /&gt;
&lt;br /&gt;
:: [[Media:exciter_r020.09.018_matches-scm-20.14.048__U3701__am27c512.bin|Exciter 020.09.018]]&lt;br /&gt;
&lt;br /&gt;
==== Code Plug format ====&lt;br /&gt;
&lt;br /&gt;
=== Manuals ===&lt;br /&gt;
* [[Media:Motorola Quantar Instruction Manual.pdf|Motorola Quantar Instruction Manual 68P81095E05-B with updates]] - Most comprehensive manual&lt;br /&gt;
&lt;br /&gt;
* [[media:Quantar Satellite Receiver Instruction Manual 68P81087E25-O.pdf|Quantar Satellite Receiver Instruction Manual 68P81087E25-O.pdf]] - This is the manual for Satellite Receiver (not AstroTac Receiver), which is basically a Quantar minus the PA/Exciter.  The advantage to this is it can be used where wildcard functions are need. &lt;br /&gt;
&lt;br /&gt;
* [[media:Service_manual.pdf|Quantar Service Manual 68P81088E90-G]] - this is the full service manual for the Quantar/Quantro and AstroTac&lt;br /&gt;
* [[media:Quantar RSS Manual R14.10.00.pdf|Quantar RSS Manual R14.10.00]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:6881085E35-AT Quantar RSS Manual R14.13.00.pdf|Quantar RSS Manual R14.13.00]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Quantar Service Bulletin |a complete listing of service bulletins for the Quantar]]&lt;br /&gt;
&lt;br /&gt;
The [[PDR 3500|PDR3500]] is basically a Quantar in a portable format using a PA from a Spectra mid power radio.  The basic service manual has a diagram of the backplane and glue circuits that tie this all together.  It's very interesting to read as it explains quite a bit more of how the ID resistors and SPI bus works.  If you're hacking quantar's, it's a must read.&lt;br /&gt;
&lt;br /&gt;
* [[Media:PDR 3500 Transportable Repeater Basic Service Manual.pdf|PDR 3500 Transportable Repeater Basic Service Manual]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:ASTRO 25 Conventional Systems System Planner ASTRO 3.1 Convl Sys.Planner.pdf|ASTRO 25 Conventional Systems System Planner ASTRO 3.1 Convl Sys.Planner]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:Zhone TeNSr 800 imacs-system-reference-guide-7.2.1.pdf|Zhone TeNSr 800 imacs-system-reference-guide-7.2.1]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:68P81003Y54-O Managing Network Transport Equipment.pdf|68P81003Y54-O Managing Network Transport Equipment]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:GPS Simulcast Installation Manual 68P81098E65-C.pdf|GPS Simulcast Installation Manual 68P81098E65-C]]&lt;br /&gt;
&lt;br /&gt;
* [[Winrss help|RSS Software Help file.]] - this is the help file from WinRSS and is quite useful for station programing tips.&lt;br /&gt;
&lt;br /&gt;
== Hardware info ==&lt;br /&gt;
&lt;br /&gt;
=== Part numbers ===&lt;br /&gt;
Here are part numbers and what the correspond to.  &lt;br /&gt;
&lt;br /&gt;
=== Power Supplies ===&lt;br /&gt;
&lt;br /&gt;
The -48v supplies are easy to see as they have a side to side DC breaker style switch.  The Motorola/Onan column refers to the manufacturer of the PS.  Many people rag on the Onan power supplies, but I've not had one fail in service yet.  The Onan do have a heat activated fan, whereas the Motorola run continuously.  This can be good for base use or in the lab, as the base station will not make noise unless it's keyed down for some time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Quantar power supplies&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| P/N ||Description||Motorola/Onan||Watts&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1031||48/60v input||Yes||600&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1049||AC no charger||Yes||265&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1050||AC with Charger||Yes||265&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1047||AC no charger||Yes||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1048||AC with Charger||Yes||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7802||12/24v DC||No||210&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7803||48/60v input||No||210&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7801||24v input||No||600&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1042||AC||No||700&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TPN6185||AC w/Charger|| ?||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TPN1186||No idea|| ? ||				&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Several PSUs have a DC input on the back using a special connector pictured below.  This is an [https://www.te.com/en/product-530521-3.html AMP/TE 530521-3] 4 position connector.  The contacts are 5-530519-2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
Quantar-DC-Connector-00001.jpg&lt;br /&gt;
Quantar-DC-Connector-00002.jpg&lt;br /&gt;
Quantar-DC-Connector-00003.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Quantro/Quantar-Backplane|BackPlane]] ===&lt;br /&gt;
&lt;br /&gt;
The [[Quantro/Quantar-Backplane|BackPlane]] modules are different for the Quantar and Quantro. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Station Control info ===&lt;br /&gt;
&lt;br /&gt;
'''Station Control Module''' or '''''SCM''''' is the heart of the Quantar station.  The SCM comes in different revisons known as EPIC. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* [[EPIC 1|EPIC I  - TTN4094]]&lt;br /&gt;
* [[EPIC II|EPIC II - CLN6686F]]&lt;br /&gt;
* EPIC III - Note the EPIC3 will not work out of band.  The modulation will be very low.&lt;br /&gt;
* EPIC IV - '''This is only for the Smart Zone trunking.  IT will not work for conventional'''&lt;br /&gt;
* [[EPIC V| EPIC V - MCLN8447]]&lt;br /&gt;
* EPIC 6 - lol it doesn't exist.  &amp;lt;ref&amp;gt;my theory on this is eBay sellers searched the part number CLN7692 and found this page and then read 'IV' as 6 not 4. https://www.youtube.com/watch?v=Exiy5eVMzg4&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Quantar&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||Conv/6809||IntelliRepeater||Astro 25 Trunking ONLY&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6&amp;quot;&lt;br /&gt;
| EPIC I||Board||TTN4094||TRN7900||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6;&lt;br /&gt;
| ||FRU||TLN3397||TLN3398||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6961||CLN6960||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU||CLN1293||CLN1294||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#E2EFDA;&lt;br /&gt;
| EPIC III||Board||CLN1614||N/A||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#E2EFDA;&lt;br /&gt;
| ||FRU||CLN1621||N/A||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FFF2CC;&lt;br /&gt;
| EPIC IV||Board||N/A||N/A||CLN7692&lt;br /&gt;
|- style=&amp;quot;background-color:#FFF2CC;&lt;br /&gt;
| ||FRU||N/A||N/A||DLN1229&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| [[EPIC V|EPIC V]]||Board||MCLN8426||MCLN8447||N/A&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||CLN8480||CLN8479||N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;ASTRO-TAC Receiver&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||Conv/6809||Astro 25 Trunking ONLY&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6&amp;quot;&lt;br /&gt;
| EPIC I||Board||TTN4094||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6;&lt;br /&gt;
| ||FRU||TLN3397||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6873||CLN6873&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU||CLN1273||CLN1273&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| EPIC V||Board||MCLN8426||MCLN8426&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||CLN8480||CLN8480&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 75%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Others&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||SecureNet||Limited||PDR 3500||DBS||ATAC 3000 ||ATAC9600&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6961||CLN7462||CLN6686||CLN7361||CLN7361||[[ASTRO-TAC#CCN4009|CCN4009]]&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU|| ||CLN1609||CLN1177||CLN1914||CLN1914||CCN1009&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| EPIC V||Board||MCLN8426||N/A||N/A||N/A||N/A||N/A&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||Unknown||N/A||N/A||N/A||N/A||N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The only difference between the various versions of the EPICs (excluding EPIC IV) is the hardware is newer.  There is no difference in functionality for conventional analog/astro/P25 operation.&lt;br /&gt;
&lt;br /&gt;
==== SIMM info ====&lt;br /&gt;
&lt;br /&gt;
The SIMM used for firmware in the Quantar EPIC 2/3 is an 80 pin SIMM and is basically unobtanimum.  It is possiable to use a Motorola [[COIM Modification|Console Operator Interface Module SIMM]] if you want to modify it. &lt;br /&gt;
&lt;br /&gt;
The conventional uses 4, 29F040 chips arranged to be 32 bits wide. This means each chip stores every 4th byte. &lt;br /&gt;
&lt;br /&gt;
Example we store &amp;quot;QUANTAR MOTOROLA&amp;quot; in the SIMM&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Chip 1 !! Chip 2 !! Chip 3 !! Chip 4&lt;br /&gt;
|-&lt;br /&gt;
| Q || U || A || N&lt;br /&gt;
|-&lt;br /&gt;
| T || A || R || &lt;br /&gt;
|-&lt;br /&gt;
| M || O || T || O&lt;br /&gt;
|-&lt;br /&gt;
| R || O || L || A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
So if we read Chip 1 we'd see QTMR.&lt;br /&gt;
&lt;br /&gt;
The IR uses a two bank SIMM with the same layout (8 chips total)&lt;br /&gt;
&lt;br /&gt;
It's possible to pull these chips and read/write them if you have the right programmer. Taking advantage of this I was able to build a SIMM programmer for the soldered in place SIMM's that essentially programs one chip at a time (8bits). &lt;br /&gt;
[[File:SIMM Programmer.jpeg|thumbnail|80 Pin SIMM Programmer]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's not pretty but it works. &lt;br /&gt;
&lt;br /&gt;
The SIMM has the ability to be upgraded via the SCM download procedure, but the IR SIMM and NON-IR SIMMs cannot be interchanged.  This is do to the boot code being different.  Using the SIMM programmer or the socketed SIMM you can reprogram the SIMM's for either.&lt;br /&gt;
&lt;br /&gt;
==== SIMM-less SCM ====&lt;br /&gt;
&lt;br /&gt;
It is possible to use 29F040 chips in the sockets on the EPIC 1 with just a flick of the Flash switch, this makes it easy to use the current Quantar Firmware in the EPIC 1 with just standard DIP chips.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the later revision EPIC's the DIP sockets are only used for 27c040 chips which have a slightly different pinout.  It's possible to use the SIMM images as u1-4 maps to U451-454 with a slight modification to the chips.  Typically I'll bend up pins 1, (A18 on Flash, VPP on EEPROM) and 31 (!WE on Flash, A18 on EEPROM), and then connect a wire from the board at pin 31 to pin 1 on the chip.  A connection to !WE on the chip is optional unless you want to be able to upgrade the chips.  In this case you'll need to make a conection from SIMM pins 53, 29, 6, &amp;amp; 5 to the !WE lines on U451-U454 respectively.  &lt;br /&gt;
&lt;br /&gt;
The Quantar doesn't care about the ID pins on the SIMM, but I typically will tie 74, 75, 76, 79 to ground/pin 80.  If you're doing an ATAC 3k, the ATAC does care about this and you need pins 76 and 79 tied to ground.   &lt;br /&gt;
&lt;br /&gt;
Of course the Intelerepeater and ATAC9k will not work in this configuration as they need two banks on the SIMM, so you can't do this if that's your requirement.  For most ham stuff, there's no reason you need anything more than NIR code for Quantar and ATAC 3000.&lt;br /&gt;
&lt;br /&gt;
=== Receiver ===&lt;br /&gt;
Like the rest of the unit the receivers are frequency dependent and consist of their own modules.  The basic receiver has a preselector which is 4 MHz wide on VHF and 6 MHz wide on UHF. &lt;br /&gt;
&lt;br /&gt;
The receiver is an excellent high side injection design (exception for 800/900 which is low side).  The first IF is +21.45 MHz on VHF and +73.35 MHZ on UHF/800/900.  The second IF is 455 KHz.  In many cases barefoot (minus preselector) the receiver sensitivity is under -120dBm for 12 dB SINAD.  Couple this with the great built in selectivity and it's truly a bullet proof design idea for high RF sites.&lt;br /&gt;
&lt;br /&gt;
The receiver is pretty dumb, there is not a μP on the board, making it easier to troubleshoot.  The devices receive their programming from the main CPU on the SCM via SPI bus.  The two main chips are the U2500 receiver IC and U2401 PLL IC.  U2401, the PLL, is a custom chip responsible for locking the VCOs to the proper frequency, and selecting the high or low VCO.  U2500, the receiver IC, contains the 2nd IF/VCO and final processing of the intended signal.  Unlike other designs, the receiver IC presents the recovered audio/data as two digital signals to the SCM where A/D conversion happens (if needed). &lt;br /&gt;
&lt;br /&gt;
There are a couple other chips which present various &lt;br /&gt;
&lt;br /&gt;
UHF R0 was added later and extends the coverage and tuning range of the unit down to 380 MHz.  The preselctor for this covers the whole range as well.  &lt;br /&gt;
&lt;br /&gt;
Each item has more information on it's own page and covers conversions there as well. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! CLD !! FRU P/N !! Range !! Preselector !! Description &lt;br /&gt;
|-&lt;br /&gt;
| TRD6361 || CLD1250 || TLN3250 || VHF R1  || [[VHF Preselector|TFD6511]] || [[VHF Receiver|VHF Receiver 132-154 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TRD6362 || CLD1260 || TLN3251 || VHF R2 || [[VHF Preselector|TFD6512]] || [[VHF Receiver|VHF Receiver 150-174 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CRX4022 || CRX1027 || DLN1215 || UHF R0 || [[UHF Preselector|CRX4001]] || [[UHF R0 Receiver|UHF Receiver 380-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6281 || CLE1190 || TLN3313 || UHF R1 || [[UHF Preselector|TLE5991]] || [[UHF Receiver|UHF Receiver 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6282 || CLE1200 || TLN3314 || UHF R2 || [[UHF Preselector|TLE5992]] || [[UHF Receiver|UHF Receiver 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6283 || CLE1210 || TLN3373 || UHF R3 || [[UHF Preselector|TLE5993]] || [[UHF Receiver|UHF Receiver 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6284 || CLE1220 || TLN3374 || UHF R4 || [[UHF Preselector|TLE5993]] ||[[UHF Receiver|UHF Receiver 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRF6551 || CLF1530 || TLN3315 || 800 || N/A || [[800 MHz Receiver|800 MHz Receiver 806-825 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRF6552 || CLF1540 || TLN3316 || 900 || N/A || [[900 MHz Receiver|900 MHz Receiver 935-941 MHz]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Exciter ===&lt;br /&gt;
&lt;br /&gt;
The exciters contain their own CPU which communicates with the SCM over a SPI bus.  This CPU runs it's own firmware and requires a socketed UV EPROM to upgrade it.  This also controls the PA meeting and the bit of EEPROM in the CPU stores the alignment settings for the exciter and PA.  Generally a Exciter/PA pair will not need to be realigned if moved from one chassis to another, although it should be checked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! CLD !! FRU P/N !! Range !! Description&lt;br /&gt;
|-&lt;br /&gt;
| TLD9831 || CLD1270 || TLN3252 || VHF R1  || [[VHF Exciter|VHF Exciter 132-154 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TLD9832 || CLD1280 || TLN3253 || VHF R2 || [[VHF Exciter|VHF Exciter 150-174 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLX4000 || CLX1000 || DLN1214 || UHF R0 || [[UHF R0 Exciter|UHF Exciter 380-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5971 || CLE1230 || TLN3305 || UHF R1 || [[UHF Exciter|UHF Exciter 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5972 || CLE1240 || TLN3306 || UHF R2 || [[UHF Exciter|UHF Exciter 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5973 || CLE1210 || TLN3375 || UHF R3 || [[UHF Exciter|UHF Exciter 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5974 || CLE1220 || TLN3376 || UHF R4 || [[UHF Exciter|UHF Exciter 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLF6920 || CLF1510 || TLN3307 || 900 || [[800 MHz Exciter|800 MHz Exciter 850-870 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLF6930 || CLF1520 || TLN3308 || 900 || [[900 MHz Exciter|900 MHz Exciter 935-941 MHz]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Station Access Module ===&lt;br /&gt;
[[Station Access Module|Check here for SAM info]]&lt;br /&gt;
&lt;br /&gt;
==== Troof Table ====&lt;br /&gt;
There is a ID code representing the exciter type, it consists of R3700 to R3710.  These are either pull up or down resistors on a 6 bit code and are identified on the schematic on the left side of U3700, the μP.  &lt;br /&gt;
Below is the table in MSB-LSB format, with a 1 being high (5v) and a 0 being a low (0v).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!'''Dip switch'''!&lt;br /&gt;
!'''Band'''!&lt;br /&gt;
!'''Binary'''!&lt;br /&gt;
!'''Notes in the RSS'''!&lt;br /&gt;
|-&lt;br /&gt;
| 0||VHF_R1||000000||&lt;br /&gt;
|-&lt;br /&gt;
| 1||VHF_R2||000001||VHF R2 SL&lt;br /&gt;
|-&lt;br /&gt;
| 2||UHF_R1||000010||&lt;br /&gt;
|-&lt;br /&gt;
| 3||UHF_R2||000011||&lt;br /&gt;
|-&lt;br /&gt;
| 4||800||000100||&lt;br /&gt;
|-&lt;br /&gt;
| 5||VHF_R3||000101||sl&lt;br /&gt;
|-&lt;br /&gt;
| 6||VHF_R4||000110||&lt;br /&gt;
|-&lt;br /&gt;
| 7||VHF_R1||000111||&lt;br /&gt;
|-&lt;br /&gt;
| 8||VHF_R2||001000||VHF R2 FL&lt;br /&gt;
|-&lt;br /&gt;
| 9||VHF_R3||001001||&lt;br /&gt;
|-&lt;br /&gt;
| 10||VHF_R4||001010||&lt;br /&gt;
|-&lt;br /&gt;
| 11||900||001011||&lt;br /&gt;
|-&lt;br /&gt;
| 12||UHF_R3||001100||&lt;br /&gt;
|-&lt;br /&gt;
| 13||UHF_R4||001101||&lt;br /&gt;
|-&lt;br /&gt;
| 14||blank||001110||&lt;br /&gt;
|-&lt;br /&gt;
| 15||blank||001111||&lt;br /&gt;
|-&lt;br /&gt;
| 16||blank||010000||&lt;br /&gt;
|-&lt;br /&gt;
| 17||blank||010001||&lt;br /&gt;
|-&lt;br /&gt;
| 18||blank||010010||&lt;br /&gt;
|-&lt;br /&gt;
| 19||blank||010011||uhf r0 from book&lt;br /&gt;
|-&lt;br /&gt;
| 20||blank||010100||&lt;br /&gt;
|-&lt;br /&gt;
| 21||blank||010101||&lt;br /&gt;
|-&lt;br /&gt;
| 22||blank||010110||&lt;br /&gt;
|-&lt;br /&gt;
| 23||blank||010111||&lt;br /&gt;
|-&lt;br /&gt;
| 24||blank||011000||&lt;br /&gt;
|-&lt;br /&gt;
| 25||blank||011001||&lt;br /&gt;
|-&lt;br /&gt;
| 26||blank||011010||&lt;br /&gt;
|-&lt;br /&gt;
| 27||blank||011011||&lt;br /&gt;
|-&lt;br /&gt;
| 28||blank||011100||&lt;br /&gt;
|-&lt;br /&gt;
| 29||blank||011101||&lt;br /&gt;
|-&lt;br /&gt;
| 30||blank||011110||&lt;br /&gt;
|-&lt;br /&gt;
| 31||blank||011111||&lt;br /&gt;
|-&lt;br /&gt;
| 32||blank||100000||&lt;br /&gt;
|-&lt;br /&gt;
| 33||blank||100001||&lt;br /&gt;
|-&lt;br /&gt;
| 34||blank||100010||&lt;br /&gt;
|-&lt;br /&gt;
| 35||blank||100011||&lt;br /&gt;
|-&lt;br /&gt;
| 36||blank||100100||&lt;br /&gt;
|-&lt;br /&gt;
| 37||blank||100101||boot&lt;br /&gt;
|-&lt;br /&gt;
| 38||blank||100110||&lt;br /&gt;
|-&lt;br /&gt;
| 39||blank||100111||&lt;br /&gt;
|-&lt;br /&gt;
| 40||blank||101000||&lt;br /&gt;
|-&lt;br /&gt;
| 41||blank||101001||&lt;br /&gt;
|-&lt;br /&gt;
| 42||blank||101010||&lt;br /&gt;
|-&lt;br /&gt;
| 43||blank||101011||&lt;br /&gt;
|-&lt;br /&gt;
| 44||blank||101100||&lt;br /&gt;
|-&lt;br /&gt;
| 45||blank||101101||&lt;br /&gt;
|-&lt;br /&gt;
| 46||blank||101110||&lt;br /&gt;
|-&lt;br /&gt;
| 47||blank||101111|| &amp;quot;RSS only&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 48||blank||110000||&lt;br /&gt;
|-&lt;br /&gt;
| 49||blank||110001||&lt;br /&gt;
|-&lt;br /&gt;
| 50||blank||110010||&lt;br /&gt;
|-&lt;br /&gt;
| 51||blank||110011||&lt;br /&gt;
|-&lt;br /&gt;
| 52||blank||110100||RAP says VHF_R2 SL&lt;br /&gt;
|-&lt;br /&gt;
| 53||blank||110101||&lt;br /&gt;
|-&lt;br /&gt;
| 54||blank||110110||&lt;br /&gt;
|-&lt;br /&gt;
| 55||blank||110111||&lt;br /&gt;
|-&lt;br /&gt;
| 56||blank||111000||&lt;br /&gt;
|-&lt;br /&gt;
| 57||blank||111001||&lt;br /&gt;
|-&lt;br /&gt;
| 58||blank||111010||&lt;br /&gt;
|-&lt;br /&gt;
| 59||blank||111011||&lt;br /&gt;
|-&lt;br /&gt;
| 60||blank||111100||&lt;br /&gt;
|-&lt;br /&gt;
| 61||blank||111101||&lt;br /&gt;
|-&lt;br /&gt;
| 62||blank||111110||&lt;br /&gt;
|-&lt;br /&gt;
| 63||INVALID||111111||Exciter is in reset all LED's are on and the PA fans turn on&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[PDR 3500|PDR3500]] ===&lt;br /&gt;
The PDR3500 is a portable version of the repeater.  Here's some details and internal pics of it.&lt;br /&gt;
&lt;br /&gt;
== Power Amp ==&lt;br /&gt;
The power amps are actually a cool design.&lt;br /&gt;
&lt;br /&gt;
Their are two basic power amps, a 25W, and a 100/110/125w (depending on band).  The power amps all use the same general board layout, with the frequency dependent parts separate from the support components.  The 25W PA is a passively cooled unit with a massive heatsink, while the 100/110/125W unit has active cooling with a horizontal heatsink and two cooling fans moving air front to back.&lt;br /&gt;
&lt;br /&gt;
There are a couple different revisions of the PA's so the main PCB has changed a bit over time.  &lt;br /&gt;
&lt;br /&gt;
[[File:125W VHF PA layout.png|400px|thumbnail|left|PCB Layout High Power]]&lt;br /&gt;
&lt;br /&gt;
[[File:25W UHF PA Layout.png|400px|thumbnail|center|PCB Layout Low Power]]&lt;br /&gt;
&lt;br /&gt;
[[|thumbnail|center]]&lt;br /&gt;
&lt;br /&gt;
The PA doesn't contain any CPU, it's controlled via the exciter CPU with basic analog level lines going over to the exciter.&lt;br /&gt;
Some of what's measured by the exciter&lt;br /&gt;
* Intermediate PA drive level - this is the output of the IPA to the final PA pallet&lt;br /&gt;
* Driver PA Level - output of the final PA before the circulator (FPA_DETECT).&lt;br /&gt;
* TX Power Forward - Output measured at the output of the Low Pass Filter&lt;br /&gt;
* TX Power Reverse - Reflected Power from the antenna port&lt;br /&gt;
* OMNI voltage - this is the control voltage on the IPA which comes from the SCM as a 0-5V control signal (V_CONT).  This 0-5v controls a transistor making a 0-14v signal to provide the gain of the IPA.  This is the basis of the power control.  The Control Voltage from the SCM is only present during keydown.&lt;br /&gt;
* IPA Current detect&lt;br /&gt;
* DPA Side A &amp;amp; B current sense&lt;br /&gt;
* Temperature of the PA 3.981v is 79f 2.0 is about 170f This looks like an 8 bit value with 0xFF == 5.000 V or .019608v per bit. &lt;br /&gt;
** PA Fans turn on at 2v and off at 2.90v.  &lt;br /&gt;
* Fan on/off and alarm&lt;br /&gt;
* PA_ID bits A &amp;amp; B - resistor divider that programs to reference voltages in .5v increments to ID the PA hardware to the exciter.&lt;br /&gt;
&lt;br /&gt;
All these are measured over an TDM bus that selects each at a 200ms interval using a single analog input on the exciter CPU.&lt;br /&gt;
&lt;br /&gt;
PA types&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! Other P/N !! Rated Power !! Range !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CLD1295A || || || 120? || VHF? || Unknown&lt;br /&gt;
|- &lt;br /&gt;
| TLD3102 || CLD1299 || 125     || VHF R2 || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| TLD3110 ||  || 25    || VHF R1/R2 || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| TLD3101 ||  TLN3379 CLD1298 || 125    || VHF R1 (NEW) || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| CTX1146 || DLN1216 || 110     || UHF R0  || [[Second Generation PA|Second Generation UHF PA 380-433 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TTE2061 || TLN3444 || 110     || UHF R1 || [[First Generation PA|First Generation UHF PA 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLE6164 || Example || 110 || UHF R1 || [[Second Generation PA|Second Generation UHF PA 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2062 || TLN3446 || 110     || UHF R2 || [[First Generation PA|First Generation UHF PA 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLE6165 || CLE1308 || 110 || UHF R2 || [[Second Generation PA|Second Generation UHF PA 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2063 ||         || 110     || UHF R3 || [[First Generation PA|First Generation UHF PA 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE6373 ||         || 110 || UHF R3 || [[Second Generation PA|Second Generation UHF PA 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2064 ||         || 100     || UHF R4 || [[First Generation PA|First Generation UHF PA 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE6374 ||         || 100 || UHF R4 || [[Second Generation PA|Second Generation UHF PA 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CTF1091A/TLF1930 || TLN3442 || 100 || 800 || [[800 MHz 100W PA| 800 MHz 100W PA]]&lt;br /&gt;
|-&lt;br /&gt;
| CTF1092A/TLF1800 || TLN3299 || 100 || 900 || [[900 MHz 100W PA| 900 MHz 100W PA]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PA Type !! PA_ID_A !! PA_ID_B !! R4162 !! R4163 !! R4164 !! R4165 !! Official?&lt;br /&gt;
|-&lt;br /&gt;
| 900 100W || 3.0 || .5 || 20.5k || 10k || 1k || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| 800 100W || 0.5 || 1.0 || OPEN || 0 || 1.5K || 15K || YES&lt;br /&gt;
|-&lt;br /&gt;
| 800 20W || 0.0 || 1.0 || OPEN || 1k || 1.5K || 15K || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R0 || 0.0 || 1.5 || OPEN || 0 || 390 || 1k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R1 || 1.0 || 0.5 || 15k || 1.5k || 560 || 10k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R2 || 1.5 || 0.5 || 1k || 390 || 100 || 1k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R3 || 3.0 || 1.0 || 2.2k || 2.7k || 1.5k || 15k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 100W R4 || 3.5 || 1.0 || 18k || 15k || 1.5k || 15k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 25W R1 || 5.0 || 0.0 || 33.2k || OPEN || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 25W R2 || 0.0 || 0.5 || OPEN || 0 || 1k  || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 125W R1 || 3.0 || 0.0 || 20.5k || 10k || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 125W R2 || 0.0 || 0.0  || OPEN || 0 || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 25W R1/R2 || 4.5  || 0.0 || 12k || 68k || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 25W R1 || 3.5 || 0.0 ||  || ||  || NO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UHF 110W Generation 1 &lt;br /&gt;
UHF 110W Generation 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CTF1091A 100 W 800 MHz&lt;br /&gt;
CTF1092A 100 W 900 MHz&lt;br /&gt;
CTX1146A Range 0 Power Amplifier&lt;br /&gt;
TLF1800B 100W Power Amplifier Module&lt;br /&gt;
TLF1930C 100W Power Amplifier Module&lt;br /&gt;
TLF1940B 20W Power Amplifier Module&lt;br /&gt;
TTE2061A 110W Power Amplifier UHF R1&lt;br /&gt;
TTE2062A 110W Power Amplifier UHF R2&lt;br /&gt;
TTE2063A 110W Power Amplifier UHF R3&lt;br /&gt;
TTE2064A 110W Power Amplifier UHF R4&lt;br /&gt;
&lt;br /&gt;
TLE2511A/ 110W Power Amplifier Module&lt;br /&gt;
TLE2512A&lt;br /&gt;
TLE2521&lt;br /&gt;
TLE2572&lt;br /&gt;
TLE2731B 25W Power Amplifier Module UHF R1&lt;br /&gt;
TLE2732B 25W Power Amplifier Module UHF R2&lt;br /&gt;
TLD3101G 125W Power Amplifier Module VHF R1&lt;br /&gt;
TLD3102G 125W Power Amplifier Module VHF R2&lt;br /&gt;
TLD3110C 25W Power Amplifier Module VHF R1/R2&lt;br /&gt;
CLX4002A 100/110W Power Amplifier Module (UHF; R1-R4)&lt;br /&gt;
CLE6164A 100/110W Power Amplifier CLE6165A Module (UHF; R1-R4)&lt;br /&gt;
&lt;br /&gt;
TTE6373A/ 100/110W Power Amplifier&lt;br /&gt;
TTE6374A Module (UHF; R1-R4)&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting notes ===&lt;br /&gt;
&lt;br /&gt;
Most of the time the PA's are rock solid.   I have some notes below on trouble shooting them.&lt;br /&gt;
&lt;br /&gt;
* swap with a known good PA, does the problem go away?&lt;br /&gt;
* Align the PA/init the PA&lt;br /&gt;
* Check the amp draw on both sides&lt;br /&gt;
* Always run it at 100% rated power for testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''Silly PA syndrome''' ====&lt;br /&gt;
Some times people run the PA at lower output to &amp;quot;make it easier on it&amp;quot;.  So long as cooling is working, running it at rated output is the least stressful way to operate it.  Running at reduced power output is actually harder on the PA.  &lt;br /&gt;
&lt;br /&gt;
The PA has an intermediate stage and a final amp stage.  The final amp runs at the same gain level all the time.  The power out is changed by varying the IPA voltage.  As this is done via a linear regulator, as the power output goes down, there is more and more power dissipated in the Q4100 (UHF) pass transistor.  This is due to running the IPA at lower and lower voltage to drop the power to the final.  Typically what happens is a station will key up, then fail and try to fall back in power, but this just makes it worse. &lt;br /&gt;
&lt;br /&gt;
What I've done to test this:&lt;br /&gt;
* Run the PA at 120% (ie 150w output) just for a bit.  ie init it and align it for 110w = 130W.  &lt;br /&gt;
* Test the station, key it down and check that it's solid for 2-3 min.  &lt;br /&gt;
* check the value of the OMNI Voltage in the station metering. &lt;br /&gt;
&lt;br /&gt;
If this is good, replace the Q4100, and check the operation of the power control circuits (q4101, V_CONT, VOMNI).  &lt;br /&gt;
&lt;br /&gt;
This normally fixes it.  &lt;br /&gt;
&lt;br /&gt;
[[Category:Quantar]]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Quantar&amp;diff=8410</id>
		<title>Quantar</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Quantar&amp;diff=8410"/>
		<updated>2025-12-25T19:26:08Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Manuals */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Quantar/Quantro info ==&lt;br /&gt;
&lt;br /&gt;
There is a bunch of info here about the technical aspects of the Quantar Stations. &lt;br /&gt;
&lt;br /&gt;
The info on the modification and changing ranges of the various modules is on the respective pages.  There is some conversion info below, but it's being migrated and reformatted under the respective pages.  I feel this is more logical.&lt;br /&gt;
&lt;br /&gt;
If you find anything to be wrong here, please feel free to make an account and change it.  I've had to lock down account creation, so you'll need to have it approved.  If you want to email me directly, my email is [mailto:bryan@bryanfields.net bryan@bryanfields.net]&lt;br /&gt;
&lt;br /&gt;
=== Specifications ===&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar Specifications VHF, UHF, 800 MHz.pdf|Quantar Specifications VHF, UHF, 800 MHz]] - This is the combined spec sheet for the VHF/UHF and 800 base stations.&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar Data Base Sation Specification Sheet 800 900 MHz.pdf|Quantar Data Base Station Specification Sheet 800 900 MHz]]&lt;br /&gt;
&lt;br /&gt;
[[Media:ASTRO TAC QUANTAR receiver manual.pdf|ASTRO TAC QUANTAR receiver manual]]&lt;br /&gt;
&lt;br /&gt;
=== Programming ===&lt;br /&gt;
&lt;br /&gt;
Links to programming stuff&lt;br /&gt;
&lt;br /&gt;
[[media:CSS_007.13.R022.00.035_12-04.exe|CSS 007.13.R022.0035 for EPIC4 Smart Zone SCM]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS_R14.08.01.zip|WinRSS 14.08.01 Windows RSS]]&lt;br /&gt;
&lt;br /&gt;
[[Media:Quantar WinRSS R14.10.00 release July 15 2011.zip|WinRSS 14.10.00 release July 15 2011.zip]] &lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS R14.11.00.zip| WinRSS 14.11.00]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS R14.12.00.zip| WinRSS R14.12.00]]&lt;br /&gt;
&lt;br /&gt;
[[Media:WinRSS_R14.13.00.zip|WinRSS 14.13.00 April 2015]] Current Winrss - narrowband only.  Use the rsscore.dll from 14.12.00 will re-enable wideband. Or just run 14.12.00.&lt;br /&gt;
&lt;br /&gt;
[[Media:DIU CSS Installation.zip|DIU3000 CPS/CSS software 8.00.18 30-APR-2005]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Firmware ====&lt;br /&gt;
&lt;br /&gt;
The newer SCM modules can be upgraded via SLIP connection over the tty port, or via IP over the 10Base2 connector (anyone have a hub?).&lt;br /&gt;
&lt;br /&gt;
The Wireline typically will upgrade during this too, unless it has the older EPROM memory.  At that point you'll have to swap the chips.&lt;br /&gt;
&lt;br /&gt;
The exciter is still a hard chip swap upgrade, but programed EPROM's are $20 shipped on eBay.  Unless you have more than a few to upgrade it's not cost effective to buy the programer and chips yourself.&lt;br /&gt;
&lt;br /&gt;
:: [[Media:Quantar Conventional Firmware Upgrade Package R020-14-048.zip|Quantar Conventional Firmware Upgrade Package R020-14-048 ]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== SIMM Images =====&lt;br /&gt;
&lt;br /&gt;
The SIMM has a boot1 image which is a basic bootloader (0x460-0x3ffff).  This runs just after the bootstrap code (0x000 0x45f). The bootloader (boot.o) contains basic code to initialize the hardware and validate the boot2.o, sc.o and wl.o images stored in the SIMM. It also has a slip loader in it.  With only the boot.o code running it's possible to reload the entire OS at 9600 baud via the front port.  &lt;br /&gt;
&lt;br /&gt;
The boot.o is the only code not able to be upgraded on the SIMM via SLIP/FTP.  To upgrade boot.o you need to flash the SIMM directly.  Normally boot.o does not matter, but it is different for IR and NIR stations.  The other issue is the newer (EPIC III) SCM cards will not boot with boot.o 020.10.001, and need at least the 020.10.008 code.  The newest boot code is 020.10.012, and the images below have that code on them.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Conventional Firmware for U1-U4 on the SIMM module 20.14.048&lt;br /&gt;
&lt;br /&gt;
:: [[media:NIR-R020.12.048 B2-R020.14.15 B1-R020.10.12.zip]] -- Most current firmware, works on all SCM boards.&lt;br /&gt;
&lt;br /&gt;
:: [[media:Quantar-Flash-Simm-EPIC2-NON-IR-FW-20.14.048-Boot-020.10.001.zip]]  -- '''Don't use, older code for historical reference only'''&lt;br /&gt;
&lt;br /&gt;
IntelliRepeater (IR) Firmware for U1-U8 on the two bank SIMM module 20.14.520&lt;br /&gt;
&lt;br /&gt;
:: [[Media:IR-SIMM-20.14.520.zip]]&lt;br /&gt;
&lt;br /&gt;
This is for the old B013.05.014 EPIC I firmware that would run from the 27C040 PROMs.  It's here for reference, don't use it.&lt;br /&gt;
&lt;br /&gt;
:: [[Media:Quantar 27C040 SCM B013.05.014 EPROM images.zip]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Hacking info &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
How to combine the firmware into a single binary image&lt;br /&gt;
&lt;br /&gt;
srec_cat -Output 20.14.038-SIMM.bin -Binary \&lt;br /&gt;
&amp;quot;U4.bin&amp;quot; -Binary -unsplit 4 0 \&lt;br /&gt;
&amp;quot;U3.bin&amp;quot; -Binary -unsplit 4 1 \&lt;br /&gt;
&amp;quot;U2.bin&amp;quot; -Binary -unsplit 4 2 \&lt;br /&gt;
&amp;quot;U1.bin&amp;quot; -Binary -unsplit 4 3&lt;br /&gt;
&lt;br /&gt;
srec_cat -Output 20.14.048-SIMM.bin -Binary \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u4.bin&amp;quot; -Binary -unsplit 4 0 \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u3.bin&amp;quot; -Binary -unsplit 4 1 \&lt;br /&gt;
&amp;quot;20.14.048 - epic 2 - u2.bin&amp;quot; -Binary -unsplit 4 2 \&lt;br /&gt;
&amp;quot;20.14.048 - EPIC 2 - U1.bin&amp;quot; -Binary -unsplit 4 3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
How to Split it back into a per chip image.&lt;br /&gt;
&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 0 -Output U4-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 1 -Output U3-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 2 -Output U2-920.bin -Binary&lt;br /&gt;
srec_cat 20.14.048-SIMM-920mhz.bin -Binary -split 4 3 -Output U1-920.bin -Binary&lt;br /&gt;
&lt;br /&gt;
0x00000 is the start of boot1 &lt;br /&gt;
&lt;br /&gt;
boot1 is never updated by the station.  When you go to flash the station, the ftp server an everything runs from this code.  The main sc.o code doesn't have the FTP server in it. &lt;br /&gt;
&lt;br /&gt;
0x40000 is the start of boot2  &lt;br /&gt;
BEBE CAFE BEBE CAFE then object name&lt;br /&gt;
FEED BEEF FEED BEEF is the end then  4 bytes &lt;br /&gt;
EEnd of ROM&lt;br /&gt;
0x80000 is the start of sc.o&lt;br /&gt;
0018FC54 is the start of wl.o&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Wireline Images =====&lt;br /&gt;
&lt;br /&gt;
'''Go check out the [[Wireline|wireline page]] for updated info the below is not the most current.'''&lt;br /&gt;
&lt;br /&gt;
Wireline 20.10.816 for AT27C010 Chips.  This works with the 20.14.048 Conventional Firmware&lt;br /&gt;
&lt;br /&gt;
:: [[Media:wlb_2000_20.10.816_u134_upper_AT27C010.bin|Wireline U134 Upper 20.10.816 ]]&lt;br /&gt;
:: [[Media:wlb_2000_20.10.816_u135_lower_AT27C010.bin|Wireline U135 Lower 20.10.816 ]]&lt;br /&gt;
&lt;br /&gt;
===== Exciter Images =====&lt;br /&gt;
&lt;br /&gt;
This is the matching Exciter Image for a AM27C512 UV EPROM&lt;br /&gt;
&lt;br /&gt;
:: [[Media:exciter_r020.09.018_matches-scm-20.14.048__U3701__am27c512.bin|Exciter 020.09.018]]&lt;br /&gt;
&lt;br /&gt;
==== Code Plug format ====&lt;br /&gt;
&lt;br /&gt;
=== Manuals ===&lt;br /&gt;
* [[Media:Motorola Quantar Instruction Manual.pdf|thumb|Motorola Quantar Instruction Manual 68P81095E05-B with updates]]&lt;br /&gt;
&lt;br /&gt;
* [[media:Quantar Satellite Receiver Instruction Manual 68P81087E25-O.pdf|Quantar Satellite Receiver Instruction Manual 68P81087E25-O.pdf]] - This is the manual for Satellite Receiver (not AstroTac Receiver), which is basically a Quantar minus the PA/Exciter.  The advantage to this is it can be used where wildcard functions are need. &lt;br /&gt;
&lt;br /&gt;
* [[media:Service_manual.pdf|Quantar Service Manual 68P81088E90-G]] - this is the full service manual for the Quantar/Quantro and AstroTac&lt;br /&gt;
* [[media:Quantar RSS Manual R14.10.00.pdf|Quantar RSS Manual R14.10.00]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:6881085E35-AT Quantar RSS Manual R14.13.00.pdf|Quantar RSS Manual R14.13.00]]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Quantar Service Bulletin |a complete listing of service bulletins for the Quantar]]&lt;br /&gt;
&lt;br /&gt;
The [[PDR 3500|PDR3500]] is basically a Quantar in a portable format using a PA from a Spectra mid power radio.  The basic service manual has a diagram of the backplane and glue circuits that tie this all together.  It's very interesting to read as it explains quite a bit more of how the ID resistors and SPI bus works.  If you're hacking quantar's, it's a must read.&lt;br /&gt;
&lt;br /&gt;
* [[Media:PDR 3500 Transportable Repeater Basic Service Manual.pdf|PDR 3500 Transportable Repeater Basic Service Manual]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:ASTRO 25 Conventional Systems System Planner ASTRO 3.1 Convl Sys.Planner.pdf|ASTRO 25 Conventional Systems System Planner ASTRO 3.1 Convl Sys.Planner]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:Zhone TeNSr 800 imacs-system-reference-guide-7.2.1.pdf|Zhone TeNSr 800 imacs-system-reference-guide-7.2.1]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:68P81003Y54-O Managing Network Transport Equipment.pdf|68P81003Y54-O Managing Network Transport Equipment]]&lt;br /&gt;
&lt;br /&gt;
* [[Media:GPS Simulcast Installation Manual 68P81098E65-C.pdf|GPS Simulcast Installation Manual 68P81098E65-C]]&lt;br /&gt;
&lt;br /&gt;
* [[Winrss help|RSS Software Help file.]] - this is the help file from WinRSS and is quite useful for station programing tips.&lt;br /&gt;
&lt;br /&gt;
== Hardware info ==&lt;br /&gt;
&lt;br /&gt;
=== Part numbers ===&lt;br /&gt;
Here are part numbers and what the correspond to.  &lt;br /&gt;
&lt;br /&gt;
=== Power Supplies ===&lt;br /&gt;
&lt;br /&gt;
The -48v supplies are easy to see as they have a side to side DC breaker style switch.  The Motorola/Onan column refers to the manufacturer of the PS.  Many people rag on the Onan power supplies, but I've not had one fail in service yet.  The Onan do have a heat activated fan, whereas the Motorola run continuously.  This can be good for base use or in the lab, as the base station will not make noise unless it's keyed down for some time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;4&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Quantar power supplies&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| P/N ||Description||Motorola/Onan||Watts&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1031||48/60v input||Yes||600&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1049||AC no charger||Yes||265&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1050||AC with Charger||Yes||265&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1047||AC no charger||Yes||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1048||AC with Charger||Yes||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7802||12/24v DC||No||210&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7803||48/60v input||No||210&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TRN7801||24v input||No||600&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|CPN1042||AC||No||700&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TPN6185||AC w/Charger|| ?||625&lt;br /&gt;
|--style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
|TPN1186||No idea|| ? ||				&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Several PSUs have a DC input on the back using a special connector pictured below.  This is an [https://www.te.com/en/product-530521-3.html AMP/TE 530521-3] 4 position connector.  The contacts are 5-530519-2&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
Quantar-DC-Connector-00001.jpg&lt;br /&gt;
Quantar-DC-Connector-00002.jpg&lt;br /&gt;
Quantar-DC-Connector-00003.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Quantro/Quantar-Backplane|BackPlane]] ===&lt;br /&gt;
&lt;br /&gt;
The [[Quantro/Quantar-Backplane|BackPlane]] modules are different for the Quantar and Quantro. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Station Control info ===&lt;br /&gt;
&lt;br /&gt;
'''Station Control Module''' or '''''SCM''''' is the heart of the Quantar station.  The SCM comes in different revisons known as EPIC. &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* [[EPIC 1|EPIC I  - TTN4094]]&lt;br /&gt;
* [[EPIC II|EPIC II - CLN6686F]]&lt;br /&gt;
* EPIC III - Note the EPIC3 will not work out of band.  The modulation will be very low.&lt;br /&gt;
* EPIC IV - '''This is only for the Smart Zone trunking.  IT will not work for conventional'''&lt;br /&gt;
* [[EPIC V| EPIC V - MCLN8447]]&lt;br /&gt;
* EPIC 6 - lol it doesn't exist.  &amp;lt;ref&amp;gt;my theory on this is eBay sellers searched the part number CLN7692 and found this page and then read 'IV' as 6 not 4. https://www.youtube.com/watch?v=Exiy5eVMzg4&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Quantar&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||Conv/6809||IntelliRepeater||Astro 25 Trunking ONLY&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6&amp;quot;&lt;br /&gt;
| EPIC I||Board||TTN4094||TRN7900||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6;&lt;br /&gt;
| ||FRU||TLN3397||TLN3398||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6961||CLN6960||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU||CLN1293||CLN1294||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#E2EFDA;&lt;br /&gt;
| EPIC III||Board||CLN1614||N/A||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#E2EFDA;&lt;br /&gt;
| ||FRU||CLN1621||N/A||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FFF2CC;&lt;br /&gt;
| EPIC IV||Board||N/A||N/A||CLN7692&lt;br /&gt;
|- style=&amp;quot;background-color:#FFF2CC;&lt;br /&gt;
| ||FRU||N/A||N/A||DLN1229&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| [[EPIC V|EPIC V]]||Board||MCLN8426||MCLN8447||N/A&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||CLN8480||CLN8479||N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 60%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;5&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;ASTRO-TAC Receiver&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||Conv/6809||Astro 25 Trunking ONLY&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6&amp;quot;&lt;br /&gt;
| EPIC I||Board||TTN4094||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#FCE4D6;&lt;br /&gt;
| ||FRU||TLN3397||N/A&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6873||CLN6873&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU||CLN1273||CLN1273&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| EPIC V||Board||MCLN8426||MCLN8426&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||CLN8480||CLN8480&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;background-color:#D6DCE4; width: 75%;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;8&amp;quot; style=&amp;quot;text-align:Center&amp;quot; | '''&amp;lt;u&amp;gt;Others&amp;lt;/U&amp;gt;'''&lt;br /&gt;
|- style=&amp;quot;background-color:#D6DCE4;border-bottom:solid 2px;font-weight: bold;&amp;quot;&lt;br /&gt;
| EPIC||P/N Type||SecureNet||Limited||PDR 3500||DBS||ATAC 3000 ||ATAC9600&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| EPIC II||Board||CLN6961||CLN7462||CLN6686||CLN7361||CLN7361||[[ASTRO-TAC#CCN4009|CCN4009]]&lt;br /&gt;
|- style=&amp;quot;background-color:#DDEBF7;&lt;br /&gt;
| ||FRU|| ||CLN1609||CLN1177||CLN1914||CLN1914||CCN1009&lt;br /&gt;
|- style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| EPIC V||Board||MCLN8426||N/A||N/A||N/A||N/A||N/A&lt;br /&gt;
|-style=&amp;quot;background-color:#EDEDED;&lt;br /&gt;
| ||FRU||Unknown||N/A||N/A||N/A||N/A||N/A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The only difference between the various versions of the EPICs (excluding EPIC IV) is the hardware is newer.  There is no difference in functionality for conventional analog/astro/P25 operation.&lt;br /&gt;
&lt;br /&gt;
==== SIMM info ====&lt;br /&gt;
&lt;br /&gt;
The SIMM used for firmware in the Quantar EPIC 2/3 is an 80 pin SIMM and is basically unobtanimum.  It is possiable to use a Motorola [[COIM Modification|Console Operator Interface Module SIMM]] if you want to modify it. &lt;br /&gt;
&lt;br /&gt;
The conventional uses 4, 29F040 chips arranged to be 32 bits wide. This means each chip stores every 4th byte. &lt;br /&gt;
&lt;br /&gt;
Example we store &amp;quot;QUANTAR MOTOROLA&amp;quot; in the SIMM&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Chip 1 !! Chip 2 !! Chip 3 !! Chip 4&lt;br /&gt;
|-&lt;br /&gt;
| Q || U || A || N&lt;br /&gt;
|-&lt;br /&gt;
| T || A || R || &lt;br /&gt;
|-&lt;br /&gt;
| M || O || T || O&lt;br /&gt;
|-&lt;br /&gt;
| R || O || L || A&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
So if we read Chip 1 we'd see QTMR.&lt;br /&gt;
&lt;br /&gt;
The IR uses a two bank SIMM with the same layout (8 chips total)&lt;br /&gt;
&lt;br /&gt;
It's possible to pull these chips and read/write them if you have the right programmer. Taking advantage of this I was able to build a SIMM programmer for the soldered in place SIMM's that essentially programs one chip at a time (8bits). &lt;br /&gt;
[[File:SIMM Programmer.jpeg|thumbnail|80 Pin SIMM Programmer]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It's not pretty but it works. &lt;br /&gt;
&lt;br /&gt;
The SIMM has the ability to be upgraded via the SCM download procedure, but the IR SIMM and NON-IR SIMMs cannot be interchanged.  This is do to the boot code being different.  Using the SIMM programmer or the socketed SIMM you can reprogram the SIMM's for either.&lt;br /&gt;
&lt;br /&gt;
==== SIMM-less SCM ====&lt;br /&gt;
&lt;br /&gt;
It is possible to use 29F040 chips in the sockets on the EPIC 1 with just a flick of the Flash switch, this makes it easy to use the current Quantar Firmware in the EPIC 1 with just standard DIP chips.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the later revision EPIC's the DIP sockets are only used for 27c040 chips which have a slightly different pinout.  It's possible to use the SIMM images as u1-4 maps to U451-454 with a slight modification to the chips.  Typically I'll bend up pins 1, (A18 on Flash, VPP on EEPROM) and 31 (!WE on Flash, A18 on EEPROM), and then connect a wire from the board at pin 31 to pin 1 on the chip.  A connection to !WE on the chip is optional unless you want to be able to upgrade the chips.  In this case you'll need to make a conection from SIMM pins 53, 29, 6, &amp;amp; 5 to the !WE lines on U451-U454 respectively.  &lt;br /&gt;
&lt;br /&gt;
The Quantar doesn't care about the ID pins on the SIMM, but I typically will tie 74, 75, 76, 79 to ground/pin 80.  If you're doing an ATAC 3k, the ATAC does care about this and you need pins 76 and 79 tied to ground.   &lt;br /&gt;
&lt;br /&gt;
Of course the Intelerepeater and ATAC9k will not work in this configuration as they need two banks on the SIMM, so you can't do this if that's your requirement.  For most ham stuff, there's no reason you need anything more than NIR code for Quantar and ATAC 3000.&lt;br /&gt;
&lt;br /&gt;
=== Receiver ===&lt;br /&gt;
Like the rest of the unit the receivers are frequency dependent and consist of their own modules.  The basic receiver has a preselector which is 4 MHz wide on VHF and 6 MHz wide on UHF. &lt;br /&gt;
&lt;br /&gt;
The receiver is an excellent high side injection design (exception for 800/900 which is low side).  The first IF is +21.45 MHz on VHF and +73.35 MHZ on UHF/800/900.  The second IF is 455 KHz.  In many cases barefoot (minus preselector) the receiver sensitivity is under -120dBm for 12 dB SINAD.  Couple this with the great built in selectivity and it's truly a bullet proof design idea for high RF sites.&lt;br /&gt;
&lt;br /&gt;
The receiver is pretty dumb, there is not a μP on the board, making it easier to troubleshoot.  The devices receive their programming from the main CPU on the SCM via SPI bus.  The two main chips are the U2500 receiver IC and U2401 PLL IC.  U2401, the PLL, is a custom chip responsible for locking the VCOs to the proper frequency, and selecting the high or low VCO.  U2500, the receiver IC, contains the 2nd IF/VCO and final processing of the intended signal.  Unlike other designs, the receiver IC presents the recovered audio/data as two digital signals to the SCM where A/D conversion happens (if needed). &lt;br /&gt;
&lt;br /&gt;
There are a couple other chips which present various &lt;br /&gt;
&lt;br /&gt;
UHF R0 was added later and extends the coverage and tuning range of the unit down to 380 MHz.  The preselctor for this covers the whole range as well.  &lt;br /&gt;
&lt;br /&gt;
Each item has more information on it's own page and covers conversions there as well. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! CLD !! FRU P/N !! Range !! Preselector !! Description &lt;br /&gt;
|-&lt;br /&gt;
| TRD6361 || CLD1250 || TLN3250 || VHF R1  || [[VHF Preselector|TFD6511]] || [[VHF Receiver|VHF Receiver 132-154 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TRD6362 || CLD1260 || TLN3251 || VHF R2 || [[VHF Preselector|TFD6512]] || [[VHF Receiver|VHF Receiver 150-174 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CRX4022 || CRX1027 || DLN1215 || UHF R0 || [[UHF Preselector|CRX4001]] || [[UHF R0 Receiver|UHF Receiver 380-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6281 || CLE1190 || TLN3313 || UHF R1 || [[UHF Preselector|TLE5991]] || [[UHF Receiver|UHF Receiver 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6282 || CLE1200 || TLN3314 || UHF R2 || [[UHF Preselector|TLE5992]] || [[UHF Receiver|UHF Receiver 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6283 || CLE1210 || TLN3373 || UHF R3 || [[UHF Preselector|TLE5993]] || [[UHF Receiver|UHF Receiver 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRE6284 || CLE1220 || TLN3374 || UHF R4 || [[UHF Preselector|TLE5993]] ||[[UHF Receiver|UHF Receiver 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRF6551 || CLF1530 || TLN3315 || 800 || N/A || [[800 MHz Receiver|800 MHz Receiver 806-825 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TRF6552 || CLF1540 || TLN3316 || 900 || N/A || [[900 MHz Receiver|900 MHz Receiver 935-941 MHz]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Exciter ===&lt;br /&gt;
&lt;br /&gt;
The exciters contain their own CPU which communicates with the SCM over a SPI bus.  This CPU runs it's own firmware and requires a socketed UV EPROM to upgrade it.  This also controls the PA meeting and the bit of EEPROM in the CPU stores the alignment settings for the exciter and PA.  Generally a Exciter/PA pair will not need to be realigned if moved from one chassis to another, although it should be checked.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! CLD !! FRU P/N !! Range !! Description&lt;br /&gt;
|-&lt;br /&gt;
| TLD9831 || CLD1270 || TLN3252 || VHF R1  || [[VHF Exciter|VHF Exciter 132-154 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TLD9832 || CLD1280 || TLN3253 || VHF R2 || [[VHF Exciter|VHF Exciter 150-174 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLX4000 || CLX1000 || DLN1214 || UHF R0 || [[UHF R0 Exciter|UHF Exciter 380-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5971 || CLE1230 || TLN3305 || UHF R1 || [[UHF Exciter|UHF Exciter 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5972 || CLE1240 || TLN3306 || UHF R2 || [[UHF Exciter|UHF Exciter 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5973 || CLE1210 || TLN3375 || UHF R3 || [[UHF Exciter|UHF Exciter 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLE5974 || CLE1220 || TLN3376 || UHF R4 || [[UHF Exciter|UHF Exciter 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLF6920 || CLF1510 || TLN3307 || 900 || [[800 MHz Exciter|800 MHz Exciter 850-870 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TLF6930 || CLF1520 || TLN3308 || 900 || [[900 MHz Exciter|900 MHz Exciter 935-941 MHz]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Station Access Module ===&lt;br /&gt;
[[Station Access Module|Check here for SAM info]]&lt;br /&gt;
&lt;br /&gt;
==== Troof Table ====&lt;br /&gt;
There is a ID code representing the exciter type, it consists of R3700 to R3710.  These are either pull up or down resistors on a 6 bit code and are identified on the schematic on the left side of U3700, the μP.  &lt;br /&gt;
Below is the table in MSB-LSB format, with a 1 being high (5v) and a 0 being a low (0v).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!'''Dip switch'''!&lt;br /&gt;
!'''Band'''!&lt;br /&gt;
!'''Binary'''!&lt;br /&gt;
!'''Notes in the RSS'''!&lt;br /&gt;
|-&lt;br /&gt;
| 0||VHF_R1||000000||&lt;br /&gt;
|-&lt;br /&gt;
| 1||VHF_R2||000001||VHF R2 SL&lt;br /&gt;
|-&lt;br /&gt;
| 2||UHF_R1||000010||&lt;br /&gt;
|-&lt;br /&gt;
| 3||UHF_R2||000011||&lt;br /&gt;
|-&lt;br /&gt;
| 4||800||000100||&lt;br /&gt;
|-&lt;br /&gt;
| 5||VHF_R3||000101||sl&lt;br /&gt;
|-&lt;br /&gt;
| 6||VHF_R4||000110||&lt;br /&gt;
|-&lt;br /&gt;
| 7||VHF_R1||000111||&lt;br /&gt;
|-&lt;br /&gt;
| 8||VHF_R2||001000||VHF R2 FL&lt;br /&gt;
|-&lt;br /&gt;
| 9||VHF_R3||001001||&lt;br /&gt;
|-&lt;br /&gt;
| 10||VHF_R4||001010||&lt;br /&gt;
|-&lt;br /&gt;
| 11||900||001011||&lt;br /&gt;
|-&lt;br /&gt;
| 12||UHF_R3||001100||&lt;br /&gt;
|-&lt;br /&gt;
| 13||UHF_R4||001101||&lt;br /&gt;
|-&lt;br /&gt;
| 14||blank||001110||&lt;br /&gt;
|-&lt;br /&gt;
| 15||blank||001111||&lt;br /&gt;
|-&lt;br /&gt;
| 16||blank||010000||&lt;br /&gt;
|-&lt;br /&gt;
| 17||blank||010001||&lt;br /&gt;
|-&lt;br /&gt;
| 18||blank||010010||&lt;br /&gt;
|-&lt;br /&gt;
| 19||blank||010011||uhf r0 from book&lt;br /&gt;
|-&lt;br /&gt;
| 20||blank||010100||&lt;br /&gt;
|-&lt;br /&gt;
| 21||blank||010101||&lt;br /&gt;
|-&lt;br /&gt;
| 22||blank||010110||&lt;br /&gt;
|-&lt;br /&gt;
| 23||blank||010111||&lt;br /&gt;
|-&lt;br /&gt;
| 24||blank||011000||&lt;br /&gt;
|-&lt;br /&gt;
| 25||blank||011001||&lt;br /&gt;
|-&lt;br /&gt;
| 26||blank||011010||&lt;br /&gt;
|-&lt;br /&gt;
| 27||blank||011011||&lt;br /&gt;
|-&lt;br /&gt;
| 28||blank||011100||&lt;br /&gt;
|-&lt;br /&gt;
| 29||blank||011101||&lt;br /&gt;
|-&lt;br /&gt;
| 30||blank||011110||&lt;br /&gt;
|-&lt;br /&gt;
| 31||blank||011111||&lt;br /&gt;
|-&lt;br /&gt;
| 32||blank||100000||&lt;br /&gt;
|-&lt;br /&gt;
| 33||blank||100001||&lt;br /&gt;
|-&lt;br /&gt;
| 34||blank||100010||&lt;br /&gt;
|-&lt;br /&gt;
| 35||blank||100011||&lt;br /&gt;
|-&lt;br /&gt;
| 36||blank||100100||&lt;br /&gt;
|-&lt;br /&gt;
| 37||blank||100101||boot&lt;br /&gt;
|-&lt;br /&gt;
| 38||blank||100110||&lt;br /&gt;
|-&lt;br /&gt;
| 39||blank||100111||&lt;br /&gt;
|-&lt;br /&gt;
| 40||blank||101000||&lt;br /&gt;
|-&lt;br /&gt;
| 41||blank||101001||&lt;br /&gt;
|-&lt;br /&gt;
| 42||blank||101010||&lt;br /&gt;
|-&lt;br /&gt;
| 43||blank||101011||&lt;br /&gt;
|-&lt;br /&gt;
| 44||blank||101100||&lt;br /&gt;
|-&lt;br /&gt;
| 45||blank||101101||&lt;br /&gt;
|-&lt;br /&gt;
| 46||blank||101110||&lt;br /&gt;
|-&lt;br /&gt;
| 47||blank||101111|| &amp;quot;RSS only&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 48||blank||110000||&lt;br /&gt;
|-&lt;br /&gt;
| 49||blank||110001||&lt;br /&gt;
|-&lt;br /&gt;
| 50||blank||110010||&lt;br /&gt;
|-&lt;br /&gt;
| 51||blank||110011||&lt;br /&gt;
|-&lt;br /&gt;
| 52||blank||110100||RAP says VHF_R2 SL&lt;br /&gt;
|-&lt;br /&gt;
| 53||blank||110101||&lt;br /&gt;
|-&lt;br /&gt;
| 54||blank||110110||&lt;br /&gt;
|-&lt;br /&gt;
| 55||blank||110111||&lt;br /&gt;
|-&lt;br /&gt;
| 56||blank||111000||&lt;br /&gt;
|-&lt;br /&gt;
| 57||blank||111001||&lt;br /&gt;
|-&lt;br /&gt;
| 58||blank||111010||&lt;br /&gt;
|-&lt;br /&gt;
| 59||blank||111011||&lt;br /&gt;
|-&lt;br /&gt;
| 60||blank||111100||&lt;br /&gt;
|-&lt;br /&gt;
| 61||blank||111101||&lt;br /&gt;
|-&lt;br /&gt;
| 62||blank||111110||&lt;br /&gt;
|-&lt;br /&gt;
| 63||INVALID||111111||Exciter is in reset all LED's are on and the PA fans turn on&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [[PDR 3500|PDR3500]] ===&lt;br /&gt;
The PDR3500 is a portable version of the repeater.  Here's some details and internal pics of it.&lt;br /&gt;
&lt;br /&gt;
== Power Amp ==&lt;br /&gt;
The power amps are actually a cool design.&lt;br /&gt;
&lt;br /&gt;
Their are two basic power amps, a 25W, and a 100/110/125w (depending on band).  The power amps all use the same general board layout, with the frequency dependent parts separate from the support components.  The 25W PA is a passively cooled unit with a massive heatsink, while the 100/110/125W unit has active cooling with a horizontal heatsink and two cooling fans moving air front to back.&lt;br /&gt;
&lt;br /&gt;
There are a couple different revisions of the PA's so the main PCB has changed a bit over time.  &lt;br /&gt;
&lt;br /&gt;
[[File:125W VHF PA layout.png|400px|thumbnail|left|PCB Layout High Power]]&lt;br /&gt;
&lt;br /&gt;
[[File:25W UHF PA Layout.png|400px|thumbnail|center|PCB Layout Low Power]]&lt;br /&gt;
&lt;br /&gt;
[[|thumbnail|center]]&lt;br /&gt;
&lt;br /&gt;
The PA doesn't contain any CPU, it's controlled via the exciter CPU with basic analog level lines going over to the exciter.&lt;br /&gt;
Some of what's measured by the exciter&lt;br /&gt;
* Intermediate PA drive level - this is the output of the IPA to the final PA pallet&lt;br /&gt;
* Driver PA Level - output of the final PA before the circulator (FPA_DETECT).&lt;br /&gt;
* TX Power Forward - Output measured at the output of the Low Pass Filter&lt;br /&gt;
* TX Power Reverse - Reflected Power from the antenna port&lt;br /&gt;
* OMNI voltage - this is the control voltage on the IPA which comes from the SCM as a 0-5V control signal (V_CONT).  This 0-5v controls a transistor making a 0-14v signal to provide the gain of the IPA.  This is the basis of the power control.  The Control Voltage from the SCM is only present during keydown.&lt;br /&gt;
* IPA Current detect&lt;br /&gt;
* DPA Side A &amp;amp; B current sense&lt;br /&gt;
* Temperature of the PA 3.981v is 79f 2.0 is about 170f This looks like an 8 bit value with 0xFF == 5.000 V or .019608v per bit. &lt;br /&gt;
** PA Fans turn on at 2v and off at 2.90v.  &lt;br /&gt;
* Fan on/off and alarm&lt;br /&gt;
* PA_ID bits A &amp;amp; B - resistor divider that programs to reference voltages in .5v increments to ID the PA hardware to the exciter.&lt;br /&gt;
&lt;br /&gt;
All these are measured over an TDM bus that selects each at a 200ms interval using a single analog input on the exciter CPU.&lt;br /&gt;
&lt;br /&gt;
PA types&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Svc Man P/N !! Other P/N !! Rated Power !! Range !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CLD1295A || || || 120? || VHF? || Unknown&lt;br /&gt;
|- &lt;br /&gt;
| TLD3102 || CLD1299 || 125     || VHF R2 || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| TLD3110 ||  || 25    || VHF R1/R2 || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| TLD3101 ||  TLN3379 CLD1298 || 125    || VHF R1 (NEW) || [[VHF PA| VHF PA]]&lt;br /&gt;
|-&lt;br /&gt;
| CTX1146 || DLN1216 || 110     || UHF R0  || [[Second Generation PA|Second Generation UHF PA 380-433 MHz]]&lt;br /&gt;
|- &lt;br /&gt;
| TTE2061 || TLN3444 || 110     || UHF R1 || [[First Generation PA|First Generation UHF PA 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLE6164 || Example || 110 || UHF R1 || [[Second Generation PA|Second Generation UHF PA 403-433 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2062 || TLN3446 || 110     || UHF R2 || [[First Generation PA|First Generation UHF PA 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CLE6165 || CLE1308 || 110 || UHF R2 || [[Second Generation PA|Second Generation UHF PA 438-470 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2063 ||         || 110     || UHF R3 || [[First Generation PA|First Generation UHF PA 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE6373 ||         || 110 || UHF R3 || [[Second Generation PA|Second Generation UHF PA 470-490 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE2064 ||         || 100     || UHF R4 || [[First Generation PA|First Generation UHF PA 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| TTE6374 ||         || 100 || UHF R4 || [[Second Generation PA|Second Generation UHF PA 490-520 MHz]]&lt;br /&gt;
|-&lt;br /&gt;
| CTF1091A/TLF1930 || TLN3442 || 100 || 800 || [[800 MHz 100W PA| 800 MHz 100W PA]]&lt;br /&gt;
|-&lt;br /&gt;
| CTF1092A/TLF1800 || TLN3299 || 100 || 900 || [[900 MHz 100W PA| 900 MHz 100W PA]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! PA Type !! PA_ID_A !! PA_ID_B !! R4162 !! R4163 !! R4164 !! R4165 !! Official?&lt;br /&gt;
|-&lt;br /&gt;
| 900 100W || 3.0 || .5 || 20.5k || 10k || 1k || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| 800 100W || 0.5 || 1.0 || OPEN || 0 || 1.5K || 15K || YES&lt;br /&gt;
|-&lt;br /&gt;
| 800 20W || 0.0 || 1.0 || OPEN || 1k || 1.5K || 15K || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R0 || 0.0 || 1.5 || OPEN || 0 || 390 || 1k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R1 || 1.0 || 0.5 || 15k || 1.5k || 560 || 10k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R2 || 1.5 || 0.5 || 1k || 390 || 100 || 1k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 110W R3 || 3.0 || 1.0 || 2.2k || 2.7k || 1.5k || 15k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 100W R4 || 3.5 || 1.0 || 18k || 15k || 1.5k || 15k || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 25W R1 || 5.0 || 0.0 || 33.2k || OPEN || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| UHF 25W R2 || 0.0 || 0.5 || OPEN || 0 || 1k  || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 125W R1 || 3.0 || 0.0 || 20.5k || 10k || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 125W R2 || 0.0 || 0.0  || OPEN || 0 || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 25W R1/R2 || 4.5  || 0.0 || 12k || 68k || 0 || OPEN || YES&lt;br /&gt;
|-&lt;br /&gt;
| VHF 25W R1 || 3.5 || 0.0 ||  || ||  || NO&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UHF 110W Generation 1 &lt;br /&gt;
UHF 110W Generation 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
CTF1091A 100 W 800 MHz&lt;br /&gt;
CTF1092A 100 W 900 MHz&lt;br /&gt;
CTX1146A Range 0 Power Amplifier&lt;br /&gt;
TLF1800B 100W Power Amplifier Module&lt;br /&gt;
TLF1930C 100W Power Amplifier Module&lt;br /&gt;
TLF1940B 20W Power Amplifier Module&lt;br /&gt;
TTE2061A 110W Power Amplifier UHF R1&lt;br /&gt;
TTE2062A 110W Power Amplifier UHF R2&lt;br /&gt;
TTE2063A 110W Power Amplifier UHF R3&lt;br /&gt;
TTE2064A 110W Power Amplifier UHF R4&lt;br /&gt;
&lt;br /&gt;
TLE2511A/ 110W Power Amplifier Module&lt;br /&gt;
TLE2512A&lt;br /&gt;
TLE2521&lt;br /&gt;
TLE2572&lt;br /&gt;
TLE2731B 25W Power Amplifier Module UHF R1&lt;br /&gt;
TLE2732B 25W Power Amplifier Module UHF R2&lt;br /&gt;
TLD3101G 125W Power Amplifier Module VHF R1&lt;br /&gt;
TLD3102G 125W Power Amplifier Module VHF R2&lt;br /&gt;
TLD3110C 25W Power Amplifier Module VHF R1/R2&lt;br /&gt;
CLX4002A 100/110W Power Amplifier Module (UHF; R1-R4)&lt;br /&gt;
CLE6164A 100/110W Power Amplifier CLE6165A Module (UHF; R1-R4)&lt;br /&gt;
&lt;br /&gt;
TTE6373A/ 100/110W Power Amplifier&lt;br /&gt;
TTE6374A Module (UHF; R1-R4)&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting notes ===&lt;br /&gt;
&lt;br /&gt;
Most of the time the PA's are rock solid.   I have some notes below on trouble shooting them.&lt;br /&gt;
&lt;br /&gt;
* swap with a known good PA, does the problem go away?&lt;br /&gt;
* Align the PA/init the PA&lt;br /&gt;
* Check the amp draw on both sides&lt;br /&gt;
* Always run it at 100% rated power for testing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===='''Silly PA syndrome''' ====&lt;br /&gt;
Some times people run the PA at lower output to &amp;quot;make it easier on it&amp;quot;.  So long as cooling is working, running it at rated output is the least stressful way to operate it.  Running at reduced power output is actually harder on the PA.  &lt;br /&gt;
&lt;br /&gt;
The PA has an intermediate stage and a final amp stage.  The final amp runs at the same gain level all the time.  The power out is changed by varying the IPA voltage.  As this is done via a linear regulator, as the power output goes down, there is more and more power dissipated in the Q4100 (UHF) pass transistor.  This is due to running the IPA at lower and lower voltage to drop the power to the final.  Typically what happens is a station will key up, then fail and try to fall back in power, but this just makes it worse. &lt;br /&gt;
&lt;br /&gt;
What I've done to test this:&lt;br /&gt;
* Run the PA at 120% (ie 150w output) just for a bit.  ie init it and align it for 110w = 130W.  &lt;br /&gt;
* Test the station, key it down and check that it's solid for 2-3 min.  &lt;br /&gt;
* check the value of the OMNI Voltage in the station metering. &lt;br /&gt;
&lt;br /&gt;
If this is good, replace the Q4100, and check the operation of the power control circuits (q4101, V_CONT, VOMNI).  &lt;br /&gt;
&lt;br /&gt;
This normally fixes it.  &lt;br /&gt;
&lt;br /&gt;
[[Category:Quantar]]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=File:Motorola_Quantar_Instruction_Manual.pdf&amp;diff=8409</id>
		<title>File:Motorola Quantar Instruction Manual.pdf</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=File:Motorola_Quantar_Instruction_Manual.pdf&amp;diff=8409"/>
		<updated>2025-12-25T19:25:20Z</updated>

		<summary type="html">&lt;p&gt;Bryan: User created page with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=Motorola Quantar Instruction Manual 68P81095E05-B with updates}}&lt;br /&gt;
|date=2008-11-04&lt;br /&gt;
|source=Motorola&lt;br /&gt;
|author=Motorola&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{subst:uwl}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Quantar]]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Quantar_Serial_Commands&amp;diff=8408</id>
		<title>Quantar Serial Commands</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Quantar_Serial_Commands&amp;diff=8408"/>
		<updated>2025-12-25T19:16:42Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Quantar]]&lt;br /&gt;
The Quantar serial port on all but the trunking versions supports the following commands.  Some of these commands are obvious, some are not.  This all uses stardard ASCII terminal at 9600 bps 8N1.&lt;br /&gt;
&lt;br /&gt;
By default when connecting the WINRSS to the station it sets echo off, so you will need to reboot or turn it on to see the responses from the quantar.&lt;br /&gt;
&lt;br /&gt;
=Commands =&lt;br /&gt;
&lt;br /&gt;
These are very Javay. Any insights here are just reverse engineered, and could be wrong.  Update this page if something is wrong. &lt;br /&gt;
&lt;br /&gt;
== Rules for commands == &lt;br /&gt;
Commands below are listed as to what prompt you need to be at to execute them. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ASCII_CMDS_RULES_TABLE = { &lt;br /&gt;
{ new Integer(21002), &amp;quot;DOCSS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(25001), &amp;quot;DODEBUG&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(21003), &amp;quot;EXIT&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21020), &amp;quot;GET ADDR IP&amp;quot;, &amp;quot;IP ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21021), &amp;quot;GET ADDR PHYS&amp;quot;, &amp;quot;PHYS ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21022), &amp;quot;SET ADDR IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21023), &amp;quot;SET ADDR PHYS [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21024), &amp;quot;RESTART&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21025), &amp;quot; GET ADDR NETMASK&amp;quot;, &amp;quot;SUBNET MASK = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21026), &amp;quot; GET ADDR GATEWAY&amp;quot;, &amp;quot;DEF GATEWAY = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21027), &amp;quot;SET ADDR NETMASK [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21028), &amp;quot;SET ADDR GATEWAY [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21029), &amp;quot;GET BOX NUM&amp;quot;, &amp;quot;BOX NUMBER = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21030), &amp;quot;SET BOX NUM [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21031), &amp;quot;SET ECHO OFF&amp;quot;, &amp;quot;echo is off&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21032), &amp;quot;SET ECHO ON&amp;quot;, &amp;quot;echo is on&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21033), &amp;quot;GET BOX APP&amp;quot;, &amp;quot;BOX APPLICATION = [%s]&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21006), &amp;quot;DORSS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21007), &amp;quot;EXIT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21016), &amp;quot;DOLS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21017), &amp;quot;EXIT&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21162), &amp;quot;GET HW_VER &amp;quot;, &amp;quot;HW_VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21150), &amp;quot;GET BPN &amp;quot;, &amp;quot;BPN = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21151), &amp;quot;GET STN NAME &amp;quot;, &amp;quot;STN NAME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21152), &amp;quot;GET STN SN &amp;quot;, &amp;quot;STN SN  = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21153), &amp;quot;GET TIME &amp;quot;, &amp;quot; TIME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21154), “c”, &amp;quot; FW_VER SC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21155), &amp;quot;GET FW_VER EX&amp;quot;, &amp;quot; FW_VER EX = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21156), &amp;quot;GET FW_VER WL&amp;quot;, &amp;quot; FW_VER WL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21157), &amp;quot;GET CP VER&amp;quot;, &amp;quot; CP VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21158), &amp;quot;ALARM RD&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21163), &amp;quot;ALARM RD [%s]&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21159), &amp;quot; ALARM_EXT RD&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21160), &amp;quot; ALARM CLEAR&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21161), &amp;quot; ALARM_EXT CLEAR&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21300), &amp;quot;GET TIME&amp;quot;, &amp;quot; TIME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21250), &amp;quot;GET RX FREQ&amp;quot;, &amp;quot; RX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21251), &amp;quot;GET RX2 FREQ&amp;quot;, &amp;quot; RX2_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21252), &amp;quot;GET DSP BER [%s] [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot; BER [%s] = [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21253), &amp;quot;GET DSP RSSI [%s] [%s] [%s]&amp;quot;, &amp;quot; RSSI = [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21301), &amp;quot;SET DATE [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21302), &amp;quot;SET TIME [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21200), &amp;quot;FPM&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21201), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21550), &amp;quot;MTR WL_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21551), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21552), &amp;quot;MTR TX_PA_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21553), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21554), &amp;quot;MTR RX_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21555), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21563), &amp;quot;MTR RX2_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21564), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21556), &amp;quot;MTR PS_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21557), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21558), &amp;quot;MTR UHSO&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21559), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21562), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21350), &amp;quot; FP ACC_DIS ON&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21351), &amp;quot; FP ACC_DIS OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21352), &amp;quot; RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21353), &amp;quot; GET PA ON&amp;quot;, &amp;quot;PA ON = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21400), &amp;quot; GET PS EQUAL&amp;quot;, &amp;quot;PS EQUAL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21401), &amp;quot; SET PS EQUAL OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21402), &amp;quot; SET PS EQUAL ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21403), &amp;quot;GET PS BATT_TYPE&amp;quot;, &amp;quot;PS_BATT_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21450), &amp;quot; GET RX FREQ&amp;quot;, &amp;quot;RX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21454), &amp;quot; GET RX2 FREQ&amp;quot;, &amp;quot;RX2_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21451), &amp;quot; AL RSSI [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21452), &amp;quot; SET CHN CUR [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21453), &amp;quot; GET CHN CUR&amp;quot;, &amp;quot;CHN CUR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22001), &amp;quot; AL SQ RD&amp;quot;, &amp;quot;SQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22004), &amp;quot; GET WL SQL&amp;quot;, &amp;quot;WL SQL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22006), &amp;quot; AL SQ DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22007), &amp;quot; AL SQ UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22008), &amp;quot; AL SQ WR 127&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22005), &amp;quot; AL SQ WR 0&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22009), &amp;quot; SET WL SQL NORMAL&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22010), &amp;quot; SET WL SQL CSQ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22011), &amp;quot; AL SQ SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21600), &amp;quot; GET TX FREQ&amp;quot;, &amp;quot;TX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21601), &amp;quot; AL STNPWR RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21602), &amp;quot; SET TX PWR [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21603), &amp;quot; KEYUP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21604), &amp;quot; AL STNPWR WR [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21605), &amp;quot; AL STNPWR SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21606), &amp;quot; DEKEY&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21607), &amp;quot; SET FREQ TX [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21608), &amp;quot; SET FREQ TX 0&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21610), &amp;quot; AL PEND RD&amp;quot;, &amp;quot;PEND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21611), &amp;quot; AL PEND NOREF&amp;quot;, &amp;quot;TXFREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21612), &amp;quot; AL PEND STATUS&amp;quot;, &amp;quot;PEND [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21613), &amp;quot; AL PEND DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21614), &amp;quot; AL PEND UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21615), &amp;quot; AL PEND AUTO&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21616), &amp;quot; AL PEND SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21617), &amp;quot; SET REF [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21618), &amp;quot; SET REF INT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21619), &amp;quot; SET REF 5MHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21620), &amp;quot; SET REF 10MHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21621), &amp;quot; SET REF EXT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21622), &amp;quot; AL PEND ABORT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21623), &amp;quot; AL UHSO RD&amp;quot;, &amp;quot;UHSO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21624), &amp;quot; AL UHSO DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21625), &amp;quot; AL UHSO UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21626), &amp;quot; AL UHSO WARM&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21627), &amp;quot; AL UHSO SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21630), &amp;quot; GET ADDR ISV&amp;quot;, &amp;quot;ISV MULTICAST ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21631), &amp;quot; GET ADDR SCM&amp;quot;, &amp;quot;STN CTRL MULTICAST ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21632), &amp;quot; SET ADDR ISV [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21633), &amp;quot; SET ADDR SCM [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(20209), &amp;quot;GET STN SYS&amp;quot;, &amp;quot;STN SYS = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21008), &amp;quot;DORAP&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21009), &amp;quot;EXIT&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(25001), &amp;quot;DODEBUG&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(25002), &amp;quot;EXIT&amp;quot;, null, &amp;quot;DEBUG&amp;gt;&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(20210), &amp;quot;GET FP VER&amp;quot;, &amp;quot;FP VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21202), &amp;quot;FP SET IR_RPTR ENABLE&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21203), &amp;quot;FP SET IR_RPTR DISABLE&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21204), &amp;quot;FP ACC_DIS ON&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21205), &amp;quot;FP ACC_DIS OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21207), &amp;quot;RC SET PTT XMIT&amp;quot;, &amp;quot;  &amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21206), &amp;quot;RC SET PTT OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21560), &amp;quot;RC SET PA TEST ON&amp;quot;, &amp;quot;  &amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21561), &amp;quot;RC SET PA TEST OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21565), &amp;quot;GET PA TEST&amp;quot;, &amp;quot;PA TEST = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21510), &amp;quot; GET CP ISV&amp;quot;, &amp;quot;CP ISV = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21502), &amp;quot; GET CP SIZE&amp;quot;, &amp;quot;CP SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21511), &amp;quot; NEW CP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21512), &amp;quot; NEW WC [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21503), &amp;quot; GET MCS SIZE&amp;quot;, &amp;quot;MCS SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21504), &amp;quot; GET WC SIZE&amp;quot;, &amp;quot;WC SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21505), &amp;quot; GET FW_VER BOOT.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21506), &amp;quot; GET FW_VER BOOT2.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21507), &amp;quot; GET BPN&amp;quot;, &amp;quot;BPN = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21508), &amp;quot; GET ADDR IP&amp;quot;, &amp;quot;IP ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21509), &amp;quot; GET ADDR PHYS&amp;quot;, &amp;quot;PHYS ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21500), &amp;quot; RD CP [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21501), &amp;quot; RD WC [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21513), &amp;quot; WR CP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21514), &amp;quot; WR WC [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21515), &amp;quot; MOVE CP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21516), &amp;quot; MOVE CP_XL [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21521), &amp;quot; MOVE WC_XL [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21517), &amp;quot; MOVE WC&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21518), &amp;quot; RESET SITE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21519), &amp;quot; STOP CP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21520), &amp;quot; STOP WC&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21700), &amp;quot; GET MGR1 IP&amp;quot;, &amp;quot;IP MGR1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21701), &amp;quot; GET MGR2 IP&amp;quot;, &amp;quot;IP MGR2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21702), &amp;quot;SET MGR1 IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21703), &amp;quot;SET MGR2 IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21704), &amp;quot; SET ADDR IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21705), &amp;quot; SET ADDR PHYS [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21800), &amp;quot; AL REFMOD UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21802), &amp;quot; AL REFMOD DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21801), &amp;quot; AL REFMOD RD&amp;quot;, &amp;quot;REFMOD = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21803), &amp;quot; AL REFMOD F5&amp;quot;, &amp;quot;VCO1FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21804), &amp;quot; AL REFMOD F6&amp;quot;, &amp;quot;VCO2FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21805), &amp;quot; AL REFMOD SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21806), &amp;quot; SET TEST_TONE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21807), &amp;quot; SET EEP REFMOD -1&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21752), &amp;quot; AL TXDEV GO F1&amp;quot;, &amp;quot;TX1FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21753), &amp;quot; AL TXDEV GO F2&amp;quot;, &amp;quot;TX2FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21754), &amp;quot; AL TXDEV GO F3&amp;quot;, &amp;quot;TX3FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21755), &amp;quot; AL TXDEV GO F4&amp;quot;, &amp;quot;TX4FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21758), &amp;quot; SET EEP TXDEV -1&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21750), &amp;quot; AL TXDEV RD&amp;quot;, &amp;quot; TXDEV = [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21751), &amp;quot; AL TXDEV WR [%s] [%s] [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21760), &amp;quot; AL TXDEV SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21850), &amp;quot; GET ASTRO_TONE&amp;quot;, &amp;quot; ASTRO_TONE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21851), &amp;quot; SET ASTRO_TONE [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21852), &amp;quot; SET ASTRO_TONE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21853), &amp;quot; GET V52&amp;quot;, &amp;quot; V52 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21854), &amp;quot; SET V52 ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21855), &amp;quot; SET V52 OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21902), &amp;quot; GET FW_VER SC.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21903), &amp;quot; GET FW_VER WL.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21950), &amp;quot; GET STATE PASS&amp;quot;, &amp;quot;STATE PASS = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21951), &amp;quot; SETPASS [%s] [%s] [%s]&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(22000), &amp;quot; GET REF_CAL&amp;quot;, &amp;quot;REF_CAL = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22001), &amp;quot;SET REF_CAL [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22002), &amp;quot;SET REF_CAL_SAVE&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22003), &amp;quot;SET REF_CAL_ABORT &amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21033), &amp;quot;GET BOX APP&amp;quot;, &amp;quot;BOX APPLICATION = [%s]&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22060), &amp;quot;AL RXWL C1 RD 1KHZ&amp;quot;, &amp;quot;1KHZ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22061), &amp;quot;AL RXWL C2 RD 1KHZ&amp;quot;, &amp;quot;1KHZ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22062), &amp;quot;AL RXWL C1 RD LB&amp;quot;, &amp;quot;LB = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22063), &amp;quot;AL RXWL C1 RD HB&amp;quot;, &amp;quot;HB = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22064), &amp;quot;AL RXWL C1 RD HBF&amp;quot;, &amp;quot;HBF = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22065), &amp;quot;AL RXWL C1 RD ST&amp;quot;, &amp;quot;ST = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22066), &amp;quot;SET TEST_TONE WL C1 1KHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22067), &amp;quot;SET TEST_TONE WL C2 1KHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22068), &amp;quot;SET TEST_TONE WL C1 LB&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22069), &amp;quot;SET TEST_TONE WL C1 HB&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22070), &amp;quot;SET TEST_TONE WL C1 ST&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22071), &amp;quot;AL RXWL C1 WR 1KHZ [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22072), &amp;quot;AL RXWL C2 WR 1KHZ [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22073), &amp;quot;AL RXWL C1 WR LB [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22074), &amp;quot;AL RXWL C1 WR HB [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22075), &amp;quot;AL RXWL C1 WR HBF [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22076), &amp;quot;AL RXWL C1 WR ST [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22077), &amp;quot;AL RXWL C1 SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22078), &amp;quot;AL RXWL C2 SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22079), &amp;quot;AL RXWL C1 RD AT&amp;quot;, &amp;quot;AT = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22080), &amp;quot;AL RXWL C1 WR AT [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22120), &amp;quot;AL LTO RD&amp;quot;, &amp;quot;LTO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22121), &amp;quot;AL LTO WR  [%s]&amp;quot;, &amp;quot;LTO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22122), &amp;quot;AL LTO TEST_OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22123), &amp;quot;AL LTO TEST_ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22124), &amp;quot;AL LTO SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22125), &amp;quot;AL LTO RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22050), &amp;quot; GET FW_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22053), &amp;quot; GET OC_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22051), &amp;quot; CHECK ID [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22052), &amp;quot; SWDL [%s] [%s] SLIP [%s]&amp;quot;, &amp;quot;FLASH ME [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21275), &amp;quot;GET RX FREQ_BAND&amp;quot;, &amp;quot; RX_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21276), &amp;quot;GET RX2 FREQ_BAND&amp;quot;, &amp;quot; RX2_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21278), &amp;quot;GET RX TYPE&amp;quot;, &amp;quot; RX_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21279), &amp;quot;GET PA TYPE&amp;quot;, &amp;quot; PA_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21280), &amp;quot;GET PA ORD_PWR&amp;quot;, &amp;quot; PA_ORD_PWR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21281), &amp;quot;GET TX COMPA&amp;quot;, &amp;quot; TX_COMPA = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21282), &amp;quot;GET WL PORT_STAT&amp;quot;, &amp;quot; WL_PORT_STAT = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21283), &amp;quot;GET PS RATED_PWR&amp;quot;, &amp;quot; PS_RATED_PWR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21284), &amp;quot;GET PS BATT_TYPE&amp;quot;, &amp;quot; PS_BATT_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21285), &amp;quot;GET REF_TYPE&amp;quot;, &amp;quot; REF_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21277), &amp;quot;GET TX FREQ_BAND&amp;quot;, &amp;quot; TX_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22201), &amp;quot;AL TXWL RD_REF C1 5&amp;quot;, &amp;quot;C1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22202), &amp;quot;AL TXWL RD_REF C2 5&amp;quot;, &amp;quot;C2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22203), &amp;quot;AL TXWL WR_REF C1 [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22204), &amp;quot;AL TXWL WR_REF C2 [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22205), &amp;quot;AL TXWL KEYUP 10&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22206), &amp;quot;AL TXWL DEKEY&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22207), &amp;quot;AL TXWL GO C1 5&amp;quot;, &amp;quot;TXWL DONE&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22208), &amp;quot;AL TXWL GO C2 5&amp;quot;, &amp;quot;TXWL DONE&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22050), &amp;quot; GET FW_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22051), &amp;quot; CHECK ID [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22052), &amp;quot; SWDL [%s] [%s] SLIP [%s]&amp;quot;, &amp;quot;FLASH ME [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22250), &amp;quot; GET STATION_STATUS 4&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22253), &amp;quot; GET STATION_STATUS 3&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22251), &amp;quot; SET STATION_DISABLE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22252), &amp;quot; SET STATION_DISABLE ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21522), &amp;quot; RD MCS [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21523), &amp;quot; CLEAR MCS&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; },&lt;br /&gt;
{ new Integer(21475), &amp;quot; AL TDATA GO&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21476), &amp;quot; SET TDATA ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21477), &amp;quot; SET TDATA OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(20211), &amp;quot;FP SQ [%s]&amp;quot;, &amp;quot; SQ = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20219), &amp;quot;FP CHN [%s]&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20214), &amp;quot;FP INTCOM ON&amp;quot;, &amp;quot; INTCOM = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20215), &amp;quot;FP INTCOM OFF&amp;quot;, &amp;quot; INTCOM = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20216), &amp;quot;FP SPKRVOL [%s]&amp;quot;, &amp;quot; SPKRVOL = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20217), &amp;quot;FP SPKRVOL [%s]&amp;quot;, &amp;quot; SPKRVOL = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20218), &amp;quot;GET CHN MAX&amp;quot;, &amp;quot; CHN MAX = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22300), &amp;quot;SET SC_FAN ON&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22301), &amp;quot;SET SC_FAN AUTO&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22350), &amp;quot;GET OC NUM&amp;quot;, &amp;quot;OC NUM = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22351), &amp;quot;GET OC [%s] SW VER&amp;quot;, &amp;quot; OC [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22352), &amp;quot;GET OC [%s] SW PART&amp;quot;, &amp;quot;OC [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22353), &amp;quot;GET OC [%s] SW VER OC&amp;quot;, &amp;quot;OC [%s] SW VER OC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22354), &amp;quot;GET OC [%s] SW PART OC&amp;quot;, &amp;quot;OC [%s] SW PART OC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22355), &amp;quot;GET OC [%s] SW VER B1&amp;quot;, &amp;quot;OC [%s] SW VER B1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22356), &amp;quot;GET OC [%s] SW VER B2&amp;quot;, &amp;quot;OC [%s] SW VER B2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22357), &amp;quot;GET OC [%s] SW PART B1&amp;quot;, &amp;quot;OC [%s] SW PART B1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22358), &amp;quot;GET OC [%s] SW PART B2&amp;quot;, &amp;quot;OC [%s] SW PART B2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22359), &amp;quot;GET OC [%s] WL [%s] SW VER WL&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22360), &amp;quot;GET OC [%s] WL [%s] SW VER&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22364), &amp;quot;GET OC [%s] WL [%s] SW PART WB&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22363), &amp;quot;GET OC [%s] WL [%s] SW VER WB&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22361), &amp;quot;GET OC [%s] WL [%s] SW PART WL&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22362), &amp;quot;GET OC [%s] WL [%s] SW PART&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22450), &amp;quot;GET CM_MODE&amp;quot;, &amp;quot;CM_MODE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22451), &amp;quot;GET CM_NUM&amp;quot;, &amp;quot;CM_NUM = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22452), &amp;quot;GET LD&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22453), &amp;quot;LCM ON&amp;quot;, &amp;quot;LCM ON&amp;quot;, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22454), &amp;quot;LCM OFF&amp;quot;, &amp;quot;LCM OFF&amp;quot;, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22455), &amp;quot;FVP [%s] ON&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22456), &amp;quot;FVP [%s] OFF&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22457), &amp;quot;VDP [%s] ON&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22458), &amp;quot;VDP [%s] OFF&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21018), &amp;quot;LIST_ALL_ALERTS&amp;quot;, null, &amp;quot;DEBUG&amp;gt;&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(22500), &amp;quot;&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; } };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==RW commands table ==&lt;br /&gt;
These commands are for reading and writing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
READ_WRITE_CMDS_RULES_TABLE = { &lt;br /&gt;
{ new Integer(2), { &amp;quot;closeport&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21001) },&lt;br /&gt;
{ new Integer(1), { &amp;quot;openport&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21000) }, &lt;br /&gt;
{ new Integer(3), { &amp;quot;hardwareVersion&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21162) }, &lt;br /&gt;
{ new Integer(6), { &amp;quot;CPVersion&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21157) },&lt;br /&gt;
{ new Integer(7), { &amp;quot;CPSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21502) }, &lt;br /&gt;
{ new Integer(8), { &amp;quot;MCSSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21503) }, &lt;br /&gt;
{ new Integer(9), { &amp;quot;WCSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21504) }, &lt;br /&gt;
{ new Integer(10), { &amp;quot;FWVerSc&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21154) }, &lt;br /&gt;
{ new Integer(11), { &amp;quot;FWVerBoot1&amp;quot;, &amp;quot;Boot1Date&amp;quot;, &amp;quot;Boot1Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21505) }, &lt;br /&gt;
{ new Integer(12), { &amp;quot;FWVerBoot2&amp;quot;, &amp;quot;Boot2Date&amp;quot;, &amp;quot;Boot2Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21506) }, &lt;br /&gt;
{ new Integer(13), { &amp;quot;FWVerWl&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21156) }, &lt;br /&gt;
{ new Integer(14), { &amp;quot;Bpn&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21507) }, &lt;br /&gt;
{ new Integer(15), { &amp;quot;AddrIp&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21508) }, &lt;br /&gt;
{ new Integer(16), { &amp;quot;AddrPhys&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21509) }, &lt;br /&gt;
{ new Integer(5), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21501) }, &lt;br /&gt;
{ new Integer(4), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21500) }, &lt;br /&gt;
{ new Integer(17), { &amp;quot;date&amp;quot;, &amp;quot;time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21510) }, &lt;br /&gt;
{ new Integer(18), { &amp;quot;cpSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21511) }, &lt;br /&gt;
{ new Integer(19), { &amp;quot;wcSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21512) }, &lt;br /&gt;
{ new Integer(20), { &amp;quot;SRecord&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21513) }, &lt;br /&gt;
{ new Integer(21), { &amp;quot;SRecord&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21514) }, &lt;br /&gt;
{ new Integer(22), { &amp;quot;Date&amp;quot;, &amp;quot;Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21516) }, &lt;br /&gt;
{ new Integer(24), null, null, new Integer(21515) }, &lt;br /&gt;
{ new Integer(23), { &amp;quot;Date&amp;quot;, &amp;quot;Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21521) }, &lt;br /&gt;
{ new Integer(25), null, null, new Integer(21517) }, &lt;br /&gt;
{ new Integer(26), null, null, new Integer(21519) }, &lt;br /&gt;
{ new Integer(27), null, null, new Integer(21520) }, &lt;br /&gt;
{ new Integer(28), null, null, new Integer(21518) }, &lt;br /&gt;
{ new Integer(29), null, null, new Integer(21352) }, &lt;br /&gt;
{ new Integer(31), null, null, new Integer(21007) }, &lt;br /&gt;
{ new Integer(30), { &amp;quot;SerialNo&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21152) }, &lt;br /&gt;
{ new Integer(32), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21522) }, &lt;br /&gt;
{ new Integer(33), { &amp;quot;FWVerEx&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21155) }, &lt;br /&gt;
{ new Integer(34), null, null, new Integer(21523) }, &lt;br /&gt;
{ new Integer(35), { &amp;quot;dateAndTime&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21300) }, &lt;br /&gt;
{ new Integer(21005), null, null, new Integer(21005) }, &lt;br /&gt;
{ new Integer(36), null, null, new Integer(21011) }, &lt;br /&gt;
{ new Integer(37), null, null, new Integer(21012) }, &lt;br /&gt;
{ new Integer(38), null, null, new Integer(21013) }, &lt;br /&gt;
{ new Integer(39), null, null, new Integer(21014) }, &lt;br /&gt;
{ new Integer(40), null, null, new Integer(21015) } };&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RSS: GET ADDR PHYS                                                              &lt;br /&gt;
PHYS ADDR = 08003ecec448                                                        &lt;br /&gt;
RSS: get rx_freq                                                                &lt;br /&gt;
?(0017) invalid option                                                          &lt;br /&gt;
RSS: GET RX FREQ                                                                &lt;br /&gt;
RX_FREQ = 430975000                                                             &lt;br /&gt;
RSS: GET TX FREQ                                                                &lt;br /&gt;
TX_FREQ = 469975000                                                             &lt;br /&gt;
RSS: AL TXDEV RD                                                                &lt;br /&gt;
TXDEV = 6470 6880 5240 5620                                                     &lt;br /&gt;
RSS: AL TXDEV GO F2                                                             &lt;br /&gt;
TX2FREQ = 453975000                                                             &lt;br /&gt;
RSS: AL TX DEV WR 6470 6880 5240 5620                                           &lt;br /&gt;
?(0014) invalid command                                                         &lt;br /&gt;
RSS: AL TXDEV WR 6470 6880 5240 5620                                            &lt;br /&gt;
RSS: AL TXDEV SAVE                     &lt;br /&gt;
&lt;br /&gt;
AL TXDEV GO F2 &lt;br /&gt;
SET FREQ TX 444000000&lt;br /&gt;
AL TXDEV WR 6470 2000 5240 5620&lt;br /&gt;
&lt;br /&gt;
DORSS&lt;br /&gt;
KEYUP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 224028000&lt;br /&gt;
SET FREQ TX 444005000&lt;br /&gt;
SET FREQ TX 444010000&lt;br /&gt;
SET FREQ TX 444015000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444020000&lt;br /&gt;
SET FREQ TX 444025000&lt;br /&gt;
SET FREQ TX 444030000&lt;br /&gt;
SET FREQ TX 444035000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444040000&lt;br /&gt;
SET FREQ TX 444045000&lt;br /&gt;
SET FREQ TX 444050000&lt;br /&gt;
SET FREQ TX 444055000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444060000&lt;br /&gt;
SET FREQ TX 444065000&lt;br /&gt;
SET FREQ TX 444070000&lt;br /&gt;
SET FREQ TX 444075000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444080000&lt;br /&gt;
SET FREQ TX 444085000&lt;br /&gt;
SET FREQ TX 444090000&lt;br /&gt;
SET FREQ TX 444095000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444100000&lt;br /&gt;
DEKEY&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 454000000&lt;br /&gt;
SET FREQ TX 454005000&lt;br /&gt;
SET FREQ TX 454010000&lt;br /&gt;
SET FREQ TX 454015000&lt;br /&gt;
SET FREQ TX 454020000&lt;br /&gt;
SET FREQ TX 454025000&lt;br /&gt;
SET FREQ TX 454030000&lt;br /&gt;
SET FREQ TX 454035000&lt;br /&gt;
SET FREQ TX 454040000&lt;br /&gt;
SET FREQ TX 454045000&lt;br /&gt;
SET FREQ TX 454050000&lt;br /&gt;
SET FREQ TX 454055000&lt;br /&gt;
SET FREQ TX 454060000&lt;br /&gt;
SET FREQ TX 454065000&lt;br /&gt;
SET FREQ TX 454070000&lt;br /&gt;
SET FREQ TX 454075000&lt;br /&gt;
SET FREQ TX 454080000&lt;br /&gt;
SET FREQ TX 454085000&lt;br /&gt;
SET FREQ TX 454090000&lt;br /&gt;
SET FREQ TX 454095000&lt;br /&gt;
SET FREQ TX 45410000S&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]-O dodbs&lt;br /&gt;
&lt;br /&gt;
DBS Console Task started.  Press &amp;lt;CR&amp;gt; to exit:&lt;br /&gt;
&lt;br /&gt;
]-O dobt&lt;br /&gt;
PB17 Not GNDed or BT Task Not Active ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]-O&lt;br /&gt;
]-O DOASYNC&lt;br /&gt;
?(0088) DOASYNC Error! Not an IR station&lt;br /&gt;
&lt;br /&gt;
DORSS&lt;br /&gt;
get chn cur&lt;br /&gt;
7&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=PDR_3500&amp;diff=8407</id>
		<title>PDR 3500</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=PDR_3500&amp;diff=8407"/>
		<updated>2025-12-25T19:16:07Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Adding a Channel selector */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[category:PDR3500]]&lt;br /&gt;
&lt;br /&gt;
This is a page about the '''PDR3500 Transportable Repeater''', a portable version of the Quantar.  The come in an attractive case, and with flexible power options.  &lt;br /&gt;
&lt;br /&gt;
These are cool stations that take the standard Quantar modules.  They are able to be powered from AC or 13v DC power, as the internal amplifier is 12v DC powered.   The internal supply can work on 85-250V AC 50-60Hz, and there is a DC input for 13.8v at 10a.  The unit weights about 50 lbs with the duplexer.  &lt;br /&gt;
&lt;br /&gt;
[[File:PDR3500 Closed with Dildo for Scale.jpg|400px|thumb|right|PDR3500, Dildo for Scale]] &lt;br /&gt;
&lt;br /&gt;
The station backplane is different here in that the PA ID is set using a 4 bit dips witch on the unit.  This also adapts the SPECTRA PA module to the Quantar exciter, fooling it into thinking it's a Quantar PA.&lt;br /&gt;
&lt;br /&gt;
The PDR3500 can be operated with the case closed and locked (using a Chicago 2135 key) with the power and coax going out the left side of the unit through a gasket. &lt;br /&gt;
[[File:PDR3500 Showing closed case operation.jpg|400px|thumb|right|PDR3500 cable gasket]]&lt;br /&gt;
&lt;br /&gt;
These were common for FBI/USSS/WHCA meaning the UHF1 was the most common (403-433), but they can be changed to UHF 2 with a module swap or via converting the units.  The Spectra PA in UH1 works up to 470 MHz at reduced power and up to 465 with the full 30W.   Being these were used as a backup it's common to find the 8 wire Wireline card in them.  Most were later production modules so they have EPIC V modules.   &lt;br /&gt;
&lt;br /&gt;
It is possible to add a v.24 card on these and route the v.24 out of the chassis.  &lt;br /&gt;
&lt;br /&gt;
Of note when programing it, and especially for flash upgrades, the serial port on the top is the Back Port and uses the 193.0.0.4 IP address and BP config for SLIP.  I've never been able to flash these at 38400, and have always needed to use 9600 bps. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Models =&lt;br /&gt;
&lt;br /&gt;
PDR3500 Model Numbers are below.  This is also in the manual below on page 14, with a detailed breakdown.  The ranges are programed as if they are a Quantar, but as the PA is from the Spectra mobile radio, that is the limits on frequency coverage. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
|- style=&amp;quot;font-weight:bold; vertical-align:bottom;&amp;quot;&lt;br /&gt;
! Model No.&lt;br /&gt;
! Type&lt;br /&gt;
! Freq&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | P2066B&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | VHF R1&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | 132-154&lt;br /&gt;
| VHF PA's are the same for R1/R2&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
| P2067B&lt;br /&gt;
| VHF R2&lt;br /&gt;
| 150-174&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
| P2068B&lt;br /&gt;
| UHF R1&lt;br /&gt;
| 403-433&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | P2069B&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | UHF R2&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | 450-470&lt;br /&gt;
| PA limits low end to 450&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
| P2070B&lt;br /&gt;
| UHF R3&lt;br /&gt;
| 470-482&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | P2071B&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | UHF R4&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | 494-512&lt;br /&gt;
| Limited by PA to 512&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | P2072B&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | UHF R3.5&lt;br /&gt;
| style=&amp;quot;vertical-align:bottom;&amp;quot; | 482-494&lt;br /&gt;
| Note the UHF R4 PA is used here with R3 TX/RX&lt;br /&gt;
|- style=&amp;quot;vertical-align:bottom;&amp;quot;&lt;br /&gt;
| P2073A&lt;br /&gt;
| 800&lt;br /&gt;
| 800 MHz&lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Changing Bands =&lt;br /&gt;
&lt;br /&gt;
As the unit takes the standard modules, you can easily change bands by moving modules.  The issue is the PA is an adapted from the SPECTRA Mobile radios, and uses the same PCB but mounted on a custom heat spreader.&lt;br /&gt;
&lt;br /&gt;
= A and B RJ 45=&lt;br /&gt;
&lt;br /&gt;
These are the wireline interface.  As the PDR manual doesn't give them anywhere they are below.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align:Center;border-bottom:solid 2px&amp;quot; | PDR3500 - A - J21&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:Left;border-bottom:solid 2px;width: 25%;&amp;quot; | RJ45&lt;br /&gt;
|style=&amp;quot;text-align:Left;border-bottom:solid 2px;width: 25%;&amp;quot; | Color&lt;br /&gt;
|style=&amp;quot;text-align:Left;border-bottom:solid 2px;width: 50%;&amp;quot;| Function&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: orange;color: white;text-align:Right&amp;quot; |1&lt;br /&gt;
|style=&amp;quot;background-color: orange;color: white;&amp;quot;|W/Orange&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|LINE1 +&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: orange;color: black;text-align:Right&amp;quot; |2&lt;br /&gt;
|style=&amp;quot;background-color: orange;color: black;&amp;quot;|Orange&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|LINE1 -&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: green;color: white;text-align:Right&amp;quot; |3&lt;br /&gt;
|style=&amp;quot;background-color: green;color: white;&amp;quot;|W/Green&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|LINE2 +&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background-color: #3c78d8;color: black;text-align:Right&amp;quot; |4&lt;br /&gt;
|style=&amp;quot;background-color: #3c78d8;color: black;&amp;quot;|Blue&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|LINE2 -&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: #3c78d8;color: white;text-align:Right&amp;quot; |5&lt;br /&gt;
|style=&amp;quot;background-color: #3c78d8;color: white;&amp;quot;|W/Blue&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|Ground&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: green;color: black;text-align:Right&amp;quot; |6&lt;br /&gt;
|style=&amp;quot;background-color: green;color: black;&amp;quot;|Green&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|RDSTAT +&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: #b45f06;color: white;text-align:Right&amp;quot; |7&lt;br /&gt;
|style=&amp;quot;background-color: #b45f06;color: white;&amp;quot;|W/Brown&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|RDSTAT -&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: #b45f06;color: Black;text-align:Right&amp;quot; |8&lt;br /&gt;
|style=&amp;quot;background-color: #b45f06;color: black;&amp;quot;|Brown&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|EXTPTT -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align:Center;border-bottom:solid 2px&amp;quot; | PDR3500 - B - J22&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;text-align:Left;border-bottom:solid 2px;width: 25%;&amp;quot; | RJ45&lt;br /&gt;
|style=&amp;quot;text-align:Left;border-bottom:solid 2px;width: 25%;&amp;quot; | Color&lt;br /&gt;
|style=&amp;quot;text-align:Left;border-bottom:solid 2px;width: 50%;&amp;quot;| Function&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: orange;color: white;text-align:Right&amp;quot; |1&lt;br /&gt;
|style=&amp;quot;background-color: orange;color: white;&amp;quot;|W/Orange&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|LINE2 +&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: orange;color: black;text-align:Right&amp;quot; |2&lt;br /&gt;
|style=&amp;quot;background-color: orange;color: black;&amp;quot;|Orange&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|LINE2 -&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: green;color: white;text-align:Right&amp;quot; |3&lt;br /&gt;
|style=&amp;quot;background-color: green;color: white;&amp;quot;|W/Green&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|LINE1 +&lt;br /&gt;
|- &lt;br /&gt;
|style=&amp;quot;background-color: #3c78d8;color: black;text-align:Right&amp;quot; |4&lt;br /&gt;
|style=&amp;quot;background-color: #3c78d8;color: black;&amp;quot;|Blue&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|LINE1 -&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: #3c78d8;color: white;text-align:Right&amp;quot; |5&lt;br /&gt;
|style=&amp;quot;background-color: #3c78d8;color: white;&amp;quot;|W/Blue&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|Ground&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: green;color: black;text-align:Right&amp;quot; |6&lt;br /&gt;
|style=&amp;quot;background-color: green;color: black;&amp;quot;|Green&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|5v @ 1A&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: #b45f06;color: white;text-align:Right&amp;quot; |7&lt;br /&gt;
|style=&amp;quot;background-color: #b45f06;color: white;&amp;quot;|W/Brown&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|EXTPTT +&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;background-color: #b45f06;color: Black;text-align:Right&amp;quot; |8&lt;br /&gt;
|style=&amp;quot;background-color: #b45f06;color: black;&amp;quot;|Brown&lt;br /&gt;
|style=&amp;quot;background-color:white&amp;quot;|Ground&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Adding a Channel selector = &lt;br /&gt;
&lt;br /&gt;
The Quantar can support up to 16 channels, and most UHF duplexers can support a 75-100 kHz or better spread, so it makes sense that you can have 3-4 channels programmed at different options, ie. mixed, analog, P25, tones, power output, etc.  This way if you come into a location and find interference on your primary channel, a quick change can be made.   &lt;br /&gt;
&lt;br /&gt;
The best option is a binary output 16 position switch.  These will provide 0000 - 1111 input to the IO pins directly, without needed a diode array. &lt;br /&gt;
&lt;br /&gt;
APEM makes a 0-F Hex switch PT65503, [https://www.digikey.com/en/products/detail/apem-inc/PT65503/1797077 Digikey 679-1940-ND] which has a nice readout and is small.  I put this on some perf board and mounted it with some epoxy to the chassis.   The position chosen avoids the possibility of damaging the switch with the case closed and provides a nice way to get the wires to the backplane.  You can note the extra hole next to the v.24 connector, it was my first attempt with a junkbox rotatory switch.  It worked great until I shut the lid and it broke the switch.   &lt;br /&gt;
&lt;br /&gt;
[[File:PDR3500 Channel Mod 00024.jpg|400px|thumb|left|Location of the channel selector]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Normally this is done via the wireline board IO, and while the PDR has a wireline board, it doesn't have the IO connector.  Connecting to the pins on the back plane is what's needed, and it is rather easy to do.  P101 and P102 correspond to the wireline edge card connector functions.&lt;br /&gt;
&lt;br /&gt;
[[File:PDR3500 Channel Mod 00008.jpg|400px|thumb|left|IO ports 1-4 and 5v source]]&lt;br /&gt;
[[File:PDR3500_Back_Plane_Wireline_tap.png|400px|thumb|left|Backplane diagram ]]&lt;br /&gt;
[[File:Wireline_edge_card_connector.png|400px|thumb|left|Wireline card edge connectors]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The inputs 1-4 are used in this example.  They are transistor coupled and will be programed as active high.  This means we must have a 1k resistor to ground on the inputs to bias them off normally.  &lt;br /&gt;
&lt;br /&gt;
[[File:Wireline trasnsistor coupled inputs.png|400px|thumb|left|wireline input circuits]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The easy way to do this is using 1206 sized or 1/8w axial leaded 1k resistors on the board it self.  Using a small screwdriver scratch away some of the resist and tin the board.  Install the resistors as shown.  Note the small little notch to the top of the board.  This is the location we will bring the wires through.  If needed, use a grinder and expand this cutout. &lt;br /&gt;
&lt;br /&gt;
[[File:PDR3500 Channel Mod 00016.jpg|400px|thumb|left|Resistor location on backplane]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we need to attach the switch to a small section of PCB and attach some wirewrap or other fine wires to it.  This must be epoxied to the top of the chassis, just below the v.24 connector and to the top right of the duplexer.  It's suggested to lightly sand under this and clean it with acetone or other cleaner. &lt;br /&gt;
&lt;br /&gt;
[[File:PDR3500 Channel Mod 00018.jpg|400px|thumb|left|Switch installed on chassis]]&lt;br /&gt;
[[File:PDR3500 Channel Mod 00020.jpg|400px|thumb|left|Switch installed on chassis]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now route the wires into the back of the chassis and connect them to 5v on the common and 1,2,3,4 to 1,2,4,8 on the switch.  Once done, tape the wires in place using some kapton tape. &lt;br /&gt;
&lt;br /&gt;
[[File:PDR3500 Channel Mod 00022.jpg|400px|thumb|left|Completed wiring. ]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally check the v.24 bracket for clearance on the wire, and if needed grind some of it to permit the wire to fit.  A protective wrap of tape or shrink tube may be needed here. &lt;br /&gt;
&lt;br /&gt;
[[File:PDR3500 Channel Mod 00023.jpg|400px|thumb|left|Completed wiring. ]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally you must program the wireline to use the 1-4 inputs as the channel selector.  You should make a codeplug with 16 channels to test as well.  Note that 0 on switch channel 16, 1-9 are the 1-9 channels and a-f is channels 10-15.  If making a label for the repeater it's suggested you use 0-F to label the channels, not what RSS calls them.  This will make it easier for someone in the field to select the proper channel. &lt;br /&gt;
&lt;br /&gt;
[[File:PDR3500 Channel Mod 00025.png|400px|thumb|left|Programing for binary input]]&lt;br /&gt;
&amp;lt;br clear=all&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Finally you want to test this, and it can be done using the RSS, or using a 9600 8n1 serial console.  If using the serial console, put the repeater in RSS mode with 'dorss', then issue 'get chn cur' to see the current channel.  confirm the channel selected works as expected. [[Quantar Serial Commands]]&lt;br /&gt;
&lt;br /&gt;
= Documents = &lt;br /&gt;
&lt;br /&gt;
[[Media:PDR 3500 Transportable Repeater Basic Service Manual.pdf|PDR 3500 Transportable Repeater Basic Service Manual]] - This has the backplane diagram and layout in it as well.&lt;br /&gt;
&lt;br /&gt;
= Pictures =&lt;br /&gt;
== External ==&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
PDR3500 Closed.jpg&lt;br /&gt;
PDR3500 Deployed in Truck.jpg&lt;br /&gt;
PDR3500 Open.jpg&lt;br /&gt;
PDR3500 From Top Closed.jpg&lt;br /&gt;
PDR3500 Showing closed case operation.jpg&lt;br /&gt;
PDR3500 Weight.jpg&lt;br /&gt;
PDR3500 Dildo on Top.jpg&lt;br /&gt;
PDR3500 Dildo open.jpg&lt;br /&gt;
PDR3500 Closed with Dildo for Scale.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Internal ==&lt;br /&gt;
&lt;br /&gt;
=== Chassis And Backplane ===&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
PDR3500 Chassis Bottom 00001.jpg&lt;br /&gt;
PDR3500 Chassis Bottom 00002.jpg&lt;br /&gt;
PDR3500 Chassis Bottom Bracket for cards.jpg&lt;br /&gt;
PDR3500 Chassis Card Bracket.jpg&lt;br /&gt;
PDR3500 Chassis Front 00001.jpg&lt;br /&gt;
PDR3500 Chassis Front 00002.jpg&lt;br /&gt;
PDR3500 Chassis Front 00003.jpg&lt;br /&gt;
PDR3500 Chassis Front 00004.jpg&lt;br /&gt;
PDR3500 Chassis Front 00005.jpg&lt;br /&gt;
PDR3500 Chassis Front.jpg&lt;br /&gt;
PDR3500 Power On Chassis.jpg&lt;br /&gt;
&lt;br /&gt;
PDR3500 Chassis 00001.jpg&lt;br /&gt;
PDR3500 Chassis 00002.jpg&lt;br /&gt;
PDR3500 Chassis 00003.jpg&lt;br /&gt;
PDR3500 Chassis 00004.jpg&lt;br /&gt;
PDR3500 Chassis 00005.jpg&lt;br /&gt;
PDR3500 Chassis 00006.jpg&lt;br /&gt;
PDR3500 Chassis 00007.jpg&lt;br /&gt;
PDR3500 Chassis 00008.jpg&lt;br /&gt;
PDR3500 Chassis 00009.jpg&lt;br /&gt;
PDR3500 Chassis 00010.jpg&lt;br /&gt;
PDR3500 Chassis 00011.jpg&lt;br /&gt;
&lt;br /&gt;
PDR3500 Chassis Backplane 00001.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00002.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00003.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00004.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00005.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00006.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00007.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00008.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00009.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00010.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00011.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00012.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00013.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00014.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00015.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00016.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00017.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00018.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00019.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00020.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00021.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00022.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00023.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00024.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00025.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00026.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00027.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00028.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00029.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00030.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00031.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00032.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00033.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00034.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00035.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00036.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00037.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00038.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00039.jpg&lt;br /&gt;
PDR3500 Chassis Backplane 00040.jpg&lt;br /&gt;
&lt;br /&gt;
PDR3500 Backplane jumpers.jpg&lt;br /&gt;
PDR3500 Card Bracket screws.jpg&lt;br /&gt;
PDR3500 Card Bracket.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Power Supply Module ===&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PDR3500 Power Supply 00001.jpg&lt;br /&gt;
PDR3500 Power Supply 00002.jpg&lt;br /&gt;
PDR3500 Power Supply 00003.jpg&lt;br /&gt;
PDR3500 Power Supply 00004.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Duplexer ===&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
PDR3500 Duplexer 00001.jpg&lt;br /&gt;
PDR3500 Duplexer 00002.jpg&lt;br /&gt;
PDR3500 Duplexer 00003.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EPIC V SCM ===&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PDR3500 EPIC V Front.jpg&lt;br /&gt;
PDR3500 SCM EPIC V 00001.jpg&lt;br /&gt;
PDR3500 SCM EPIC V 00002.jpg&lt;br /&gt;
PDR3500 SCM EPIC V 00003.jpg&lt;br /&gt;
PDR3500 SCM EPIC V 00004.jpg&lt;br /&gt;
PDR3500 SCM EPIC V 00005.jpg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wireline ===&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PDR3500 Wireline 8 Wire 00001.jpg&lt;br /&gt;
PDR3500 Wireline 8 Wire 00002.jpg&lt;br /&gt;
PDR3500 Wireline 8 Wire 00003.jpg&lt;br /&gt;
PDR3500 Wireline 8 Wire 00004.jpg&lt;br /&gt;
PDR3500 Wireline 8 Wire 00005.jpg&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
=== UHF R1 PA Module ===&lt;br /&gt;
Note this is the module from an Astro Spectra/Spectra mid power unit&lt;br /&gt;
&amp;lt;gallery mode=packed-hover&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PDR3500 UHF R1 PA module 00001.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00002.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00003.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00004.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00005.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00006.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00007.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00008.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00009.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00010.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00011.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00012.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00013.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00014.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00015.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00016.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00017.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00018.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00019.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00020.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00021.jpg&lt;br /&gt;
PDR3500 UHF R1 PA module 00022.jpg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Quantar_Serial_Commands&amp;diff=8406</id>
		<title>Quantar Serial Commands</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Quantar_Serial_Commands&amp;diff=8406"/>
		<updated>2025-12-25T19:14:32Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Created page with &amp;quot;Category:Quantar The Quantar serial port on all but the trunking versions supports the following commands.  Some of these commands are obvious, some are not.  This all use...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Quantar]]&lt;br /&gt;
The Quantar serial port on all but the trunking versions supports the following commands.  Some of these commands are obvious, some are not.  This all uses stardard ASCII terminal at 9600 bps 8N1.&lt;br /&gt;
&lt;br /&gt;
By default when connecting the WINRSS to the station it sets echo off, so you will need to reboot or turn it on to see the responses from the quantar.&lt;br /&gt;
&lt;br /&gt;
=Commands =&lt;br /&gt;
&lt;br /&gt;
These are very Javay. Any insights here are just reverse engineered, and could be wrong.  Update this page if something is wrong. &lt;br /&gt;
&lt;br /&gt;
== Rules for commands == &lt;br /&gt;
Commands below are listed as to what prompt you need to be at to execute them. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ASCII_CMDS_RULES_TABLE = { &lt;br /&gt;
{ new Integer(21002), &amp;quot;DOCSS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(25001), &amp;quot;DODEBUG&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(21003), &amp;quot;EXIT&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21020), &amp;quot;GET ADDR IP&amp;quot;, &amp;quot;IP ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21021), &amp;quot;GET ADDR PHYS&amp;quot;, &amp;quot;PHYS ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21022), &amp;quot;SET ADDR IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21023), &amp;quot;SET ADDR PHYS [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21024), &amp;quot;RESTART&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21025), &amp;quot; GET ADDR NETMASK&amp;quot;, &amp;quot;SUBNET MASK = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21026), &amp;quot; GET ADDR GATEWAY&amp;quot;, &amp;quot;DEF GATEWAY = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21027), &amp;quot;SET ADDR NETMASK [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21028), &amp;quot;SET ADDR GATEWAY [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21029), &amp;quot;GET BOX NUM&amp;quot;, &amp;quot;BOX NUMBER = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21030), &amp;quot;SET BOX NUM [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21031), &amp;quot;SET ECHO OFF&amp;quot;, &amp;quot;echo is off&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21032), &amp;quot;SET ECHO ON&amp;quot;, &amp;quot;echo is on&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21033), &amp;quot;GET BOX APP&amp;quot;, &amp;quot;BOX APPLICATION = [%s]&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21006), &amp;quot;DORSS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21007), &amp;quot;EXIT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21016), &amp;quot;DOLS&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21017), &amp;quot;EXIT&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(21162), &amp;quot;GET HW_VER &amp;quot;, &amp;quot;HW_VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21150), &amp;quot;GET BPN &amp;quot;, &amp;quot;BPN = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21151), &amp;quot;GET STN NAME &amp;quot;, &amp;quot;STN NAME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21152), &amp;quot;GET STN SN &amp;quot;, &amp;quot;STN SN  = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21153), &amp;quot;GET TIME &amp;quot;, &amp;quot; TIME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21154), “c”, &amp;quot; FW_VER SC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21155), &amp;quot;GET FW_VER EX&amp;quot;, &amp;quot; FW_VER EX = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21156), &amp;quot;GET FW_VER WL&amp;quot;, &amp;quot; FW_VER WL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21157), &amp;quot;GET CP VER&amp;quot;, &amp;quot; CP VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21158), &amp;quot;ALARM RD&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21163), &amp;quot;ALARM RD [%s]&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21159), &amp;quot; ALARM_EXT RD&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21160), &amp;quot; ALARM CLEAR&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21161), &amp;quot; ALARM_EXT CLEAR&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21300), &amp;quot;GET TIME&amp;quot;, &amp;quot; TIME = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21250), &amp;quot;GET RX FREQ&amp;quot;, &amp;quot; RX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21251), &amp;quot;GET RX2 FREQ&amp;quot;, &amp;quot; RX2_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21252), &amp;quot;GET DSP BER [%s] [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot; BER [%s] = [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21253), &amp;quot;GET DSP RSSI [%s] [%s] [%s]&amp;quot;, &amp;quot; RSSI = [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21301), &amp;quot;SET DATE [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21302), &amp;quot;SET TIME [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21200), &amp;quot;FPM&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21201), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21550), &amp;quot;MTR WL_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21551), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21552), &amp;quot;MTR TX_PA_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21553), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21554), &amp;quot;MTR RX_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21555), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21563), &amp;quot;MTR RX2_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21564), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21556), &amp;quot;MTR PS_P1&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21557), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21558), &amp;quot;MTR UHSO&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21559), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21562), &amp;quot;STOP&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21350), &amp;quot; FP ACC_DIS ON&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21351), &amp;quot; FP ACC_DIS OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21352), &amp;quot; RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21353), &amp;quot; GET PA ON&amp;quot;, &amp;quot;PA ON = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21400), &amp;quot; GET PS EQUAL&amp;quot;, &amp;quot;PS EQUAL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21401), &amp;quot; SET PS EQUAL OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21402), &amp;quot; SET PS EQUAL ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21403), &amp;quot;GET PS BATT_TYPE&amp;quot;, &amp;quot;PS_BATT_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21450), &amp;quot; GET RX FREQ&amp;quot;, &amp;quot;RX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21454), &amp;quot; GET RX2 FREQ&amp;quot;, &amp;quot;RX2_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21451), &amp;quot; AL RSSI [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21452), &amp;quot; SET CHN CUR [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21453), &amp;quot; GET CHN CUR&amp;quot;, &amp;quot;CHN CUR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22001), &amp;quot; AL SQ RD&amp;quot;, &amp;quot;SQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22004), &amp;quot; GET WL SQL&amp;quot;, &amp;quot;WL SQL = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22006), &amp;quot; AL SQ DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22007), &amp;quot; AL SQ UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22008), &amp;quot; AL SQ WR 127&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22005), &amp;quot; AL SQ WR 0&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22009), &amp;quot; SET WL SQL NORMAL&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22010), &amp;quot; SET WL SQL CSQ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22011), &amp;quot; AL SQ SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21600), &amp;quot; GET TX FREQ&amp;quot;, &amp;quot;TX_FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21601), &amp;quot; AL STNPWR RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21602), &amp;quot; SET TX PWR [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21603), &amp;quot; KEYUP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21604), &amp;quot; AL STNPWR WR [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21605), &amp;quot; AL STNPWR SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21606), &amp;quot; DEKEY&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21607), &amp;quot; SET FREQ TX [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21608), &amp;quot; SET FREQ TX 0&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21610), &amp;quot; AL PEND RD&amp;quot;, &amp;quot;PEND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21611), &amp;quot; AL PEND NOREF&amp;quot;, &amp;quot;TXFREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21612), &amp;quot; AL PEND STATUS&amp;quot;, &amp;quot;PEND [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21613), &amp;quot; AL PEND DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21614), &amp;quot; AL PEND UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21615), &amp;quot; AL PEND AUTO&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21616), &amp;quot; AL PEND SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21617), &amp;quot; SET REF [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21618), &amp;quot; SET REF INT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21619), &amp;quot; SET REF 5MHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21620), &amp;quot; SET REF 10MHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21621), &amp;quot; SET REF EXT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21622), &amp;quot; AL PEND ABORT&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21623), &amp;quot; AL UHSO RD&amp;quot;, &amp;quot;UHSO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21624), &amp;quot; AL UHSO DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21625), &amp;quot; AL UHSO UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21626), &amp;quot; AL UHSO WARM&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21627), &amp;quot; AL UHSO SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21630), &amp;quot; GET ADDR ISV&amp;quot;, &amp;quot;ISV MULTICAST ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21631), &amp;quot; GET ADDR SCM&amp;quot;, &amp;quot;STN CTRL MULTICAST ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21632), &amp;quot; SET ADDR ISV [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21633), &amp;quot; SET ADDR SCM [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(20209), &amp;quot;GET STN SYS&amp;quot;, &amp;quot;STN SYS = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21008), &amp;quot;DORAP&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21009), &amp;quot;EXIT&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(25001), &amp;quot;DODEBUG&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(25002), &amp;quot;EXIT&amp;quot;, null, &amp;quot;DEBUG&amp;gt;&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(20210), &amp;quot;GET FP VER&amp;quot;, &amp;quot;FP VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21202), &amp;quot;FP SET IR_RPTR ENABLE&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21203), &amp;quot;FP SET IR_RPTR DISABLE&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21204), &amp;quot;FP ACC_DIS ON&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21205), &amp;quot;FP ACC_DIS OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21207), &amp;quot;RC SET PTT XMIT&amp;quot;, &amp;quot;  &amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21206), &amp;quot;RC SET PTT OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21560), &amp;quot;RC SET PA TEST ON&amp;quot;, &amp;quot;  &amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21561), &amp;quot;RC SET PA TEST OFF&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(21565), &amp;quot;GET PA TEST&amp;quot;, &amp;quot;PA TEST = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21510), &amp;quot; GET CP ISV&amp;quot;, &amp;quot;CP ISV = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21502), &amp;quot; GET CP SIZE&amp;quot;, &amp;quot;CP SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21511), &amp;quot; NEW CP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21512), &amp;quot; NEW WC [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21503), &amp;quot; GET MCS SIZE&amp;quot;, &amp;quot;MCS SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21504), &amp;quot; GET WC SIZE&amp;quot;, &amp;quot;WC SIZE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21505), &amp;quot; GET FW_VER BOOT.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21506), &amp;quot; GET FW_VER BOOT2.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21507), &amp;quot; GET BPN&amp;quot;, &amp;quot;BPN = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21508), &amp;quot; GET ADDR IP&amp;quot;, &amp;quot;IP ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21509), &amp;quot; GET ADDR PHYS&amp;quot;, &amp;quot;PHYS ADDR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21500), &amp;quot; RD CP [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21501), &amp;quot; RD WC [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21513), &amp;quot; WR CP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21514), &amp;quot; WR WC [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21515), &amp;quot; MOVE CP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21516), &amp;quot; MOVE CP_XL [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21521), &amp;quot; MOVE WC_XL [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21517), &amp;quot; MOVE WC&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21518), &amp;quot; RESET SITE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21519), &amp;quot; STOP CP&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21520), &amp;quot; STOP WC&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21700), &amp;quot; GET MGR1 IP&amp;quot;, &amp;quot;IP MGR1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21701), &amp;quot; GET MGR2 IP&amp;quot;, &amp;quot;IP MGR2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21702), &amp;quot;SET MGR1 IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21703), &amp;quot;SET MGR2 IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21704), &amp;quot; SET ADDR IP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21705), &amp;quot; SET ADDR PHYS [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21800), &amp;quot; AL REFMOD UP [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21802), &amp;quot; AL REFMOD DN [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21801), &amp;quot; AL REFMOD RD&amp;quot;, &amp;quot;REFMOD = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21803), &amp;quot; AL REFMOD F5&amp;quot;, &amp;quot;VCO1FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21804), &amp;quot; AL REFMOD F6&amp;quot;, &amp;quot;VCO2FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21805), &amp;quot; AL REFMOD SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21806), &amp;quot; SET TEST_TONE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21807), &amp;quot; SET EEP REFMOD -1&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21752), &amp;quot; AL TXDEV GO F1&amp;quot;, &amp;quot;TX1FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21753), &amp;quot; AL TXDEV GO F2&amp;quot;, &amp;quot;TX2FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21754), &amp;quot; AL TXDEV GO F3&amp;quot;, &amp;quot;TX3FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21755), &amp;quot; AL TXDEV GO F4&amp;quot;, &amp;quot;TX4FREQ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21758), &amp;quot; SET EEP TXDEV -1&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21750), &amp;quot; AL TXDEV RD&amp;quot;, &amp;quot; TXDEV = [%s] [%s] [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21751), &amp;quot; AL TXDEV WR [%s] [%s] [%s] [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21760), &amp;quot; AL TXDEV SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21850), &amp;quot; GET ASTRO_TONE&amp;quot;, &amp;quot; ASTRO_TONE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21851), &amp;quot; SET ASTRO_TONE [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21852), &amp;quot; SET ASTRO_TONE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21853), &amp;quot; GET V52&amp;quot;, &amp;quot; V52 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21854), &amp;quot; SET V52 ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21855), &amp;quot; SET V52 OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21902), &amp;quot; GET FW_VER SC.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21903), &amp;quot; GET FW_VER WL.O&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21950), &amp;quot; GET STATE PASS&amp;quot;, &amp;quot;STATE PASS = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21951), &amp;quot; SETPASS [%s] [%s] [%s]&amp;quot;, null, &amp;quot;]-O&amp;quot;, &amp;quot;]-O&amp;quot; }, &lt;br /&gt;
{ new Integer(22000), &amp;quot; GET REF_CAL&amp;quot;, &amp;quot;REF_CAL = [%s]&amp;quot;, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22001), &amp;quot;SET REF_CAL [%s]&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22002), &amp;quot;SET REF_CAL_SAVE&amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22003), &amp;quot;SET REF_CAL_ABORT &amp;quot;, null, &amp;quot;CSS:&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21033), &amp;quot;GET BOX APP&amp;quot;, &amp;quot;BOX APPLICATION = [%s]&amp;quot;, &amp;quot;]-O&amp;quot;, &amp;quot;CSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22060), &amp;quot;AL RXWL C1 RD 1KHZ&amp;quot;, &amp;quot;1KHZ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22061), &amp;quot;AL RXWL C2 RD 1KHZ&amp;quot;, &amp;quot;1KHZ = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22062), &amp;quot;AL RXWL C1 RD LB&amp;quot;, &amp;quot;LB = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22063), &amp;quot;AL RXWL C1 RD HB&amp;quot;, &amp;quot;HB = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22064), &amp;quot;AL RXWL C1 RD HBF&amp;quot;, &amp;quot;HBF = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22065), &amp;quot;AL RXWL C1 RD ST&amp;quot;, &amp;quot;ST = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22066), &amp;quot;SET TEST_TONE WL C1 1KHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22067), &amp;quot;SET TEST_TONE WL C2 1KHZ&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22068), &amp;quot;SET TEST_TONE WL C1 LB&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22069), &amp;quot;SET TEST_TONE WL C1 HB&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22070), &amp;quot;SET TEST_TONE WL C1 ST&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22071), &amp;quot;AL RXWL C1 WR 1KHZ [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22072), &amp;quot;AL RXWL C2 WR 1KHZ [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22073), &amp;quot;AL RXWL C1 WR LB [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22074), &amp;quot;AL RXWL C1 WR HB [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22075), &amp;quot;AL RXWL C1 WR HBF [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22076), &amp;quot;AL RXWL C1 WR ST [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22077), &amp;quot;AL RXWL C1 SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22078), &amp;quot;AL RXWL C2 SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22079), &amp;quot;AL RXWL C1 RD AT&amp;quot;, &amp;quot;AT = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22080), &amp;quot;AL RXWL C1 WR AT [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22120), &amp;quot;AL LTO RD&amp;quot;, &amp;quot;LTO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22121), &amp;quot;AL LTO WR  [%s]&amp;quot;, &amp;quot;LTO = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22122), &amp;quot;AL LTO TEST_OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22123), &amp;quot;AL LTO TEST_ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22124), &amp;quot;AL LTO SAVE&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22125), &amp;quot;AL LTO RESET&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22050), &amp;quot; GET FW_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22053), &amp;quot; GET OC_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22051), &amp;quot; CHECK ID [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22052), &amp;quot; SWDL [%s] [%s] SLIP [%s]&amp;quot;, &amp;quot;FLASH ME [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21275), &amp;quot;GET RX FREQ_BAND&amp;quot;, &amp;quot; RX_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21276), &amp;quot;GET RX2 FREQ_BAND&amp;quot;, &amp;quot; RX2_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21278), &amp;quot;GET RX TYPE&amp;quot;, &amp;quot; RX_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21279), &amp;quot;GET PA TYPE&amp;quot;, &amp;quot; PA_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21280), &amp;quot;GET PA ORD_PWR&amp;quot;, &amp;quot; PA_ORD_PWR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21281), &amp;quot;GET TX COMPA&amp;quot;, &amp;quot; TX_COMPA = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21282), &amp;quot;GET WL PORT_STAT&amp;quot;, &amp;quot; WL_PORT_STAT = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21283), &amp;quot;GET PS RATED_PWR&amp;quot;, &amp;quot; PS_RATED_PWR = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21284), &amp;quot;GET PS BATT_TYPE&amp;quot;, &amp;quot; PS_BATT_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21285), &amp;quot;GET REF_TYPE&amp;quot;, &amp;quot; REF_TYPE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21277), &amp;quot;GET TX FREQ_BAND&amp;quot;, &amp;quot; TX_FREQ_BAND = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22201), &amp;quot;AL TXWL RD_REF C1 5&amp;quot;, &amp;quot;C1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22202), &amp;quot;AL TXWL RD_REF C2 5&amp;quot;, &amp;quot;C2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22203), &amp;quot;AL TXWL WR_REF C1 [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22204), &amp;quot;AL TXWL WR_REF C2 [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22205), &amp;quot;AL TXWL KEYUP 10&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22206), &amp;quot;AL TXWL DEKEY&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22207), &amp;quot;AL TXWL GO C1 5&amp;quot;, &amp;quot;TXWL DONE&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22208), &amp;quot;AL TXWL GO C2 5&amp;quot;, &amp;quot;TXWL DONE&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22050), &amp;quot; GET FW_VER [%s]&amp;quot;, &amp;quot;FW_VER = [%s] TIMESTAMP = [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22051), &amp;quot; CHECK ID [%s]&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22052), &amp;quot; SWDL [%s] [%s] SLIP [%s]&amp;quot;, &amp;quot;FLASH ME [%s] [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22250), &amp;quot; GET STATION_STATUS 4&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22253), &amp;quot; GET STATION_STATUS 3&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22251), &amp;quot; SET STATION_DISABLE OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22252), &amp;quot; SET STATION_DISABLE ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21522), &amp;quot; RD MCS [%s] [%s]&amp;quot;, &amp;quot;[%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21523), &amp;quot; CLEAR MCS&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; },&lt;br /&gt;
{ new Integer(21475), &amp;quot; AL TDATA GO&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21476), &amp;quot; SET TDATA ON&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21477), &amp;quot; SET TDATA OFF&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(20211), &amp;quot;FP SQ [%s]&amp;quot;, &amp;quot; SQ = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20219), &amp;quot;FP CHN [%s]&amp;quot;, null, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20214), &amp;quot;FP INTCOM ON&amp;quot;, &amp;quot; INTCOM = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20215), &amp;quot;FP INTCOM OFF&amp;quot;, &amp;quot; INTCOM = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20216), &amp;quot;FP SPKRVOL [%s]&amp;quot;, &amp;quot; SPKRVOL = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20217), &amp;quot;FP SPKRVOL [%s]&amp;quot;, &amp;quot; SPKRVOL = [%s]&amp;quot;, &amp;quot;RAP:&amp;quot;, &amp;quot;RAP:&amp;quot; }, &lt;br /&gt;
{ new Integer(20218), &amp;quot;GET CHN MAX&amp;quot;, &amp;quot; CHN MAX = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22300), &amp;quot;SET SC_FAN ON&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22301), &amp;quot;SET SC_FAN AUTO&amp;quot;, &amp;quot; [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22350), &amp;quot;GET OC NUM&amp;quot;, &amp;quot;OC NUM = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22351), &amp;quot;GET OC [%s] SW VER&amp;quot;, &amp;quot; OC [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22352), &amp;quot;GET OC [%s] SW PART&amp;quot;, &amp;quot;OC [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22353), &amp;quot;GET OC [%s] SW VER OC&amp;quot;, &amp;quot;OC [%s] SW VER OC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22354), &amp;quot;GET OC [%s] SW PART OC&amp;quot;, &amp;quot;OC [%s] SW PART OC = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22355), &amp;quot;GET OC [%s] SW VER B1&amp;quot;, &amp;quot;OC [%s] SW VER B1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22356), &amp;quot;GET OC [%s] SW VER B2&amp;quot;, &amp;quot;OC [%s] SW VER B2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22357), &amp;quot;GET OC [%s] SW PART B1&amp;quot;, &amp;quot;OC [%s] SW PART B1 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22358), &amp;quot;GET OC [%s] SW PART B2&amp;quot;, &amp;quot;OC [%s] SW PART B2 = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22359), &amp;quot;GET OC [%s] WL [%s] SW VER WL&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22360), &amp;quot;GET OC [%s] WL [%s] SW VER&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22364), &amp;quot;GET OC [%s] WL [%s] SW PART WB&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22363), &amp;quot;GET OC [%s] WL [%s] SW VER WB&amp;quot;, &amp;quot;OC [%s] WL [%s] SW VER = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22361), &amp;quot;GET OC [%s] WL [%s] SW PART WL&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22362), &amp;quot;GET OC [%s] WL [%s] SW PART&amp;quot;, &amp;quot;OC [%s] WL [%s] SW PART = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22450), &amp;quot;GET CM_MODE&amp;quot;, &amp;quot;CM_MODE = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22451), &amp;quot;GET CM_NUM&amp;quot;, &amp;quot;CM_NUM = [%s]&amp;quot;, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22452), &amp;quot;GET LD&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22453), &amp;quot;LCM ON&amp;quot;, &amp;quot;LCM ON&amp;quot;, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22454), &amp;quot;LCM OFF&amp;quot;, &amp;quot;LCM OFF&amp;quot;, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22455), &amp;quot;FVP [%s] ON&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22456), &amp;quot;FVP [%s] OFF&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22457), &amp;quot;VDP [%s] ON&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(22458), &amp;quot;VDP [%s] OFF&amp;quot;, null, &amp;quot;LS:&amp;quot;, &amp;quot;LS:&amp;quot; }, &lt;br /&gt;
{ new Integer(21018), &amp;quot;LIST_ALL_ALERTS&amp;quot;, null, &amp;quot;DEBUG&amp;gt;&amp;quot;, &amp;quot;DEBUG&amp;gt;&amp;quot; }, &lt;br /&gt;
{ new Integer(22500), &amp;quot;&amp;quot;, null, &amp;quot;RSS:&amp;quot;, &amp;quot;RSS:&amp;quot; } };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==RW commands table ==&lt;br /&gt;
These commands are for reading and writing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
READ_WRITE_CMDS_RULES_TABLE = { &lt;br /&gt;
{ new Integer(2), { &amp;quot;closeport&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21001) },&lt;br /&gt;
{ new Integer(1), { &amp;quot;openport&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21000) }, &lt;br /&gt;
{ new Integer(3), { &amp;quot;hardwareVersion&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21162) }, &lt;br /&gt;
{ new Integer(6), { &amp;quot;CPVersion&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21157) },&lt;br /&gt;
{ new Integer(7), { &amp;quot;CPSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21502) }, &lt;br /&gt;
{ new Integer(8), { &amp;quot;MCSSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21503) }, &lt;br /&gt;
{ new Integer(9), { &amp;quot;WCSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21504) }, &lt;br /&gt;
{ new Integer(10), { &amp;quot;FWVerSc&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21154) }, &lt;br /&gt;
{ new Integer(11), { &amp;quot;FWVerBoot1&amp;quot;, &amp;quot;Boot1Date&amp;quot;, &amp;quot;Boot1Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21505) }, &lt;br /&gt;
{ new Integer(12), { &amp;quot;FWVerBoot2&amp;quot;, &amp;quot;Boot2Date&amp;quot;, &amp;quot;Boot2Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21506) }, &lt;br /&gt;
{ new Integer(13), { &amp;quot;FWVerWl&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21156) }, &lt;br /&gt;
{ new Integer(14), { &amp;quot;Bpn&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21507) }, &lt;br /&gt;
{ new Integer(15), { &amp;quot;AddrIp&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21508) }, &lt;br /&gt;
{ new Integer(16), { &amp;quot;AddrPhys&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21509) }, &lt;br /&gt;
{ new Integer(5), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21501) }, &lt;br /&gt;
{ new Integer(4), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21500) }, &lt;br /&gt;
{ new Integer(17), { &amp;quot;date&amp;quot;, &amp;quot;time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21510) }, &lt;br /&gt;
{ new Integer(18), { &amp;quot;cpSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21511) }, &lt;br /&gt;
{ new Integer(19), { &amp;quot;wcSize&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21512) }, &lt;br /&gt;
{ new Integer(20), { &amp;quot;SRecord&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21513) }, &lt;br /&gt;
{ new Integer(21), { &amp;quot;SRecord&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21514) }, &lt;br /&gt;
{ new Integer(22), { &amp;quot;Date&amp;quot;, &amp;quot;Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21516) }, &lt;br /&gt;
{ new Integer(24), null, null, new Integer(21515) }, &lt;br /&gt;
{ new Integer(23), { &amp;quot;Date&amp;quot;, &amp;quot;Time&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21521) }, &lt;br /&gt;
{ new Integer(25), null, null, new Integer(21517) }, &lt;br /&gt;
{ new Integer(26), null, null, new Integer(21519) }, &lt;br /&gt;
{ new Integer(27), null, null, new Integer(21520) }, &lt;br /&gt;
{ new Integer(28), null, null, new Integer(21518) }, &lt;br /&gt;
{ new Integer(29), null, null, new Integer(21352) }, &lt;br /&gt;
{ new Integer(31), null, null, new Integer(21007) }, &lt;br /&gt;
{ new Integer(30), { &amp;quot;SerialNo&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21152) }, &lt;br /&gt;
{ new Integer(32), { &amp;quot;startAddress&amp;quot;, &amp;quot;endAddress&amp;quot; }, { &amp;quot;String&amp;quot;, &amp;quot;String&amp;quot; }, new Integer(21522) }, &lt;br /&gt;
{ new Integer(33), { &amp;quot;FWVerEx&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21155) }, &lt;br /&gt;
{ new Integer(34), null, null, new Integer(21523) }, &lt;br /&gt;
{ new Integer(35), { &amp;quot;dateAndTime&amp;quot; }, { &amp;quot;String&amp;quot; }, new Integer(21300) }, &lt;br /&gt;
{ new Integer(21005), null, null, new Integer(21005) }, &lt;br /&gt;
{ new Integer(36), null, null, new Integer(21011) }, &lt;br /&gt;
{ new Integer(37), null, null, new Integer(21012) }, &lt;br /&gt;
{ new Integer(38), null, null, new Integer(21013) }, &lt;br /&gt;
{ new Integer(39), null, null, new Integer(21014) }, &lt;br /&gt;
{ new Integer(40), null, null, new Integer(21015) } };&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Examples =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RSS: GET ADDR PHYS                                                              &lt;br /&gt;
PHYS ADDR = 08003ecec448                                                        &lt;br /&gt;
RSS: get rx_freq                                                                &lt;br /&gt;
?(0017) invalid option                                                          &lt;br /&gt;
RSS: GET RX FREQ                                                                &lt;br /&gt;
RX_FREQ = 430975000                                                             &lt;br /&gt;
RSS: GET TX FREQ                                                                &lt;br /&gt;
TX_FREQ = 469975000                                                             &lt;br /&gt;
RSS: AL TXDEV RD                                                                &lt;br /&gt;
TXDEV = 6470 6880 5240 5620                                                     &lt;br /&gt;
RSS: AL TXDEV GO F2                                                             &lt;br /&gt;
TX2FREQ = 453975000                                                             &lt;br /&gt;
RSS: AL TX DEV WR 6470 6880 5240 5620                                           &lt;br /&gt;
?(0014) invalid command                                                         &lt;br /&gt;
RSS: AL TXDEV WR 6470 6880 5240 5620                                            &lt;br /&gt;
RSS: AL TXDEV SAVE                     &lt;br /&gt;
&lt;br /&gt;
AL TXDEV GO F2 &lt;br /&gt;
SET FREQ TX 444000000&lt;br /&gt;
AL TXDEV WR 6470 2000 5240 5620&lt;br /&gt;
&lt;br /&gt;
DORSS&lt;br /&gt;
KEYUP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 224028000&lt;br /&gt;
SET FREQ TX 444005000&lt;br /&gt;
SET FREQ TX 444010000&lt;br /&gt;
SET FREQ TX 444015000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444020000&lt;br /&gt;
SET FREQ TX 444025000&lt;br /&gt;
SET FREQ TX 444030000&lt;br /&gt;
SET FREQ TX 444035000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444040000&lt;br /&gt;
SET FREQ TX 444045000&lt;br /&gt;
SET FREQ TX 444050000&lt;br /&gt;
SET FREQ TX 444055000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444060000&lt;br /&gt;
SET FREQ TX 444065000&lt;br /&gt;
SET FREQ TX 444070000&lt;br /&gt;
SET FREQ TX 444075000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444080000&lt;br /&gt;
SET FREQ TX 444085000&lt;br /&gt;
SET FREQ TX 444090000&lt;br /&gt;
SET FREQ TX 444095000&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 444100000&lt;br /&gt;
DEKEY&lt;br /&gt;
&lt;br /&gt;
SET FREQ TX 454000000&lt;br /&gt;
SET FREQ TX 454005000&lt;br /&gt;
SET FREQ TX 454010000&lt;br /&gt;
SET FREQ TX 454015000&lt;br /&gt;
SET FREQ TX 454020000&lt;br /&gt;
SET FREQ TX 454025000&lt;br /&gt;
SET FREQ TX 454030000&lt;br /&gt;
SET FREQ TX 454035000&lt;br /&gt;
SET FREQ TX 454040000&lt;br /&gt;
SET FREQ TX 454045000&lt;br /&gt;
SET FREQ TX 454050000&lt;br /&gt;
SET FREQ TX 454055000&lt;br /&gt;
SET FREQ TX 454060000&lt;br /&gt;
SET FREQ TX 454065000&lt;br /&gt;
SET FREQ TX 454070000&lt;br /&gt;
SET FREQ TX 454075000&lt;br /&gt;
SET FREQ TX 454080000&lt;br /&gt;
SET FREQ TX 454085000&lt;br /&gt;
SET FREQ TX 454090000&lt;br /&gt;
SET FREQ TX 454095000&lt;br /&gt;
SET FREQ TX 45410000S&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]-O dodbs&lt;br /&gt;
&lt;br /&gt;
DBS Console Task started.  Press &amp;lt;CR&amp;gt; to exit:&lt;br /&gt;
&lt;br /&gt;
]-O dobt&lt;br /&gt;
PB17 Not GNDed or BT Task Not Active ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]-O&lt;br /&gt;
]-O DOASYNC&lt;br /&gt;
?(0088) DOASYNC Error! Not an IR station&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8405</id>
		<title>Nextcloud install notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8405"/>
		<updated>2025-11-26T20:54:24Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes for installing nextcloud&lt;br /&gt;
&lt;br /&gt;
= install needed software =&lt;br /&gt;
 apt-get install screen vim net-tools strongswan fail2ban snmp haveged libacl1-dev python3-dev libssl-dev gcc g++ fio pbzip2 ncdu sudo traceroute bash-completion ifupdown inetutils-ping dnsutils lldpd iptables less rsyslog snmp snmpd libsnmp-dev ncat telnet libacl1-dev python3-dev libssl-dev gcc g++ python3-llfuse pkg-config cron libwww-perl ipset udev postfix mailutils snmp snmpd libsnmp-dev curl xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl rrdtool mailgraph mariadb-server php libapache2-mod-php php-cgi php-mysqli php-pear php-phpseclib php-mysql php-mbstring php-zip php-gd php-curl php-common unzip apache2 mariadb-server libapache2-mod-fcgid php-fpm php php-gd php-json php-mysql php-curl php-mbstring php-intl php-imagick php-xml php-zip php-bz2 python3-certbot-apache php-apcu redis-server php-redis php-bcmath php-gmp ffmpeg curl coreutils libmagickcore-7.q16-10-extra php-sqlite3&lt;br /&gt;
&lt;br /&gt;
= install nextcloud =&lt;br /&gt;
 cd /var/www/html&lt;br /&gt;
 wget https://download.nextcloud.com/server/releases/nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 tar xfv nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 chown -R www-data:www-data nextcloud/&lt;br /&gt;
 sudo touch /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 vim /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 a2enmod rewrite proxy_fcgi setenvif rewrite headers env dir mime userdir dav ssl&lt;br /&gt;
 a2enconf php8.4-fpm&lt;br /&gt;
 a2ensite nextcloud.conf&lt;br /&gt;
 a2dissite 000-default.conf&lt;br /&gt;
&lt;br /&gt;
== config ==&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 vim /etc/redis/redis.conf&lt;br /&gt;
 usermod -a -G redis www-data&lt;br /&gt;
 systemctl enable redis-server&lt;br /&gt;
 vim config/config.php&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 systemctl restart redis-server&lt;br /&gt;
 systemctl restart apache2&lt;br /&gt;
 vim /etc/php/8.4/cli/php.ini&lt;br /&gt;
 systemctl restart php8.4-fpm.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=cronjobs=&lt;br /&gt;
&lt;br /&gt;
in the www-data user crontab &lt;br /&gt;
 # crontab -e -u www-data&lt;br /&gt;
 &lt;br /&gt;
 */5 * * * * php -f /var/www/html/nextcloud/cron.php&lt;br /&gt;
&lt;br /&gt;
=elasticsearch=&lt;br /&gt;
&lt;br /&gt;
how to install it on debian  https://itsfoss.gitlab.io/post/how-to-install-elasticsearch-8-on-debian-12-11-or-10-linux/&lt;br /&gt;
&lt;br /&gt;
This needs to allow the search to work from self signed https on local host.&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
 sudo -u www-data php occ config:app:set fulltextsearch_elasticsearch allow_self_signed_cert --value true&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
This resets the password to random.&lt;br /&gt;
 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -a&lt;br /&gt;
&lt;br /&gt;
= talk = &lt;br /&gt;
Need high-perf backend&lt;br /&gt;
&lt;br /&gt;
https://github.com/sunweaver/nextcloud-high-performance-backend-setup/blob/main/README_en.md&lt;br /&gt;
&lt;br /&gt;
= coloraba server= &lt;br /&gt;
&lt;br /&gt;
https://sdk.collaboraonline.com/docs/installation/Proxy_settings.html&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy proxy_http proxy_connect proxy_wstunnel&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= docs =&lt;br /&gt;
&lt;br /&gt;
https://www.doublebastion.com/apache-configuration-for-nextcloud/&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8404</id>
		<title>Nextcloud install notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8404"/>
		<updated>2025-11-07T17:18:13Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes for installing nextcloud&lt;br /&gt;
&lt;br /&gt;
= install needed software =&lt;br /&gt;
 apt-get install screen vim net-tools strongswan fail2ban snmp haveged libacl1-dev python3-dev libssl-dev gcc g++ fio pbzip2 ncdu sudo traceroute bash-completion ifupdown inetutils-ping dnsutils lldpd iptables less rsyslog snmp snmpd libsnmp-dev ncat telnet libacl1-dev python3-dev libssl-dev gcc g++ python3-llfuse pkg-config cron libwww-perl ipset udev postfix mailutils snmp snmpd libsnmp-dev curl xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl rrdtool mailgraph mariadb-server php libapache2-mod-php php-cgi php-mysqli php-pear php-phpseclib php-mysql php-mbstring php-zip php-gd php-curl php-common unzip apache2 mariadb-server libapache2-mod-fcgid php-fpm php php-gd php-json php-mysql php-curl php-mbstring php-intl php-imagick php-xml php-zip php-bz2 python3-certbot-apache php-apcu redis-server php-redis php-bcmath php-gmp ffmpeg curl coreutils libmagickcore-7.q16-10-extra php-sqlite3&lt;br /&gt;
&lt;br /&gt;
= install nextcloud =&lt;br /&gt;
 cd /var/www/html&lt;br /&gt;
 wget https://download.nextcloud.com/server/releases/nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 tar xfv nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 chown -R www-data:www-data nextcloud/&lt;br /&gt;
 sudo touch /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 vim /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 a2enmod rewrite proxy_fcgi setenvif rewrite headers env dir mime userdir dav ssl&lt;br /&gt;
 a2enconf php8.4-fpm&lt;br /&gt;
 a2ensite nextcloud.conf&lt;br /&gt;
 a2dissite 000-default.conf&lt;br /&gt;
&lt;br /&gt;
== config ==&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 vim /etc/redis/redis.conf&lt;br /&gt;
 usermod -a -G redis www-data&lt;br /&gt;
 systemctl enable redis-server&lt;br /&gt;
 vim config/config.php&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 systemctl restart redis-server&lt;br /&gt;
 systemctl restart apache2&lt;br /&gt;
 vim /etc/php/8.4/cli/php.ini&lt;br /&gt;
 systemctl restart php8.4-fpm.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=cronjobs=&lt;br /&gt;
&lt;br /&gt;
in the www-data user crontab &lt;br /&gt;
 # crontab -e -u www-data&lt;br /&gt;
 &lt;br /&gt;
 */5 * * * * php -f /var/www/html/nextcloud/cron.php&lt;br /&gt;
&lt;br /&gt;
=elasticsearch=&lt;br /&gt;
&lt;br /&gt;
how to install it on debian  https://itsfoss.gitlab.io/post/how-to-install-elasticsearch-8-on-debian-12-11-or-10-linux/&lt;br /&gt;
&lt;br /&gt;
This needs to allow the search to work from self signed https on local host.&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
 sudo -u www-data php occ config:app:set fulltextsearch_elasticsearch allow_self_signed_cert --value true&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
This resets the password to random.&lt;br /&gt;
 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -a&lt;br /&gt;
&lt;br /&gt;
= talk = &lt;br /&gt;
Need high-perf backend&lt;br /&gt;
&lt;br /&gt;
https://github.com/sunweaver/nextcloud-high-performance-backend-setup/blob/main/README_en.md&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8403</id>
		<title>Nextcloud install notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8403"/>
		<updated>2025-11-07T17:13:26Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* install needed software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes for installing nextcloud&lt;br /&gt;
&lt;br /&gt;
= install needed software =&lt;br /&gt;
 apt-get install screen vim net-tools strongswan fail2ban snmp haveged libacl1-dev python3-dev libssl-dev gcc g++ fio pbzip2 ncdu sudo traceroute bash-completion ifupdown inetutils-ping dnsutils lldpd iptables less rsyslog snmp snmpd libsnmp-dev ncat telnet libacl1-dev python3-dev libssl-dev gcc g++ python3-llfuse pkg-config cron libwww-perl ipset udev postfix mailutils snmp snmpd libsnmp-dev curl xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl rrdtool mailgraph mariadb-server php libapache2-mod-php php-cgi php-mysqli php-pear php-phpseclib php-mysql php-mbstring php-zip php-gd php-curl php-common unzip apache2 mariadb-server libapache2-mod-fcgid php-fpm php php-gd php-json php-mysql php-curl php-mbstring php-intl php-imagick php-xml php-zip php-bz2 python3-certbot-apache php-apcu redis-server php-redis php-bcmath php-gmp ffmpeg curl coreutils libmagickcore-7.q16-10-extra php-sqlite3&lt;br /&gt;
&lt;br /&gt;
= install nextcloud =&lt;br /&gt;
 cd /var/www/html&lt;br /&gt;
 wget https://download.nextcloud.com/server/releases/nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 tar xfv nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 chown -R www-data:www-data nextcloud/&lt;br /&gt;
 sudo touch /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 vim /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 a2enmod rewrite proxy_fcgi setenvif rewrite headers env dir mime userdir dav ssl&lt;br /&gt;
 a2enconf php8.4-fpm&lt;br /&gt;
 a2ensite nextcloud.conf&lt;br /&gt;
 a2dissite 000-default.conf&lt;br /&gt;
&lt;br /&gt;
== config ==&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 vim /etc/redis/redis.conf&lt;br /&gt;
 usermod -a -G redis www-data&lt;br /&gt;
 systemctl enable redis-server&lt;br /&gt;
 vim config/config.php&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 systemctl restart redis-server&lt;br /&gt;
 systemctl restart apache2&lt;br /&gt;
 vim /etc/php/8.4/cli/php.ini&lt;br /&gt;
 systemctl restart php8.4-fpm.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=cronjobs=&lt;br /&gt;
&lt;br /&gt;
in the www-data user crontab &lt;br /&gt;
 # crontab -e -u www-data&lt;br /&gt;
 &lt;br /&gt;
 */5 * * * * php -f /var/www/html/nextcloud/cron.php&lt;br /&gt;
&lt;br /&gt;
=elasticsearch=&lt;br /&gt;
&lt;br /&gt;
how to install it on debian  https://itsfoss.gitlab.io/post/how-to-install-elasticsearch-8-on-debian-12-11-or-10-linux/&lt;br /&gt;
&lt;br /&gt;
This needs to allow the search to work from self signed https on local host.&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
 sudo -u www-data php occ config:app:set fulltextsearch_elasticsearch allow_self_signed_cert --value true&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
This resets the password to random.&lt;br /&gt;
 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -a&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8402</id>
		<title>Nextcloud install notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8402"/>
		<updated>2025-11-07T17:12:52Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* install needed software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes for installing nextcloud&lt;br /&gt;
&lt;br /&gt;
= install needed software =&lt;br /&gt;
 apt-get install screen vim net-tools strongswan fail2ban snmp haveged libacl1-dev python3-dev libssl-dev gcc g++ fio pbzip2 ncdu s&lt;br /&gt;
udo traceroute bash-completion ifupdown inetutils-ping dnsutils lldpd iptables less rsyslog snmp snmpd libsnmp-dev ncat telnet libacl1-de&lt;br /&gt;
v python3-dev libssl-dev gcc g++ python3-llfuse pkg-config cron libwww-perl ipset udev postfix mailutils snmp snmpd libsnmp-dev curl xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl rrdtool mailgraph mariadb-server php libapache2-mod-php php-cgi php-mysqli php-pear php-phpseclib php-mysql php-mbstring php-zip php-gd php-curl php-common unzip apache2 mariadb-server libapache2-mod-fcgid php-fpm php php-gd php-json php-mysql php-curl php-mbstring php-intl php-imagick php-xml php-zip php-bz2 python3-certbot-apache php-apcu redis-server php-redis php-bcmath php-gmp ffmpeg curl coreutils libmagickcore-7.q16-10-extra php-sqlite3&lt;br /&gt;
&lt;br /&gt;
= install nextcloud =&lt;br /&gt;
 cd /var/www/html&lt;br /&gt;
 wget https://download.nextcloud.com/server/releases/nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 tar xfv nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 chown -R www-data:www-data nextcloud/&lt;br /&gt;
 sudo touch /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 vim /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 a2enmod rewrite proxy_fcgi setenvif rewrite headers env dir mime userdir dav ssl&lt;br /&gt;
 a2enconf php8.4-fpm&lt;br /&gt;
 a2ensite nextcloud.conf&lt;br /&gt;
 a2dissite 000-default.conf&lt;br /&gt;
&lt;br /&gt;
== config ==&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 vim /etc/redis/redis.conf&lt;br /&gt;
 usermod -a -G redis www-data&lt;br /&gt;
 systemctl enable redis-server&lt;br /&gt;
 vim config/config.php&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 systemctl restart redis-server&lt;br /&gt;
 systemctl restart apache2&lt;br /&gt;
 vim /etc/php/8.4/cli/php.ini&lt;br /&gt;
 systemctl restart php8.4-fpm.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=cronjobs=&lt;br /&gt;
&lt;br /&gt;
in the www-data user crontab &lt;br /&gt;
 # crontab -e -u www-data&lt;br /&gt;
 &lt;br /&gt;
 */5 * * * * php -f /var/www/html/nextcloud/cron.php&lt;br /&gt;
&lt;br /&gt;
=elasticsearch=&lt;br /&gt;
&lt;br /&gt;
how to install it on debian  https://itsfoss.gitlab.io/post/how-to-install-elasticsearch-8-on-debian-12-11-or-10-linux/&lt;br /&gt;
&lt;br /&gt;
This needs to allow the search to work from self signed https on local host.&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
 sudo -u www-data php occ config:app:set fulltextsearch_elasticsearch allow_self_signed_cert --value true&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
This resets the password to random.&lt;br /&gt;
 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -a&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8401</id>
		<title>Nextcloud install notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8401"/>
		<updated>2025-11-07T17:12:41Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes for installing nextcloud&lt;br /&gt;
&lt;br /&gt;
= install needed software =&lt;br /&gt;
apt-get install screen vim net-tools strongswan fail2ban snmp haveged libacl1-dev python3-dev libssl-dev gcc g++ fio pbzip2 ncdu s&lt;br /&gt;
udo traceroute bash-completion ifupdown inetutils-ping dnsutils lldpd iptables less rsyslog snmp snmpd libsnmp-dev ncat telnet libacl1-de&lt;br /&gt;
v python3-dev libssl-dev gcc g++ python3-llfuse pkg-config cron libwww-perl ipset udev postfix mailutils snmp snmpd libsnmp-dev curl xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl rrdtool mailgraph mariadb-server php libapache2-mod-php php-cgi php-mysqli php-pear php-phpseclib php-mysql php-mbstring php-zip php-gd php-curl php-common unzip apache2 mariadb-server libapache2-mod-fcgid php-fpm php php-gd php-json php-mysql php-curl php-mbstring php-intl php-imagick php-xml php-zip php-bz2 python3-certbot-apache php-apcu redis-server php-redis php-bcmath php-gmp ffmpeg curl coreutils libmagickcore-7.q16-10-extra php-sqlite3 &lt;br /&gt;
&lt;br /&gt;
= install nextcloud =&lt;br /&gt;
 cd /var/www/html&lt;br /&gt;
 wget https://download.nextcloud.com/server/releases/nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 tar xfv nextcloud-32.0.0.tar.bz2&lt;br /&gt;
 chown -R www-data:www-data nextcloud/&lt;br /&gt;
 sudo touch /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 vim /etc/apache2/sites-available/nextcloud.conf&lt;br /&gt;
 a2enmod rewrite proxy_fcgi setenvif rewrite headers env dir mime userdir dav ssl&lt;br /&gt;
 a2enconf php8.4-fpm&lt;br /&gt;
 a2ensite nextcloud.conf&lt;br /&gt;
 a2dissite 000-default.conf&lt;br /&gt;
&lt;br /&gt;
== config ==&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 vim /etc/redis/redis.conf&lt;br /&gt;
 usermod -a -G redis www-data&lt;br /&gt;
 systemctl enable redis-server&lt;br /&gt;
 vim config/config.php&lt;br /&gt;
 vim /etc/php/8.4/fpm/php.ini&lt;br /&gt;
 systemctl restart redis-server&lt;br /&gt;
 systemctl restart apache2&lt;br /&gt;
 vim /etc/php/8.4/cli/php.ini&lt;br /&gt;
 systemctl restart php8.4-fpm.service&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=cronjobs=&lt;br /&gt;
&lt;br /&gt;
in the www-data user crontab &lt;br /&gt;
 # crontab -e -u www-data&lt;br /&gt;
 &lt;br /&gt;
 */5 * * * * php -f /var/www/html/nextcloud/cron.php&lt;br /&gt;
&lt;br /&gt;
=elasticsearch=&lt;br /&gt;
&lt;br /&gt;
how to install it on debian  https://itsfoss.gitlab.io/post/how-to-install-elasticsearch-8-on-debian-12-11-or-10-linux/&lt;br /&gt;
&lt;br /&gt;
This needs to allow the search to work from self signed https on local host.&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
 sudo -u www-data php occ config:app:set fulltextsearch_elasticsearch allow_self_signed_cert --value true&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
This resets the password to random.&lt;br /&gt;
 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -a&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8400</id>
		<title>Nextcloud install notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8400"/>
		<updated>2025-11-07T17:05:17Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes for installing nextcloud&lt;br /&gt;
&lt;br /&gt;
=cronjobs=&lt;br /&gt;
&lt;br /&gt;
in the www-data user crontab &lt;br /&gt;
 # crontab -e -u www-data&lt;br /&gt;
 &lt;br /&gt;
 */5 * * * * php -f /var/www/html/nextcloud/cron.php&lt;br /&gt;
&lt;br /&gt;
=elasticsearch=&lt;br /&gt;
&lt;br /&gt;
how to install it on debian  https://itsfoss.gitlab.io/post/how-to-install-elasticsearch-8-on-debian-12-11-or-10-linux/&lt;br /&gt;
&lt;br /&gt;
This needs to allow the search to work from self signed https on local host.&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
 sudo -u www-data php occ config:app:set fulltextsearch_elasticsearch allow_self_signed_cert --value true&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
This resets the password to random.&lt;br /&gt;
 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -a&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8399</id>
		<title>Nextcloud install notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Nextcloud_install_notes&amp;diff=8399"/>
		<updated>2025-11-07T17:04:55Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Created page with &amp;quot;Notes for installing nextcloud  #cronjobs  in the www-data user crontab   # crontab -e -u www-data    */5 * * * * php -f /var/www/html/nextcloud/cron.php  # elasticsearch  how...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Notes for installing nextcloud&lt;br /&gt;
&lt;br /&gt;
#cronjobs&lt;br /&gt;
&lt;br /&gt;
in the www-data user crontab &lt;br /&gt;
 # crontab -e -u www-data&lt;br /&gt;
 &lt;br /&gt;
 */5 * * * * php -f /var/www/html/nextcloud/cron.php&lt;br /&gt;
&lt;br /&gt;
# elasticsearch&lt;br /&gt;
&lt;br /&gt;
how to install it on debian  https://itsfoss.gitlab.io/post/how-to-install-elasticsearch-8-on-debian-12-11-or-10-linux/&lt;br /&gt;
&lt;br /&gt;
This needs to allow the search to work from self signed https on local host.&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
 sudo -u www-data php occ config:app:set fulltextsearch_elasticsearch allow_self_signed_cert --value true&lt;br /&gt;
 sudo -u www-data php occ config:app:get fulltextsearch_elasticsearch allow_self_signed_cert&lt;br /&gt;
This resets the password to random.&lt;br /&gt;
 /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic -a&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8398</id>
		<title>Radio Channel Logger</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8398"/>
		<updated>2025-10-26T00:35:19Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* apt-get scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems to be a common requirement to make recordings of a radio or scanner output.  I've not found much decent Free Software that can do this, and do it reliably in a headless configuration.  What I've used is documented here, and will do 4 audio channels reliably.  This soultion is unique as it uses OpenAI's API to transcribe the audio files to easily searchable text. &lt;br /&gt;
&lt;br /&gt;
My concept is based around a RPI 5 with Cmedia USB audio dongles as pictured below.  This is compact and low power, while a full Linux environment allows you to do many other things as needed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* 4 audio channels&lt;br /&gt;
* Date/time logging down to the seconds&lt;br /&gt;
* Configuration of settings per channel&lt;br /&gt;
* Recordings are 8000 samples per second 16 bit WAV&lt;br /&gt;
* VOX activated recording with VOX level set per channel &lt;br /&gt;
* Low Overhead on as no voice coding is taking place, should run on a pi0 for at least one channel (not tested)&lt;br /&gt;
* 1tb ssd used for recording.&lt;br /&gt;
&lt;br /&gt;
=Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPI 5==&lt;br /&gt;
* Case&lt;br /&gt;
* SSD&lt;br /&gt;
* nvme disk&lt;br /&gt;
* 4 usb jumpers&lt;br /&gt;
* PSU&lt;br /&gt;
* [https://www.ebay.com/itm/131905878673 Cmedia Dongles]&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
Per channel&lt;br /&gt;
&lt;br /&gt;
* CDM radio&lt;br /&gt;
* CDM radio interface cable&lt;br /&gt;
&lt;br /&gt;
== radio setup == &lt;br /&gt;
ensure the low level expansion is set in the personality and that demphasis is selected.&lt;br /&gt;
&lt;br /&gt;
= Linux = &lt;br /&gt;
The system is standard raspbian Linux &lt;br /&gt;
&lt;br /&gt;
What is different is that we are booting off the nvme directly.&lt;br /&gt;
&lt;br /&gt;
== Disk Setup ==&lt;br /&gt;
This is not a complete howto, but rather enough to figure it out.  You may want to do it differently.&lt;br /&gt;
&lt;br /&gt;
=== GPT table ===&lt;br /&gt;
Part 1 is /boot/firmware&lt;br /&gt;
&lt;br /&gt;
Part 2 is lvm&lt;br /&gt;
Leave a little at the end free, I picked 11gb&lt;br /&gt;
&lt;br /&gt;
 Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
    1            2048         1050623   512.0 MiB   0700  Microsoft basic data&lt;br /&gt;
    2         1050624      1930430463   920.0 GiB   8E00  Linux LVM&lt;br /&gt;
=== LVM config ===&lt;br /&gt;
From here I make that part 2 a LVM phsyical volume with 'pvcreate', then make the entire thing a volume group with vgcreate&lt;br /&gt;
&lt;br /&gt;
 pvcreate /dev/nvme0n1p2&lt;br /&gt;
 vgcreate vg0 /dev/nvme0n1p2&lt;br /&gt;
 &lt;br /&gt;
 # pvs&lt;br /&gt;
   PV             VG  Fmt  Attr PSize    PFree&lt;br /&gt;
   /dev/nvme0n1p2 vg0 lvm2 a--  &amp;lt;920.00g    0&lt;br /&gt;
 &lt;br /&gt;
 # vgs&lt;br /&gt;
   VG  #PV #LV #SN Attr   VSize    VFree&lt;br /&gt;
   vg0   1   4   0 wz--n- &amp;lt;920.00g    0&lt;br /&gt;
&lt;br /&gt;
Next we need make the swap thick LV of 8gb &lt;br /&gt;
 lvcreate --name SWAP --size 8GiB vg0&lt;br /&gt;
&lt;br /&gt;
Now make a the rest into a pool for the thin volumes, but leave some free space in the VG, it will be needed if repairs must be made.  &lt;br /&gt;
 lvcreate --type thin-pool --extents +99%FREE --name alberca vg0&lt;br /&gt;
&lt;br /&gt;
Last make a root volume and then one for storing the recordings&lt;br /&gt;
&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name ROOT --thinpool alberca vg0&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name recordings --thinpool alberca vg0&lt;br /&gt;
 &lt;br /&gt;
 # lvs&lt;br /&gt;
   LV         VG  Attr       LSize    Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
   ROOT       vg0 Vwi-aotz--  128.00g alberca        7.18&lt;br /&gt;
   SWAP       vg0 -wi-ao----    8.00g&lt;br /&gt;
   alberca    vg0 twi-aotz-- &amp;lt;911.77g                1.14   10.75&lt;br /&gt;
   recordings vg0 Vwi-aotz--   50.00g alberca        2.37&lt;br /&gt;
&lt;br /&gt;
=== Filesystem setup === &lt;br /&gt;
Make some file systems on the root &lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-ROOT&lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-recordings&lt;br /&gt;
 mkswap /dev/mapper/SWAP&lt;br /&gt;
&lt;br /&gt;
=== Copy the sdcard to the filesystems ===&lt;br /&gt;
&lt;br /&gt;
so you can use cp or rsync to copy the file systems into the new place, but i used dd.  dd is not ideal as you need to tune the file systems to change the UUID's.&lt;br /&gt;
&lt;br /&gt;
 dd bs=4M conv=sparse if=/dev/mmblockroot of=/dev/mapper/ROOT&lt;br /&gt;
 dd bs=4M  if=/dev/mmblockboot of=/dev/nvme0n1p1&lt;br /&gt;
&lt;br /&gt;
Change the UUID's of the file systems&lt;br /&gt;
 tune2fs -U $(uuidgen) /dev/vg0/ROOT&lt;br /&gt;
 mlabel -n -i /dev/nvme0n1p1&lt;br /&gt;
 resize2fs /dev/vg0/ROOT&lt;br /&gt;
&lt;br /&gt;
get the new UUID's &lt;br /&gt;
 lsblk -f&lt;br /&gt;
&lt;br /&gt;
mount these in /mnt and chroot to them&lt;br /&gt;
 mount /dev/vg0/ROOT /mnt&lt;br /&gt;
 mount /dev/nvme0n0p1 /mnt/boot/firmware&lt;br /&gt;
 mount -t proc /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
 chroot /mnt&lt;br /&gt;
&lt;br /&gt;
Change fstab to boot off nvme&lt;br /&gt;
 cat /etc/fstab&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 UUID=1B01-6969  /boot/firmware  vfat    defaults          0       2&lt;br /&gt;
 UUID=d185ebc1-68df-4065-afe6-5ed288b28e32  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=01b68d2f-9577-4e63-b79f-6eaea8bbd61c       swap    swap    defaults        0       0&lt;br /&gt;
 UUID=d5d62f0a-054b-4f9b-a615-4c1b02373fdc       /home/svar      ext4    defaults,noatime  0       1&lt;br /&gt;
&lt;br /&gt;
disable swap in the chroot&lt;br /&gt;
 sudo systemctl disable dphys-swapfile.service&lt;br /&gt;
&lt;br /&gt;
exit the chroot and reboot.  remove the sdcard and confirm you're booting off the LVM.&lt;br /&gt;
&lt;br /&gt;
== Linux config == &lt;br /&gt;
&lt;br /&gt;
I set the timezone to local time and then configure the users/ssh keys.  If this will be remote it's a good idea to setup the ssh remote service for remote access. I have a page on this here [[Secure_Tunnel_Service|Secure Tunnel Service]]&lt;br /&gt;
&lt;br /&gt;
The user I use for this is 'svar' and must be added to the audio group&lt;br /&gt;
 usermod svar -a -G audio &lt;br /&gt;
 &lt;br /&gt;
 # groups svar&lt;br /&gt;
 svar : svar audio users&lt;br /&gt;
&lt;br /&gt;
== udev rules for ports == &lt;br /&gt;
I identify the ports as upper and lower, left and right on the RPI.  This should scale up to 32 devices max.  &lt;br /&gt;
&lt;br /&gt;
this will set the device properly using the name as below&lt;br /&gt;
 plughw:top-left,0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/udev/rules.d/50-alsa.rules&lt;br /&gt;
SUBSYSTEM!=&amp;quot;sound&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
ACTION!=&amp;quot;add&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
# top right port 1-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-right&amp;quot;&lt;br /&gt;
# bottom right 3-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-right&amp;quot;&lt;br /&gt;
# top left port 3-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-left&amp;quot;&lt;br /&gt;
# bottom left port 1-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-left&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LABEL=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software = &lt;br /&gt;
This uses this great software '[https://github.com/arkq/svar svar]'  https://github.com/arkq/svar&lt;br /&gt;
&lt;br /&gt;
compile and install it as /usr/loca/bin/svar &lt;br /&gt;
&lt;br /&gt;
== apt-get scripts ==&lt;br /&gt;
&lt;br /&gt;
Install the following packages &lt;br /&gt;
 apt-get install screen vim nvme-cli netcat-traditional lvm2 zfsutils-linux uml-utilities bridge-utils frr strongswan-swanctl strongswan isc-dhcp-client snmpd snmp locate xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl ifupdown-extra ifupdown ifupdown-multi rsyslog cmake libopusenc-dev libalsa-ocaml-dev libsndfile1-dev lame libmp3lame-dev samba smbclient wsdd2 git opus-tools jq telnet libstrongswan-extra-plugins mtools&lt;br /&gt;
&lt;br /&gt;
== systemd scripts ==&lt;br /&gt;
This runs as a script under systemd which will set the mic gain and the then invoke svar on each channel per it's config file.  if it crashes, it waits 5 seconds and restarts it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt;/etc/systemd/system/svar@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Start recording from %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=svar&lt;br /&gt;
EnvironmentFile=/etc/default/svar@%i&lt;br /&gt;
ExecStartPre=/usr/bin/amixer -D hw:%i -n sset Mic capture \${CAPLEVEL}&lt;br /&gt;
ExecStart=/usr/local/bin/svar -v --device=plughw:%i,0 -l\${VOXLEVEL} --rate=\${RATE} -s \${SEC} --fadeout-lag \${FOLAG} \${DIR}/\${FNAME}&lt;br /&gt;
# Restart every &amp;gt;2 seconds to avoid StartLimitInterval failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
Restart=always&lt;br /&gt;
SyslogIdentifier=svar@%i&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Config =&lt;br /&gt;
&lt;br /&gt;
== directory config ==&lt;br /&gt;
as svar you will need to make the following directories &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/svar/rec/top-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/top-left/current &lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-left/current&lt;br /&gt;
&lt;br /&gt;
== service config file == &lt;br /&gt;
&lt;br /&gt;
for each channel being recorded a separate service is used with it's own config&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export filename=''&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/default/svar@$filename&lt;br /&gt;
#audio level for capture&lt;br /&gt;
CAPLEVEL=&amp;quot;0&amp;quot; &lt;br /&gt;
#directory to put the files in&lt;br /&gt;
DIR=&amp;quot;/home/svar/rec/$filename/current&amp;quot;&lt;br /&gt;
FNAME=&amp;quot;$filename-%Y-%m-%d-%H%M.%S&amp;quot;&lt;br /&gt;
#this sets the VOX level &lt;br /&gt;
VOXLEVEL=&amp;quot;1&amp;quot;&lt;br /&gt;
RATE=&amp;quot;8000&amp;quot;&lt;br /&gt;
#seconds is the number of seconds to break up&lt;br /&gt;
#FOLAG is the lag in milliseconds and needs to match the seconds to ensure there is no&lt;br /&gt;
# clipping of silence in the output&lt;br /&gt;
SEC=&amp;quot;10&amp;quot;&lt;br /&gt;
FOLAG=&amp;quot;10000&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Start your services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable svar@top-right.service&lt;br /&gt;
systemctl start  svar@top-right.service&lt;br /&gt;
systemctl status svar@top-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@top-left.service&lt;br /&gt;
systemctl start  svar@top-left.service&lt;br /&gt;
systemctl status svar@top-left.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-right.service&lt;br /&gt;
systemctl start  svar@bottom-right.service&lt;br /&gt;
systemctl status svar@bottom-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-left.service&lt;br /&gt;
systemctl start  svar@bottom-left.service&lt;br /&gt;
systemctl status svar@bottom-left.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you should see all the audio dongles blinking if svar is active.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# service svar@* status&lt;br /&gt;
● svar@top-left.service - Start recording from top-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6873 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 17min 46.500s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-left.service&lt;br /&gt;
             └─6873 /usr/local/bin/svar -v --device=plughw:28,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-left/current/TL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@top-left.service - Start recording from top-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@top-left.service - Start recording from top-left.&lt;br /&gt;
Feb 13 09:50:00 DonPie svar[6873]: info: Creating new output file: /home/svar/rec/top-left/current/TL-2025-02-13-0950.00.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-right.service - Start recording from bottom-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2025-02-13 12:18:21 CST; 11h ago&lt;br /&gt;
    Process: 12137 ExecStartPre=/usr/bin/amixer -D hw:${HW} -n sset Mic capture 0 (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 12138 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 7min 3.715s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-right.service&lt;br /&gt;
             └─12138 /usr/local/bin/svar -v --device=plughw:31,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-right/current/BR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Starting svar@bottom-right.service - Start recording from bottom-right...&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Playback channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capture channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Started svar@bottom-right.service - Start recording from bottom-right.&lt;br /&gt;
&lt;br /&gt;
● svar@top-right.service - Start recording from top-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6864 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 18min 6.667s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-right.service&lt;br /&gt;
             └─6864 /usr/local/bin/svar -v --device=plughw:30,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-right/current/TR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 20:45:52 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2045.52.wav&lt;br /&gt;
Feb 13 20:54:56 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2054.56.wav&lt;br /&gt;
Feb 13 22:54:15 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2254.15.wav&lt;br /&gt;
Feb 13 22:56:06 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2256.06.wav&lt;br /&gt;
Feb 13 23:03:24 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2303.24.wav&lt;br /&gt;
Feb 13 23:11:22 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2311.22.wav&lt;br /&gt;
Feb 13 23:12:33 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2312.33.wav&lt;br /&gt;
Feb 13 23:16:16 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2316.16.wav&lt;br /&gt;
Feb 13 23:18:50 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2318.50.wav&lt;br /&gt;
Feb 13 23:21:41 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2321.41.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-left.service - Start recording from bottom-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6874 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 16min 49.254s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-left.service&lt;br /&gt;
             └─6874 /usr/local/bin/svar -v --device=plughw:29,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-left/current/BL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@bottom-left.service - Start recording from bottom-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@bottom-left.service - Start recording from bottom-left.&lt;br /&gt;
Feb 13 09:49:39 DonPie svar[6874]: info: Creating new output file: /home/svar/rec/bottom-left/current/BL-2025-02-13-0949.39.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SAMBA Config =&lt;br /&gt;
This makes a file share so that you can access the recordings on the system from another computer/windoze.&lt;br /&gt;
&lt;br /&gt;
Install software&lt;br /&gt;
 apt-get install samba smbclient wsdd&lt;br /&gt;
&lt;br /&gt;
'''Windoze 11 note'''&lt;br /&gt;
If you're running windoze 11, you will need to enable this in powershell.  M$ has fucked their shit up once again for no good reason. &lt;br /&gt;
 Set-SmbClientConfiguration -RequireSecuritySignature $false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== /etc/samba/smb.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   security = user&lt;br /&gt;
   netbios name = RecPie&lt;br /&gt;
   server string = RECORDER&lt;br /&gt;
   client min protocol = SMB2 &lt;br /&gt;
   server signing = mandatory&lt;br /&gt;
   client signing = mandatory&lt;br /&gt;
   interfaces = 127.0.0.0/8 eth0&lt;br /&gt;
   bind interfaces only = yes&lt;br /&gt;
   log file = /var/log/samba/log.%m&lt;br /&gt;
   max log size = 1000&lt;br /&gt;
   logging = file&lt;br /&gt;
   panic action = /usr/share/samba/panic-action %d&lt;br /&gt;
   server role = standalone server&lt;br /&gt;
   obey pam restrictions = yes&lt;br /&gt;
   unix password sync = yes&lt;br /&gt;
   passwd program = /usr/bin/passwd %u&lt;br /&gt;
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .&lt;br /&gt;
   pam password change = yes&lt;br /&gt;
   map to guest = Bad Password&lt;br /&gt;
   usershare allow guests = yes&lt;br /&gt;
[recorded]&lt;br /&gt;
    comment = recorder files&lt;br /&gt;
    path = /home/svar/rec&lt;br /&gt;
    read only = yes&lt;br /&gt;
    public = yes&lt;br /&gt;
    available = yes&lt;br /&gt;
    browsable = yes&lt;br /&gt;
    guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Transcription via OpenAI service =&lt;br /&gt;
&lt;br /&gt;
I've made a script that will use the wisperAI service to transcribe files into plain text and json format.  It also sorts them into a year/month/day directory hierarchy, and converts the wave files to 24 kbit/s Opus format which is about 20% the size of the wave format.  This allows up to a 2:22.22 long file to be automatically transcribed.  Anything longer will fail, and there's no support to split them up, so it's suggested that the $SEC and $FOLAG be touched to break files up.  &lt;br /&gt;
&lt;br /&gt;
This is then automated via systemd scripts that monitor the directories and fire off the transcription script in the background.  The only process that takes some CPU is opus encoding, but this is run with a 15 nice value to ensure there's no dropping of audio.  &lt;br /&gt;
&lt;br /&gt;
== transcribe.sh ==&lt;br /&gt;
&lt;br /&gt;
This is the script, it takes the basedir as it's only argument.  It's designed so that the source files will not be moved until all operations complete.&lt;br /&gt;
&lt;br /&gt;
https://github.com/W9CR/radiologger&lt;br /&gt;
&lt;br /&gt;
== Systemd config == &lt;br /&gt;
&lt;br /&gt;
There are two files needed, one to monitor the path and another to run when the path changes&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.path &amp;lt;&amp;lt;'EOF' &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Monitor folder %i/current for changes and transcribe files&lt;br /&gt;
&lt;br /&gt;
[Path]&lt;br /&gt;
PathChanged=/home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.service ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.service &amp;lt;&amp;lt;'EOF'&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe recording from /home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
User=svar&lt;br /&gt;
#EnvironmentFile=/etc/default/&lt;br /&gt;
ExecStart=/bin/bash /home/svar/scripts/transcriber.sh /home/svar/rec/%i&lt;br /&gt;
SyslogIdentifier=transcribe@%i&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Service ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable transcribe@top-left.path&lt;br /&gt;
systemctl enable transcribe@top-right.path&lt;br /&gt;
systemctl enable transcribe@bottom-left.path&lt;br /&gt;
systemctl enable transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
systemctl start transcribe@top-left.path&lt;br /&gt;
systemctl start transcribe@top-right.path&lt;br /&gt;
systemctl start transcribe@bottom-left.path&lt;br /&gt;
systemctl start transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
journalctl -f -u transcribe@top-left.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= todo = &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;S&amp;gt;opus support - opusenc --speech --bitrate 24 gives almost the same audio for 20% of the file size. &amp;lt;/S&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;speech to text&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;moving files into other directories via cron&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* script to make searching text files easier&lt;br /&gt;
&lt;br /&gt;
* script to compute the number of seconds per day/week/month/year on a channel&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8397</id>
		<title>Radio Channel Logger</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8397"/>
		<updated>2025-10-25T19:28:11Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* LVM config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems to be a common requirement to make recordings of a radio or scanner output.  I've not found much decent Free Software that can do this, and do it reliably in a headless configuration.  What I've used is documented here, and will do 4 audio channels reliably.  This soultion is unique as it uses OpenAI's API to transcribe the audio files to easily searchable text. &lt;br /&gt;
&lt;br /&gt;
My concept is based around a RPI 5 with Cmedia USB audio dongles as pictured below.  This is compact and low power, while a full Linux environment allows you to do many other things as needed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* 4 audio channels&lt;br /&gt;
* Date/time logging down to the seconds&lt;br /&gt;
* Configuration of settings per channel&lt;br /&gt;
* Recordings are 8000 samples per second 16 bit WAV&lt;br /&gt;
* VOX activated recording with VOX level set per channel &lt;br /&gt;
* Low Overhead on as no voice coding is taking place, should run on a pi0 for at least one channel (not tested)&lt;br /&gt;
* 1tb ssd used for recording.&lt;br /&gt;
&lt;br /&gt;
=Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPI 5==&lt;br /&gt;
* Case&lt;br /&gt;
* SSD&lt;br /&gt;
* nvme disk&lt;br /&gt;
* 4 usb jumpers&lt;br /&gt;
* PSU&lt;br /&gt;
* [https://www.ebay.com/itm/131905878673 Cmedia Dongles]&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
Per channel&lt;br /&gt;
&lt;br /&gt;
* CDM radio&lt;br /&gt;
* CDM radio interface cable&lt;br /&gt;
&lt;br /&gt;
== radio setup == &lt;br /&gt;
ensure the low level expansion is set in the personality and that demphasis is selected.&lt;br /&gt;
&lt;br /&gt;
= Linux = &lt;br /&gt;
The system is standard raspbian Linux &lt;br /&gt;
&lt;br /&gt;
What is different is that we are booting off the nvme directly.&lt;br /&gt;
&lt;br /&gt;
== Disk Setup ==&lt;br /&gt;
This is not a complete howto, but rather enough to figure it out.  You may want to do it differently.&lt;br /&gt;
&lt;br /&gt;
=== GPT table ===&lt;br /&gt;
Part 1 is /boot/firmware&lt;br /&gt;
&lt;br /&gt;
Part 2 is lvm&lt;br /&gt;
Leave a little at the end free, I picked 11gb&lt;br /&gt;
&lt;br /&gt;
 Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
    1            2048         1050623   512.0 MiB   0700  Microsoft basic data&lt;br /&gt;
    2         1050624      1930430463   920.0 GiB   8E00  Linux LVM&lt;br /&gt;
=== LVM config ===&lt;br /&gt;
From here I make that part 2 a LVM phsyical volume with 'pvcreate', then make the entire thing a volume group with vgcreate&lt;br /&gt;
&lt;br /&gt;
 pvcreate /dev/nvme0n1p2&lt;br /&gt;
 vgcreate vg0 /dev/nvme0n1p2&lt;br /&gt;
 &lt;br /&gt;
 # pvs&lt;br /&gt;
   PV             VG  Fmt  Attr PSize    PFree&lt;br /&gt;
   /dev/nvme0n1p2 vg0 lvm2 a--  &amp;lt;920.00g    0&lt;br /&gt;
 &lt;br /&gt;
 # vgs&lt;br /&gt;
   VG  #PV #LV #SN Attr   VSize    VFree&lt;br /&gt;
   vg0   1   4   0 wz--n- &amp;lt;920.00g    0&lt;br /&gt;
&lt;br /&gt;
Next we need make the swap thick LV of 8gb &lt;br /&gt;
 lvcreate --name SWAP --size 8GiB vg0&lt;br /&gt;
&lt;br /&gt;
Now make a the rest into a pool for the thin volumes, but leave some free space in the VG, it will be needed if repairs must be made.  &lt;br /&gt;
 lvcreate --type thin-pool --extents +99%FREE --name alberca vg0&lt;br /&gt;
&lt;br /&gt;
Last make a root volume and then one for storing the recordings&lt;br /&gt;
&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name ROOT --thinpool alberca vg0&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name recordings --thinpool alberca vg0&lt;br /&gt;
 &lt;br /&gt;
 # lvs&lt;br /&gt;
   LV         VG  Attr       LSize    Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
   ROOT       vg0 Vwi-aotz--  128.00g alberca        7.18&lt;br /&gt;
   SWAP       vg0 -wi-ao----    8.00g&lt;br /&gt;
   alberca    vg0 twi-aotz-- &amp;lt;911.77g                1.14   10.75&lt;br /&gt;
   recordings vg0 Vwi-aotz--   50.00g alberca        2.37&lt;br /&gt;
&lt;br /&gt;
=== Filesystem setup === &lt;br /&gt;
Make some file systems on the root &lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-ROOT&lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-recordings&lt;br /&gt;
 mkswap /dev/mapper/SWAP&lt;br /&gt;
&lt;br /&gt;
=== Copy the sdcard to the filesystems ===&lt;br /&gt;
&lt;br /&gt;
so you can use cp or rsync to copy the file systems into the new place, but i used dd.  dd is not ideal as you need to tune the file systems to change the UUID's.&lt;br /&gt;
&lt;br /&gt;
 dd bs=4M conv=sparse if=/dev/mmblockroot of=/dev/mapper/ROOT&lt;br /&gt;
 dd bs=4M  if=/dev/mmblockboot of=/dev/nvme0n1p1&lt;br /&gt;
&lt;br /&gt;
Change the UUID's of the file systems&lt;br /&gt;
 tune2fs -U $(uuidgen) /dev/vg0/ROOT&lt;br /&gt;
 mlabel -n -i /dev/nvme0n1p1&lt;br /&gt;
 resize2fs /dev/vg0/ROOT&lt;br /&gt;
&lt;br /&gt;
get the new UUID's &lt;br /&gt;
 lsblk -f&lt;br /&gt;
&lt;br /&gt;
mount these in /mnt and chroot to them&lt;br /&gt;
 mount /dev/vg0/ROOT /mnt&lt;br /&gt;
 mount /dev/nvme0n0p1 /mnt/boot/firmware&lt;br /&gt;
 mount -t proc /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
 chroot /mnt&lt;br /&gt;
&lt;br /&gt;
Change fstab to boot off nvme&lt;br /&gt;
 cat /etc/fstab&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 UUID=1B01-6969  /boot/firmware  vfat    defaults          0       2&lt;br /&gt;
 UUID=d185ebc1-68df-4065-afe6-5ed288b28e32  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=01b68d2f-9577-4e63-b79f-6eaea8bbd61c       swap    swap    defaults        0       0&lt;br /&gt;
 UUID=d5d62f0a-054b-4f9b-a615-4c1b02373fdc       /home/svar      ext4    defaults,noatime  0       1&lt;br /&gt;
&lt;br /&gt;
disable swap in the chroot&lt;br /&gt;
 sudo systemctl disable dphys-swapfile.service&lt;br /&gt;
&lt;br /&gt;
exit the chroot and reboot.  remove the sdcard and confirm you're booting off the LVM.&lt;br /&gt;
&lt;br /&gt;
== Linux config == &lt;br /&gt;
&lt;br /&gt;
I set the timezone to local time and then configure the users/ssh keys.  If this will be remote it's a good idea to setup the ssh remote service for remote access. I have a page on this here [[Secure_Tunnel_Service|Secure Tunnel Service]]&lt;br /&gt;
&lt;br /&gt;
The user I use for this is 'svar' and must be added to the audio group&lt;br /&gt;
 usermod svar -a -G audio &lt;br /&gt;
 &lt;br /&gt;
 # groups svar&lt;br /&gt;
 svar : svar audio users&lt;br /&gt;
&lt;br /&gt;
== udev rules for ports == &lt;br /&gt;
I identify the ports as upper and lower, left and right on the RPI.  This should scale up to 32 devices max.  &lt;br /&gt;
&lt;br /&gt;
this will set the device properly using the name as below&lt;br /&gt;
 plughw:top-left,0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/udev/rules.d/50-alsa.rules&lt;br /&gt;
SUBSYSTEM!=&amp;quot;sound&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
ACTION!=&amp;quot;add&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
# top right port 1-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-right&amp;quot;&lt;br /&gt;
# bottom right 3-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-right&amp;quot;&lt;br /&gt;
# top left port 3-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-left&amp;quot;&lt;br /&gt;
# bottom left port 1-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-left&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LABEL=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software = &lt;br /&gt;
This uses this great software '[https://github.com/arkq/svar svar]'  https://github.com/arkq/svar&lt;br /&gt;
&lt;br /&gt;
compile and install it as /usr/loca/bin/svar &lt;br /&gt;
&lt;br /&gt;
== apt-get scripts ==&lt;br /&gt;
&lt;br /&gt;
Install the following packages &lt;br /&gt;
 apt-get install screen vim nvme-cli netcat-traditional lvm2 zfsutils-linux uml-utilities bridge-utils frr strongswan-swanctl strongswan isc-dhcp-client snmpd snmp locate xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl ifupdown-extra ifupdown ifupdown-multi rsyslog cmake libopusenc-dev libalsa-ocaml-dev libsndfile1-dev lame libmp3lame-dev samba smbclient wsdd2 git opus-tools jq telnet libstrongswan-extra-plugins&lt;br /&gt;
&lt;br /&gt;
== systemd scripts ==&lt;br /&gt;
This runs as a script under systemd which will set the mic gain and the then invoke svar on each channel per it's config file.  if it crashes, it waits 5 seconds and restarts it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt;/etc/systemd/system/svar@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Start recording from %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=svar&lt;br /&gt;
EnvironmentFile=/etc/default/svar@%i&lt;br /&gt;
ExecStartPre=/usr/bin/amixer -D hw:%i -n sset Mic capture \${CAPLEVEL}&lt;br /&gt;
ExecStart=/usr/local/bin/svar -v --device=plughw:%i,0 -l\${VOXLEVEL} --rate=\${RATE} -s \${SEC} --fadeout-lag \${FOLAG} \${DIR}/\${FNAME}&lt;br /&gt;
# Restart every &amp;gt;2 seconds to avoid StartLimitInterval failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
Restart=always&lt;br /&gt;
SyslogIdentifier=svar@%i&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Config =&lt;br /&gt;
&lt;br /&gt;
== directory config ==&lt;br /&gt;
as svar you will need to make the following directories &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/svar/rec/top-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/top-left/current &lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-left/current&lt;br /&gt;
&lt;br /&gt;
== service config file == &lt;br /&gt;
&lt;br /&gt;
for each channel being recorded a separate service is used with it's own config&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export filename=''&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/default/svar@$filename&lt;br /&gt;
#audio level for capture&lt;br /&gt;
CAPLEVEL=&amp;quot;0&amp;quot; &lt;br /&gt;
#directory to put the files in&lt;br /&gt;
DIR=&amp;quot;/home/svar/rec/$filename/current&amp;quot;&lt;br /&gt;
FNAME=&amp;quot;$filename-%Y-%m-%d-%H%M.%S&amp;quot;&lt;br /&gt;
#this sets the VOX level &lt;br /&gt;
VOXLEVEL=&amp;quot;1&amp;quot;&lt;br /&gt;
RATE=&amp;quot;8000&amp;quot;&lt;br /&gt;
#seconds is the number of seconds to break up&lt;br /&gt;
#FOLAG is the lag in milliseconds and needs to match the seconds to ensure there is no&lt;br /&gt;
# clipping of silence in the output&lt;br /&gt;
SEC=&amp;quot;10&amp;quot;&lt;br /&gt;
FOLAG=&amp;quot;10000&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Start your services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable svar@top-right.service&lt;br /&gt;
systemctl start  svar@top-right.service&lt;br /&gt;
systemctl status svar@top-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@top-left.service&lt;br /&gt;
systemctl start  svar@top-left.service&lt;br /&gt;
systemctl status svar@top-left.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-right.service&lt;br /&gt;
systemctl start  svar@bottom-right.service&lt;br /&gt;
systemctl status svar@bottom-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-left.service&lt;br /&gt;
systemctl start  svar@bottom-left.service&lt;br /&gt;
systemctl status svar@bottom-left.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you should see all the audio dongles blinking if svar is active.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# service svar@* status&lt;br /&gt;
● svar@top-left.service - Start recording from top-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6873 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 17min 46.500s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-left.service&lt;br /&gt;
             └─6873 /usr/local/bin/svar -v --device=plughw:28,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-left/current/TL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@top-left.service - Start recording from top-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@top-left.service - Start recording from top-left.&lt;br /&gt;
Feb 13 09:50:00 DonPie svar[6873]: info: Creating new output file: /home/svar/rec/top-left/current/TL-2025-02-13-0950.00.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-right.service - Start recording from bottom-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2025-02-13 12:18:21 CST; 11h ago&lt;br /&gt;
    Process: 12137 ExecStartPre=/usr/bin/amixer -D hw:${HW} -n sset Mic capture 0 (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 12138 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 7min 3.715s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-right.service&lt;br /&gt;
             └─12138 /usr/local/bin/svar -v --device=plughw:31,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-right/current/BR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Starting svar@bottom-right.service - Start recording from bottom-right...&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Playback channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capture channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Started svar@bottom-right.service - Start recording from bottom-right.&lt;br /&gt;
&lt;br /&gt;
● svar@top-right.service - Start recording from top-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6864 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 18min 6.667s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-right.service&lt;br /&gt;
             └─6864 /usr/local/bin/svar -v --device=plughw:30,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-right/current/TR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 20:45:52 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2045.52.wav&lt;br /&gt;
Feb 13 20:54:56 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2054.56.wav&lt;br /&gt;
Feb 13 22:54:15 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2254.15.wav&lt;br /&gt;
Feb 13 22:56:06 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2256.06.wav&lt;br /&gt;
Feb 13 23:03:24 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2303.24.wav&lt;br /&gt;
Feb 13 23:11:22 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2311.22.wav&lt;br /&gt;
Feb 13 23:12:33 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2312.33.wav&lt;br /&gt;
Feb 13 23:16:16 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2316.16.wav&lt;br /&gt;
Feb 13 23:18:50 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2318.50.wav&lt;br /&gt;
Feb 13 23:21:41 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2321.41.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-left.service - Start recording from bottom-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6874 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 16min 49.254s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-left.service&lt;br /&gt;
             └─6874 /usr/local/bin/svar -v --device=plughw:29,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-left/current/BL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@bottom-left.service - Start recording from bottom-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@bottom-left.service - Start recording from bottom-left.&lt;br /&gt;
Feb 13 09:49:39 DonPie svar[6874]: info: Creating new output file: /home/svar/rec/bottom-left/current/BL-2025-02-13-0949.39.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SAMBA Config =&lt;br /&gt;
This makes a file share so that you can access the recordings on the system from another computer/windoze.&lt;br /&gt;
&lt;br /&gt;
Install software&lt;br /&gt;
 apt-get install samba smbclient wsdd&lt;br /&gt;
&lt;br /&gt;
'''Windoze 11 note'''&lt;br /&gt;
If you're running windoze 11, you will need to enable this in powershell.  M$ has fucked their shit up once again for no good reason. &lt;br /&gt;
 Set-SmbClientConfiguration -RequireSecuritySignature $false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== /etc/samba/smb.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   security = user&lt;br /&gt;
   netbios name = RecPie&lt;br /&gt;
   server string = RECORDER&lt;br /&gt;
   client min protocol = SMB2 &lt;br /&gt;
   server signing = mandatory&lt;br /&gt;
   client signing = mandatory&lt;br /&gt;
   interfaces = 127.0.0.0/8 eth0&lt;br /&gt;
   bind interfaces only = yes&lt;br /&gt;
   log file = /var/log/samba/log.%m&lt;br /&gt;
   max log size = 1000&lt;br /&gt;
   logging = file&lt;br /&gt;
   panic action = /usr/share/samba/panic-action %d&lt;br /&gt;
   server role = standalone server&lt;br /&gt;
   obey pam restrictions = yes&lt;br /&gt;
   unix password sync = yes&lt;br /&gt;
   passwd program = /usr/bin/passwd %u&lt;br /&gt;
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .&lt;br /&gt;
   pam password change = yes&lt;br /&gt;
   map to guest = Bad Password&lt;br /&gt;
   usershare allow guests = yes&lt;br /&gt;
[recorded]&lt;br /&gt;
    comment = recorder files&lt;br /&gt;
    path = /home/svar/rec&lt;br /&gt;
    read only = yes&lt;br /&gt;
    public = yes&lt;br /&gt;
    available = yes&lt;br /&gt;
    browsable = yes&lt;br /&gt;
    guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Transcription via OpenAI service =&lt;br /&gt;
&lt;br /&gt;
I've made a script that will use the wisperAI service to transcribe files into plain text and json format.  It also sorts them into a year/month/day directory hierarchy, and converts the wave files to 24 kbit/s Opus format which is about 20% the size of the wave format.  This allows up to a 2:22.22 long file to be automatically transcribed.  Anything longer will fail, and there's no support to split them up, so it's suggested that the $SEC and $FOLAG be touched to break files up.  &lt;br /&gt;
&lt;br /&gt;
This is then automated via systemd scripts that monitor the directories and fire off the transcription script in the background.  The only process that takes some CPU is opus encoding, but this is run with a 15 nice value to ensure there's no dropping of audio.  &lt;br /&gt;
&lt;br /&gt;
== transcribe.sh ==&lt;br /&gt;
&lt;br /&gt;
This is the script, it takes the basedir as it's only argument.  It's designed so that the source files will not be moved until all operations complete.&lt;br /&gt;
&lt;br /&gt;
https://github.com/W9CR/radiologger&lt;br /&gt;
&lt;br /&gt;
== Systemd config == &lt;br /&gt;
&lt;br /&gt;
There are two files needed, one to monitor the path and another to run when the path changes&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.path &amp;lt;&amp;lt;'EOF' &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Monitor folder %i/current for changes and transcribe files&lt;br /&gt;
&lt;br /&gt;
[Path]&lt;br /&gt;
PathChanged=/home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.service ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.service &amp;lt;&amp;lt;'EOF'&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe recording from /home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
User=svar&lt;br /&gt;
#EnvironmentFile=/etc/default/&lt;br /&gt;
ExecStart=/bin/bash /home/svar/scripts/transcriber.sh /home/svar/rec/%i&lt;br /&gt;
SyslogIdentifier=transcribe@%i&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Service ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable transcribe@top-left.path&lt;br /&gt;
systemctl enable transcribe@top-right.path&lt;br /&gt;
systemctl enable transcribe@bottom-left.path&lt;br /&gt;
systemctl enable transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
systemctl start transcribe@top-left.path&lt;br /&gt;
systemctl start transcribe@top-right.path&lt;br /&gt;
systemctl start transcribe@bottom-left.path&lt;br /&gt;
systemctl start transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
journalctl -f -u transcribe@top-left.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= todo = &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;S&amp;gt;opus support - opusenc --speech --bitrate 24 gives almost the same audio for 20% of the file size. &amp;lt;/S&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;speech to text&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;moving files into other directories via cron&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* script to make searching text files easier&lt;br /&gt;
&lt;br /&gt;
* script to compute the number of seconds per day/week/month/year on a channel&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8395</id>
		<title>Radio Channel Logger</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8395"/>
		<updated>2025-10-24T07:40:45Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* apt-get scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems to be a common requirement to make recordings of a radio or scanner output.  I've not found much decent Free Software that can do this, and do it reliably in a headless configuration.  What I've used is documented here, and will do 4 audio channels reliably.  This soultion is unique as it uses OpenAI's API to transcribe the audio files to easily searchable text. &lt;br /&gt;
&lt;br /&gt;
My concept is based around a RPI 5 with Cmedia USB audio dongles as pictured below.  This is compact and low power, while a full Linux environment allows you to do many other things as needed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* 4 audio channels&lt;br /&gt;
* Date/time logging down to the seconds&lt;br /&gt;
* Configuration of settings per channel&lt;br /&gt;
* Recordings are 8000 samples per second 16 bit WAV&lt;br /&gt;
* VOX activated recording with VOX level set per channel &lt;br /&gt;
* Low Overhead on as no voice coding is taking place, should run on a pi0 for at least one channel (not tested)&lt;br /&gt;
* 1tb ssd used for recording.&lt;br /&gt;
&lt;br /&gt;
=Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPI 5==&lt;br /&gt;
* Case&lt;br /&gt;
* SSD&lt;br /&gt;
* nvme disk&lt;br /&gt;
* 4 usb jumpers&lt;br /&gt;
* PSU&lt;br /&gt;
* [https://www.ebay.com/itm/131905878673 Cmedia Dongles]&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
Per channel&lt;br /&gt;
&lt;br /&gt;
* CDM radio&lt;br /&gt;
* CDM radio interface cable&lt;br /&gt;
&lt;br /&gt;
== radio setup == &lt;br /&gt;
ensure the low level expansion is set in the personality and that demphasis is selected.&lt;br /&gt;
&lt;br /&gt;
= Linux = &lt;br /&gt;
The system is standard raspbian Linux &lt;br /&gt;
&lt;br /&gt;
What is different is that we are booting off the nvme directly.&lt;br /&gt;
&lt;br /&gt;
== Disk Setup ==&lt;br /&gt;
This is not a complete howto, but rather enough to figure it out.  You may want to do it differently.&lt;br /&gt;
&lt;br /&gt;
=== GPT table ===&lt;br /&gt;
Part 1 is /boot/firmware&lt;br /&gt;
&lt;br /&gt;
Part 2 is lvm&lt;br /&gt;
Leave a little at the end free, I picked 11gb&lt;br /&gt;
&lt;br /&gt;
 Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
    1            2048         1050623   512.0 MiB   0700  Microsoft basic data&lt;br /&gt;
    2         1050624      1930430463   920.0 GiB   8E00  Linux LVM&lt;br /&gt;
=== LVM config ===&lt;br /&gt;
From here I make that part 2 a LVM phsyical volume with 'pvcreate', then make the entire thing a volume group with vgcreate&lt;br /&gt;
&lt;br /&gt;
 pvcreate /dev/nvme0n1p2&lt;br /&gt;
 vgcreate vg0 /dev/nvme0n1p2&lt;br /&gt;
 &lt;br /&gt;
 # pvs&lt;br /&gt;
   PV             VG  Fmt  Attr PSize    PFree&lt;br /&gt;
   /dev/nvme0n1p2 vg0 lvm2 a--  &amp;lt;920.00g    0&lt;br /&gt;
 &lt;br /&gt;
 # vgs&lt;br /&gt;
   VG  #PV #LV #SN Attr   VSize    VFree&lt;br /&gt;
   vg0   1   4   0 wz--n- &amp;lt;920.00g    0&lt;br /&gt;
&lt;br /&gt;
Next we need make the swap thick LV of 8gb &lt;br /&gt;
 lvcreate --name SWAP --size 8GiB vg0&lt;br /&gt;
&lt;br /&gt;
Now make a the rest into a pool for the thin volumes&lt;br /&gt;
 lvcreate --type thin-pool --extents +100%FREE --name alberca vg0&lt;br /&gt;
&lt;br /&gt;
Last make a root volume and then one for storing the recordings&lt;br /&gt;
&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name ROOT --thinpool alberca vg0&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name recordings --thinpool alberca vg0&lt;br /&gt;
 &lt;br /&gt;
 # lvs&lt;br /&gt;
   LV         VG  Attr       LSize    Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
   ROOT       vg0 Vwi-aotz--  128.00g alberca        7.18&lt;br /&gt;
   SWAP       vg0 -wi-ao----    8.00g&lt;br /&gt;
   alberca    vg0 twi-aotz-- &amp;lt;911.77g                1.14   10.75&lt;br /&gt;
   recordings vg0 Vwi-aotz--   50.00g alberca        2.37&lt;br /&gt;
=== Filesystem setup === &lt;br /&gt;
Make some file systems on the root &lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-ROOT&lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-recordings&lt;br /&gt;
 mkswap /dev/mapper/SWAP&lt;br /&gt;
&lt;br /&gt;
=== Copy the sdcard to the filesystems ===&lt;br /&gt;
&lt;br /&gt;
so you can use cp or rsync to copy the file systems into the new place, but i used dd.  dd is not ideal as you need to tune the file systems to change the UUID's.&lt;br /&gt;
&lt;br /&gt;
 dd bs=4M conv=sparse if=/dev/mmblockroot of=/dev/mapper/ROOT&lt;br /&gt;
 dd bs=4M  if=/dev/mmblockboot of=/dev/nvme0n1p1&lt;br /&gt;
&lt;br /&gt;
Change the UUID's of the file systems&lt;br /&gt;
 tune2fs -U $(uuidgen) /dev/vg0/ROOT&lt;br /&gt;
 mlabel -n -i /dev/nvme0n1p1&lt;br /&gt;
 resize2fs /dev/vg0/ROOT&lt;br /&gt;
&lt;br /&gt;
get the new UUID's &lt;br /&gt;
 lsblk -f&lt;br /&gt;
&lt;br /&gt;
mount these in /mnt and chroot to them&lt;br /&gt;
 mount /dev/vg0/ROOT /mnt&lt;br /&gt;
 mount /dev/nvme0n0p1 /mnt/boot/firmware&lt;br /&gt;
 mount -t proc /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
 chroot /mnt&lt;br /&gt;
&lt;br /&gt;
Change fstab to boot off nvme&lt;br /&gt;
 cat /etc/fstab&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 UUID=1B01-6969  /boot/firmware  vfat    defaults          0       2&lt;br /&gt;
 UUID=d185ebc1-68df-4065-afe6-5ed288b28e32  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=01b68d2f-9577-4e63-b79f-6eaea8bbd61c       swap    swap    defaults        0       0&lt;br /&gt;
 UUID=d5d62f0a-054b-4f9b-a615-4c1b02373fdc       /home/svar      ext4    defaults,noatime  0       1&lt;br /&gt;
&lt;br /&gt;
disable swap in the chroot&lt;br /&gt;
 sudo systemctl disable dphys-swapfile.service&lt;br /&gt;
&lt;br /&gt;
exit the chroot and reboot.  remove the sdcard and confirm you're booting off the LVM.&lt;br /&gt;
&lt;br /&gt;
== Linux config == &lt;br /&gt;
&lt;br /&gt;
I set the timezone to local time and then configure the users/ssh keys.  If this will be remote it's a good idea to setup the ssh remote service for remote access. I have a page on this here [[Secure_Tunnel_Service|Secure Tunnel Service]]&lt;br /&gt;
&lt;br /&gt;
The user I use for this is 'svar' and must be added to the audio group&lt;br /&gt;
 usermod svar -a -G audio &lt;br /&gt;
 &lt;br /&gt;
 # groups svar&lt;br /&gt;
 svar : svar audio users&lt;br /&gt;
&lt;br /&gt;
== udev rules for ports == &lt;br /&gt;
I identify the ports as upper and lower, left and right on the RPI.  This should scale up to 32 devices max.  &lt;br /&gt;
&lt;br /&gt;
this will set the device properly using the name as below&lt;br /&gt;
 plughw:top-left,0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/udev/rules.d/50-alsa.rules&lt;br /&gt;
SUBSYSTEM!=&amp;quot;sound&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
ACTION!=&amp;quot;add&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
# top right port 1-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-right&amp;quot;&lt;br /&gt;
# bottom right 3-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-right&amp;quot;&lt;br /&gt;
# top left port 3-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-left&amp;quot;&lt;br /&gt;
# bottom left port 1-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-left&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LABEL=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software = &lt;br /&gt;
This uses this great software '[https://github.com/arkq/svar svar]'  https://github.com/arkq/svar&lt;br /&gt;
&lt;br /&gt;
compile and install it as /usr/loca/bin/svar &lt;br /&gt;
&lt;br /&gt;
== apt-get scripts ==&lt;br /&gt;
&lt;br /&gt;
Install the following packages &lt;br /&gt;
 apt-get install screen vim nvme-cli netcat-traditional lvm2 zfsutils-linux uml-utilities bridge-utils frr strongswan-swanctl strongswan isc-dhcp-client snmpd snmp locate xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl ifupdown-extra ifupdown ifupdown-multi rsyslog cmake libopusenc-dev libalsa-ocaml-dev libsndfile1-dev lame libmp3lame-dev samba smbclient wsdd2 git opus-tools jq telnet libstrongswan-extra-plugins&lt;br /&gt;
&lt;br /&gt;
== systemd scripts ==&lt;br /&gt;
This runs as a script under systemd which will set the mic gain and the then invoke svar on each channel per it's config file.  if it crashes, it waits 5 seconds and restarts it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt;/etc/systemd/system/svar@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Start recording from %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=svar&lt;br /&gt;
EnvironmentFile=/etc/default/svar@%i&lt;br /&gt;
ExecStartPre=/usr/bin/amixer -D hw:%i -n sset Mic capture \${CAPLEVEL}&lt;br /&gt;
ExecStart=/usr/local/bin/svar -v --device=plughw:%i,0 -l\${VOXLEVEL} --rate=\${RATE} -s \${SEC} --fadeout-lag \${FOLAG} \${DIR}/\${FNAME}&lt;br /&gt;
# Restart every &amp;gt;2 seconds to avoid StartLimitInterval failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
Restart=always&lt;br /&gt;
SyslogIdentifier=svar@%i&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Config =&lt;br /&gt;
&lt;br /&gt;
== directory config ==&lt;br /&gt;
as svar you will need to make the following directories &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/svar/rec/top-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/top-left/current &lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-left/current&lt;br /&gt;
&lt;br /&gt;
== service config file == &lt;br /&gt;
&lt;br /&gt;
for each channel being recorded a separate service is used with it's own config&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export filename=''&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/default/svar@$filename&lt;br /&gt;
#audio level for capture&lt;br /&gt;
CAPLEVEL=&amp;quot;0&amp;quot; &lt;br /&gt;
#directory to put the files in&lt;br /&gt;
DIR=&amp;quot;/home/svar/rec/$filename/current&amp;quot;&lt;br /&gt;
FNAME=&amp;quot;$filename-%Y-%m-%d-%H%M.%S&amp;quot;&lt;br /&gt;
#this sets the VOX level &lt;br /&gt;
VOXLEVEL=&amp;quot;1&amp;quot;&lt;br /&gt;
RATE=&amp;quot;8000&amp;quot;&lt;br /&gt;
#seconds is the number of seconds to break up&lt;br /&gt;
#FOLAG is the lag in milliseconds and needs to match the seconds to ensure there is no&lt;br /&gt;
# clipping of silence in the output&lt;br /&gt;
SEC=&amp;quot;10&amp;quot;&lt;br /&gt;
FOLAG=&amp;quot;10000&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Start your services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable svar@top-right.service&lt;br /&gt;
systemctl start  svar@top-right.service&lt;br /&gt;
systemctl status svar@top-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@top-left.service&lt;br /&gt;
systemctl start  svar@top-left.service&lt;br /&gt;
systemctl status svar@top-left.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-right.service&lt;br /&gt;
systemctl start  svar@bottom-right.service&lt;br /&gt;
systemctl status svar@bottom-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-left.service&lt;br /&gt;
systemctl start  svar@bottom-left.service&lt;br /&gt;
systemctl status svar@bottom-left.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you should see all the audio dongles blinking if svar is active.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# service svar@* status&lt;br /&gt;
● svar@top-left.service - Start recording from top-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6873 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 17min 46.500s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-left.service&lt;br /&gt;
             └─6873 /usr/local/bin/svar -v --device=plughw:28,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-left/current/TL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@top-left.service - Start recording from top-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@top-left.service - Start recording from top-left.&lt;br /&gt;
Feb 13 09:50:00 DonPie svar[6873]: info: Creating new output file: /home/svar/rec/top-left/current/TL-2025-02-13-0950.00.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-right.service - Start recording from bottom-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2025-02-13 12:18:21 CST; 11h ago&lt;br /&gt;
    Process: 12137 ExecStartPre=/usr/bin/amixer -D hw:${HW} -n sset Mic capture 0 (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 12138 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 7min 3.715s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-right.service&lt;br /&gt;
             └─12138 /usr/local/bin/svar -v --device=plughw:31,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-right/current/BR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Starting svar@bottom-right.service - Start recording from bottom-right...&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Playback channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capture channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Started svar@bottom-right.service - Start recording from bottom-right.&lt;br /&gt;
&lt;br /&gt;
● svar@top-right.service - Start recording from top-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6864 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 18min 6.667s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-right.service&lt;br /&gt;
             └─6864 /usr/local/bin/svar -v --device=plughw:30,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-right/current/TR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 20:45:52 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2045.52.wav&lt;br /&gt;
Feb 13 20:54:56 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2054.56.wav&lt;br /&gt;
Feb 13 22:54:15 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2254.15.wav&lt;br /&gt;
Feb 13 22:56:06 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2256.06.wav&lt;br /&gt;
Feb 13 23:03:24 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2303.24.wav&lt;br /&gt;
Feb 13 23:11:22 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2311.22.wav&lt;br /&gt;
Feb 13 23:12:33 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2312.33.wav&lt;br /&gt;
Feb 13 23:16:16 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2316.16.wav&lt;br /&gt;
Feb 13 23:18:50 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2318.50.wav&lt;br /&gt;
Feb 13 23:21:41 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2321.41.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-left.service - Start recording from bottom-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6874 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 16min 49.254s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-left.service&lt;br /&gt;
             └─6874 /usr/local/bin/svar -v --device=plughw:29,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-left/current/BL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@bottom-left.service - Start recording from bottom-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@bottom-left.service - Start recording from bottom-left.&lt;br /&gt;
Feb 13 09:49:39 DonPie svar[6874]: info: Creating new output file: /home/svar/rec/bottom-left/current/BL-2025-02-13-0949.39.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SAMBA Config =&lt;br /&gt;
This makes a file share so that you can access the recordings on the system from another computer/windoze.&lt;br /&gt;
&lt;br /&gt;
Install software&lt;br /&gt;
 apt-get install samba smbclient wsdd&lt;br /&gt;
&lt;br /&gt;
'''Windoze 11 note'''&lt;br /&gt;
If you're running windoze 11, you will need to enable this in powershell.  M$ has fucked their shit up once again for no good reason. &lt;br /&gt;
 Set-SmbClientConfiguration -RequireSecuritySignature $false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== /etc/samba/smb.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   security = user&lt;br /&gt;
   netbios name = RecPie&lt;br /&gt;
   server string = RECORDER&lt;br /&gt;
   client min protocol = SMB2 &lt;br /&gt;
   server signing = mandatory&lt;br /&gt;
   client signing = mandatory&lt;br /&gt;
   interfaces = 127.0.0.0/8 eth0&lt;br /&gt;
   bind interfaces only = yes&lt;br /&gt;
   log file = /var/log/samba/log.%m&lt;br /&gt;
   max log size = 1000&lt;br /&gt;
   logging = file&lt;br /&gt;
   panic action = /usr/share/samba/panic-action %d&lt;br /&gt;
   server role = standalone server&lt;br /&gt;
   obey pam restrictions = yes&lt;br /&gt;
   unix password sync = yes&lt;br /&gt;
   passwd program = /usr/bin/passwd %u&lt;br /&gt;
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .&lt;br /&gt;
   pam password change = yes&lt;br /&gt;
   map to guest = Bad Password&lt;br /&gt;
   usershare allow guests = yes&lt;br /&gt;
[recorded]&lt;br /&gt;
    comment = recorder files&lt;br /&gt;
    path = /home/svar/rec&lt;br /&gt;
    read only = yes&lt;br /&gt;
    public = yes&lt;br /&gt;
    available = yes&lt;br /&gt;
    browsable = yes&lt;br /&gt;
    guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Transcription via OpenAI service =&lt;br /&gt;
&lt;br /&gt;
I've made a script that will use the wisperAI service to transcribe files into plain text and json format.  It also sorts them into a year/month/day directory hierarchy, and converts the wave files to 24 kbit/s Opus format which is about 20% the size of the wave format.  This allows up to a 2:22.22 long file to be automatically transcribed.  Anything longer will fail, and there's no support to split them up, so it's suggested that the $SEC and $FOLAG be touched to break files up.  &lt;br /&gt;
&lt;br /&gt;
This is then automated via systemd scripts that monitor the directories and fire off the transcription script in the background.  The only process that takes some CPU is opus encoding, but this is run with a 15 nice value to ensure there's no dropping of audio.  &lt;br /&gt;
&lt;br /&gt;
== transcribe.sh ==&lt;br /&gt;
&lt;br /&gt;
This is the script, it takes the basedir as it's only argument.  It's designed so that the source files will not be moved until all operations complete.&lt;br /&gt;
&lt;br /&gt;
https://github.com/W9CR/radiologger&lt;br /&gt;
&lt;br /&gt;
== Systemd config == &lt;br /&gt;
&lt;br /&gt;
There are two files needed, one to monitor the path and another to run when the path changes&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.path &amp;lt;&amp;lt;'EOF' &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Monitor folder %i/current for changes and transcribe files&lt;br /&gt;
&lt;br /&gt;
[Path]&lt;br /&gt;
PathChanged=/home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.service ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.service &amp;lt;&amp;lt;'EOF'&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe recording from /home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
User=svar&lt;br /&gt;
#EnvironmentFile=/etc/default/&lt;br /&gt;
ExecStart=/bin/bash /home/svar/scripts/transcriber.sh /home/svar/rec/%i&lt;br /&gt;
SyslogIdentifier=transcribe@%i&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Service ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable transcribe@top-left.path&lt;br /&gt;
systemctl enable transcribe@top-right.path&lt;br /&gt;
systemctl enable transcribe@bottom-left.path&lt;br /&gt;
systemctl enable transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
systemctl start transcribe@top-left.path&lt;br /&gt;
systemctl start transcribe@top-right.path&lt;br /&gt;
systemctl start transcribe@bottom-left.path&lt;br /&gt;
systemctl start transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
journalctl -f -u transcribe@top-left.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= todo = &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;S&amp;gt;opus support - opusenc --speech --bitrate 24 gives almost the same audio for 20% of the file size. &amp;lt;/S&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;speech to text&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;moving files into other directories via cron&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* script to make searching text files easier&lt;br /&gt;
&lt;br /&gt;
* script to compute the number of seconds per day/week/month/year on a channel&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Main_Page&amp;diff=8394</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Main_Page&amp;diff=8394"/>
		<updated>2025-10-24T03:20:02Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''W9CR info site'''&lt;br /&gt;
&lt;br /&gt;
This is a small collection of stuff about hacking various radios.  Right now it's mostly about the [[Quantar]] series of radios.&lt;br /&gt;
&lt;br /&gt;
I expect to have some info on the [[AstroTac]] receiver and [[ASTRO-TAC|Comparators]] as well.  &lt;br /&gt;
&lt;br /&gt;
I've added some details on the [[PDR 3500|PDR3500 Transportable Repeater]] too.  &lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
*[[Special:Categories|Categories]] - A listing of all categories on this wiki&lt;br /&gt;
----&lt;br /&gt;
= Radios/Electronics =&lt;br /&gt;
&lt;br /&gt;
*Information on the [[MTR Repeater|MTR2000 repeater]] I've messed with a while back.  These are a &amp;quot;Quantar-lite&amp;quot;, and kinda suck.  I've recently added how to update them to the latest firmware. &lt;br /&gt;
*There is some information on the [[Uniden MRS904]] repeater converting it for amateur use.&lt;br /&gt;
*Motorola [[Waris|Waris]] modifications and tech info.  This covers the entire Waris line, HT/CDM/Pro/GP/GM/MTM700/EX/PR/CP &lt;br /&gt;
*[[Motorola R2001D|Motorola R2001A/B/C/D communication service monitor information and manuals]]&lt;br /&gt;
*[[Hamtronics 220 repeater]] notes&lt;br /&gt;
*[[Telewave]] antenna patterns for radio mobile.&lt;br /&gt;
*[[XTS 2500]] notes on programing for the 900 MHz Ham band.&lt;br /&gt;
*[[XTL Radio]] info on the XTL 2500/5000 mobile radios &lt;br /&gt;
*[[EF_Johnson]] some notes and programing info on the EF Johnson 5100 and 5300 radios&lt;br /&gt;
*[[Yaesu FT-51]] Info on modification and service manual&lt;br /&gt;
*[[Kenwood Manuals|Kenwood Service Manuals]] - Kenwood service manuals I've scanned&lt;br /&gt;
*[[:Category:Kenwood Manuals| Kenwood Manual Category]]&lt;br /&gt;
*[[:Category:Yaesu|Yaesu Category]]&lt;br /&gt;
*[[Harris Falcon]]&lt;br /&gt;
*[[DMR IDs]] - Thoughts on the ham DMR ID fiasco. &lt;br /&gt;
*[[Trasnmitter Combiners]] - notes on transmitter combiners I've worked with and general theory.&lt;br /&gt;
*[[2020 Ram 1500 Radio Install|2020 Ram 1500 Eco Diesel Radio Install]] - Work in progress about how I installed radios in my truck.&lt;br /&gt;
*[[BreezeACCESS|BreezeACCESS FHSS radios]] - work in progress about how to repurpose the BreezeCOM/Alvarion BreezeACCESS II/900/V radios and convert the SU to AU.  This was the top of the line wireless ISP gear circa 1998-2004.&lt;br /&gt;
*[[:Category:Astro_Saber/Spectra|Astro Saber/XTS/Spectra category and notes]]&lt;br /&gt;
*[[:Category:SABER|Motorola Saber Radio category]]&lt;br /&gt;
*[[Transmitter Fingerprinting]] Info on various Transmitter Fingerprinting Implementations.&lt;br /&gt;
*[[QST Metaverse &amp;amp; Furries Cover|QST November 2023 Furry Fandom Cover idiocy]]&lt;br /&gt;
*[[Logbook of The World (LOTW) Cyberattack|ARRL Logbook of The World (LOTW) Cyberattack notes]]&lt;br /&gt;
&lt;br /&gt;
= Computers/Networking =&lt;br /&gt;
*[[Cisco 3945|Cisco 3945 Notes on changing fans to be quieter]]&lt;br /&gt;
*[[HamWAN Remote Site|HamWAN remote]], a way to link into HamWAN Tampa via VPN using cheap routers.&lt;br /&gt;
*[[:Category:Inmarsat|Inmarsat Docs]] Found online&lt;br /&gt;
&lt;br /&gt;
*[[Radio Channel Logger|Radio Channel Logger]], a low cost multi-channel logging recorder, with transcription.  Suitable for radio or telephony applications.&lt;br /&gt;
&lt;br /&gt;
= Allstar =&lt;br /&gt;
*[[Dahdi dummy|dahdi_dummy for AllStarLink 1.01 and HamVoIP theft of code.]]&lt;br /&gt;
*[[AllStarLink, Inc.|Information about the take over of AllStarLink, Inc.]]&lt;br /&gt;
== Todd Lesser ==&lt;br /&gt;
*[[Todd Lesser|Todd Lesser of San Diego, CA and his company North County Communication, Inc.]] is known to engage in fraudulent telecom billing via his sex chat lines.  Has several judgements against him and and his companies in [[Todd_Lesser#San_Diego_County|California]] and [[Todd_Lesser#West_Virginia|West Virginia]].  His company has also lost a case in [[Todd_Lesser#New_York|New York]] and was denied a petition for review by the [[Todd_Lesser#United_States_Supreme_Court|US Supreme Court]].&lt;br /&gt;
&lt;br /&gt;
= Documents and Standards =&lt;br /&gt;
*[[R56 - Standards and Guidelines for Communication Sites]]&lt;br /&gt;
&lt;br /&gt;
= Miscellaneous =&lt;br /&gt;
*[[TEOTWAWKI]] - This might be useful for regular and irregular forces.&lt;br /&gt;
&lt;br /&gt;
* [[Ken Bryant|Ken Bryant, K1DMR of North Georgia Communications doesn't want you to see this]]&lt;br /&gt;
&lt;br /&gt;
* [[Goatse.cx Mirrors|List of Goatse Mirrrors]]&lt;br /&gt;
&lt;br /&gt;
= Useful Links = &lt;br /&gt;
&lt;br /&gt;
[https://www.penpapernomographic.com/ High Quality PDF Smith Charts]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
*Total pages on this wiki: {{NUMBEROFPAGES}}&lt;br /&gt;
*Total articles on this wiki: {{NUMBEROFARTICLES}}&lt;br /&gt;
*Total files on this wiki: {{NUMBEROFFILES}}&lt;br /&gt;
*Total edits of this wiki: {{NUMBEROFEDITS}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://wiki.w9cr.net/sitemap.xml sitemap]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8393</id>
		<title>Radio Channel Logger</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8393"/>
		<updated>2025-10-23T03:48:07Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* apt-get scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems to be a common requirement to make recordings of a radio or scanner output.  I've not found much decent Free Software that can do this, and do it reliably in a headless configuration.  What I've used is documented here, and will do 4 audio channels reliably.  This soultion is unique as it uses OpenAI's API to transcribe the audio files to easily searchable text. &lt;br /&gt;
&lt;br /&gt;
My concept is based around a RPI 5 with Cmedia USB audio dongles as pictured below.  This is compact and low power, while a full Linux environment allows you to do many other things as needed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* 4 audio channels&lt;br /&gt;
* Date/time logging down to the seconds&lt;br /&gt;
* Configuration of settings per channel&lt;br /&gt;
* Recordings are 8000 samples per second 16 bit WAV&lt;br /&gt;
* VOX activated recording with VOX level set per channel &lt;br /&gt;
* Low Overhead on as no voice coding is taking place, should run on a pi0 for at least one channel (not tested)&lt;br /&gt;
* 1tb ssd used for recording.&lt;br /&gt;
&lt;br /&gt;
=Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPI 5==&lt;br /&gt;
* Case&lt;br /&gt;
* SSD&lt;br /&gt;
* nvme disk&lt;br /&gt;
* 4 usb jumpers&lt;br /&gt;
* PSU&lt;br /&gt;
* [https://www.ebay.com/itm/131905878673 Cmedia Dongles]&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
Per channel&lt;br /&gt;
&lt;br /&gt;
* CDM radio&lt;br /&gt;
* CDM radio interface cable&lt;br /&gt;
&lt;br /&gt;
== radio setup == &lt;br /&gt;
ensure the low level expansion is set in the personality and that demphasis is selected.&lt;br /&gt;
&lt;br /&gt;
= Linux = &lt;br /&gt;
The system is standard raspbian Linux &lt;br /&gt;
&lt;br /&gt;
What is different is that we are booting off the nvme directly.&lt;br /&gt;
&lt;br /&gt;
== Disk Setup ==&lt;br /&gt;
This is not a complete howto, but rather enough to figure it out.  You may want to do it differently.&lt;br /&gt;
&lt;br /&gt;
=== GPT table ===&lt;br /&gt;
Part 1 is /boot/firmware&lt;br /&gt;
&lt;br /&gt;
Part 2 is lvm&lt;br /&gt;
Leave a little at the end free, I picked 11gb&lt;br /&gt;
&lt;br /&gt;
 Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
    1            2048         1050623   512.0 MiB   0700  Microsoft basic data&lt;br /&gt;
    2         1050624      1930430463   920.0 GiB   8E00  Linux LVM&lt;br /&gt;
=== LVM config ===&lt;br /&gt;
From here I make that part 2 a LVM phsyical volume with 'pvcreate', then make the entire thing a volume group with vgcreate&lt;br /&gt;
&lt;br /&gt;
 pvcreate /dev/nvme0n1p2&lt;br /&gt;
 vgcreate vg0 /dev/nvme0n1p2&lt;br /&gt;
 &lt;br /&gt;
 # pvs&lt;br /&gt;
   PV             VG  Fmt  Attr PSize    PFree&lt;br /&gt;
   /dev/nvme0n1p2 vg0 lvm2 a--  &amp;lt;920.00g    0&lt;br /&gt;
 &lt;br /&gt;
 # vgs&lt;br /&gt;
   VG  #PV #LV #SN Attr   VSize    VFree&lt;br /&gt;
   vg0   1   4   0 wz--n- &amp;lt;920.00g    0&lt;br /&gt;
&lt;br /&gt;
Next we need make the swap thick LV of 8gb &lt;br /&gt;
 lvcreate --name SWAP --size 8GiB vg0&lt;br /&gt;
&lt;br /&gt;
Now make a the rest into a pool for the thin volumes&lt;br /&gt;
 lvcreate --type thin-pool --extents +100%FREE --name alberca vg0&lt;br /&gt;
&lt;br /&gt;
Last make a root volume and then one for storing the recordings&lt;br /&gt;
&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name ROOT --thinpool alberca vg0&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name recordings --thinpool alberca vg0&lt;br /&gt;
 &lt;br /&gt;
 # lvs&lt;br /&gt;
   LV         VG  Attr       LSize    Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
   ROOT       vg0 Vwi-aotz--  128.00g alberca        7.18&lt;br /&gt;
   SWAP       vg0 -wi-ao----    8.00g&lt;br /&gt;
   alberca    vg0 twi-aotz-- &amp;lt;911.77g                1.14   10.75&lt;br /&gt;
   recordings vg0 Vwi-aotz--   50.00g alberca        2.37&lt;br /&gt;
=== Filesystem setup === &lt;br /&gt;
Make some file systems on the root &lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-ROOT&lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-recordings&lt;br /&gt;
 mkswap /dev/mapper/SWAP&lt;br /&gt;
&lt;br /&gt;
=== Copy the sdcard to the filesystems ===&lt;br /&gt;
&lt;br /&gt;
so you can use cp or rsync to copy the file systems into the new place, but i used dd.  dd is not ideal as you need to tune the file systems to change the UUID's.&lt;br /&gt;
&lt;br /&gt;
 dd bs=4M conv=sparse if=/dev/mmblockroot of=/dev/mapper/ROOT&lt;br /&gt;
 dd bs=4M  if=/dev/mmblockboot of=/dev/nvme0n1p1&lt;br /&gt;
&lt;br /&gt;
Change the UUID's of the file systems&lt;br /&gt;
 tune2fs -U $(uuidgen) /dev/vg0/ROOT&lt;br /&gt;
 mlabel -n -i /dev/nvme0n1p1&lt;br /&gt;
 resize2fs /dev/vg0/ROOT&lt;br /&gt;
&lt;br /&gt;
get the new UUID's &lt;br /&gt;
 lsblk -f&lt;br /&gt;
&lt;br /&gt;
mount these in /mnt and chroot to them&lt;br /&gt;
 mount /dev/vg0/ROOT /mnt&lt;br /&gt;
 mount /dev/nvme0n0p1 /mnt/boot/firmware&lt;br /&gt;
 mount -t proc /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
 chroot /mnt&lt;br /&gt;
&lt;br /&gt;
Change fstab to boot off nvme&lt;br /&gt;
 cat /etc/fstab&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 UUID=1B01-6969  /boot/firmware  vfat    defaults          0       2&lt;br /&gt;
 UUID=d185ebc1-68df-4065-afe6-5ed288b28e32  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=01b68d2f-9577-4e63-b79f-6eaea8bbd61c       swap    swap    defaults        0       0&lt;br /&gt;
 UUID=d5d62f0a-054b-4f9b-a615-4c1b02373fdc       /home/svar      ext4    defaults,noatime  0       1&lt;br /&gt;
&lt;br /&gt;
disable swap in the chroot&lt;br /&gt;
 sudo systemctl disable dphys-swapfile.service&lt;br /&gt;
&lt;br /&gt;
exit the chroot and reboot.  remove the sdcard and confirm you're booting off the LVM.&lt;br /&gt;
&lt;br /&gt;
== Linux config == &lt;br /&gt;
&lt;br /&gt;
I set the timezone to local time and then configure the users/ssh keys.  If this will be remote it's a good idea to setup the ssh remote service for remote access. I have a page on this here [[Secure_Tunnel_Service|Secure Tunnel Service]]&lt;br /&gt;
&lt;br /&gt;
The user I use for this is 'svar' and must be added to the audio group&lt;br /&gt;
 usermod svar -a -G audio &lt;br /&gt;
 &lt;br /&gt;
 # groups svar&lt;br /&gt;
 svar : svar audio users&lt;br /&gt;
&lt;br /&gt;
== udev rules for ports == &lt;br /&gt;
I identify the ports as upper and lower, left and right on the RPI.  This should scale up to 32 devices max.  &lt;br /&gt;
&lt;br /&gt;
this will set the device properly using the name as below&lt;br /&gt;
 plughw:top-left,0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/udev/rules.d/50-alsa.rules&lt;br /&gt;
SUBSYSTEM!=&amp;quot;sound&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
ACTION!=&amp;quot;add&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
# top right port 1-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-right&amp;quot;&lt;br /&gt;
# bottom right 3-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-right&amp;quot;&lt;br /&gt;
# top left port 3-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-left&amp;quot;&lt;br /&gt;
# bottom left port 1-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-left&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LABEL=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software = &lt;br /&gt;
This uses this great software '[https://github.com/arkq/svar svar]'  https://github.com/arkq/svar&lt;br /&gt;
&lt;br /&gt;
compile and install it as /usr/loca/bin/svar &lt;br /&gt;
&lt;br /&gt;
== apt-get scripts ==&lt;br /&gt;
&lt;br /&gt;
Install the following packages &lt;br /&gt;
 apt-get install screen vim nvme-cli netcat-traditional lvm2 zfsutils-linux uml-utilities bridge-utils frr strongswan-swanctl strongswan isc-dhcp-client snmpd snmp locate xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl ifupdown-extra ifupdown ifupdown-multi rsyslog cmake libopusenc-dev libalsa-ocaml-dev libsndfile1-dev lame libmp3lame-dev samba smbclient wsdd2 git opus-tools jq&lt;br /&gt;
&lt;br /&gt;
== systemd scripts ==&lt;br /&gt;
This runs as a script under systemd which will set the mic gain and the then invoke svar on each channel per it's config file.  if it crashes, it waits 5 seconds and restarts it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt;/etc/systemd/system/svar@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Start recording from %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=svar&lt;br /&gt;
EnvironmentFile=/etc/default/svar@%i&lt;br /&gt;
ExecStartPre=/usr/bin/amixer -D hw:%i -n sset Mic capture \${CAPLEVEL}&lt;br /&gt;
ExecStart=/usr/local/bin/svar -v --device=plughw:%i,0 -l\${VOXLEVEL} --rate=\${RATE} -s \${SEC} --fadeout-lag \${FOLAG} \${DIR}/\${FNAME}&lt;br /&gt;
# Restart every &amp;gt;2 seconds to avoid StartLimitInterval failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
Restart=always&lt;br /&gt;
SyslogIdentifier=svar@%i&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Config =&lt;br /&gt;
&lt;br /&gt;
== directory config ==&lt;br /&gt;
as svar you will need to make the following directories &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/svar/rec/top-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/top-left/current &lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-left/current&lt;br /&gt;
&lt;br /&gt;
== service config file == &lt;br /&gt;
&lt;br /&gt;
for each channel being recorded a separate service is used with it's own config&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export filename=''&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/default/svar@$filename&lt;br /&gt;
#audio level for capture&lt;br /&gt;
CAPLEVEL=&amp;quot;0&amp;quot; &lt;br /&gt;
#directory to put the files in&lt;br /&gt;
DIR=&amp;quot;/home/svar/rec/$filename/current&amp;quot;&lt;br /&gt;
FNAME=&amp;quot;$filename-%Y-%m-%d-%H%M.%S&amp;quot;&lt;br /&gt;
#this sets the VOX level &lt;br /&gt;
VOXLEVEL=&amp;quot;1&amp;quot;&lt;br /&gt;
RATE=&amp;quot;8000&amp;quot;&lt;br /&gt;
#seconds is the number of seconds to break up&lt;br /&gt;
#FOLAG is the lag in milliseconds and needs to match the seconds to ensure there is no&lt;br /&gt;
# clipping of silence in the output&lt;br /&gt;
SEC=&amp;quot;10&amp;quot;&lt;br /&gt;
FOLAG=&amp;quot;10000&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Start your services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable svar@top-right.service&lt;br /&gt;
systemctl start  svar@top-right.service&lt;br /&gt;
systemctl status svar@top-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@top-left.service&lt;br /&gt;
systemctl start  svar@top-left.service&lt;br /&gt;
systemctl status svar@top-left.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-right.service&lt;br /&gt;
systemctl start  svar@bottom-right.service&lt;br /&gt;
systemctl status svar@bottom-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-left.service&lt;br /&gt;
systemctl start  svar@bottom-left.service&lt;br /&gt;
systemctl status svar@bottom-left.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you should see all the audio dongles blinking if svar is active.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# service svar@* status&lt;br /&gt;
● svar@top-left.service - Start recording from top-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6873 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 17min 46.500s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-left.service&lt;br /&gt;
             └─6873 /usr/local/bin/svar -v --device=plughw:28,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-left/current/TL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@top-left.service - Start recording from top-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@top-left.service - Start recording from top-left.&lt;br /&gt;
Feb 13 09:50:00 DonPie svar[6873]: info: Creating new output file: /home/svar/rec/top-left/current/TL-2025-02-13-0950.00.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-right.service - Start recording from bottom-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2025-02-13 12:18:21 CST; 11h ago&lt;br /&gt;
    Process: 12137 ExecStartPre=/usr/bin/amixer -D hw:${HW} -n sset Mic capture 0 (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 12138 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 7min 3.715s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-right.service&lt;br /&gt;
             └─12138 /usr/local/bin/svar -v --device=plughw:31,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-right/current/BR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Starting svar@bottom-right.service - Start recording from bottom-right...&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Playback channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capture channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Started svar@bottom-right.service - Start recording from bottom-right.&lt;br /&gt;
&lt;br /&gt;
● svar@top-right.service - Start recording from top-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6864 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 18min 6.667s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-right.service&lt;br /&gt;
             └─6864 /usr/local/bin/svar -v --device=plughw:30,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-right/current/TR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 20:45:52 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2045.52.wav&lt;br /&gt;
Feb 13 20:54:56 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2054.56.wav&lt;br /&gt;
Feb 13 22:54:15 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2254.15.wav&lt;br /&gt;
Feb 13 22:56:06 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2256.06.wav&lt;br /&gt;
Feb 13 23:03:24 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2303.24.wav&lt;br /&gt;
Feb 13 23:11:22 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2311.22.wav&lt;br /&gt;
Feb 13 23:12:33 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2312.33.wav&lt;br /&gt;
Feb 13 23:16:16 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2316.16.wav&lt;br /&gt;
Feb 13 23:18:50 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2318.50.wav&lt;br /&gt;
Feb 13 23:21:41 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2321.41.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-left.service - Start recording from bottom-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6874 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 16min 49.254s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-left.service&lt;br /&gt;
             └─6874 /usr/local/bin/svar -v --device=plughw:29,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-left/current/BL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@bottom-left.service - Start recording from bottom-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@bottom-left.service - Start recording from bottom-left.&lt;br /&gt;
Feb 13 09:49:39 DonPie svar[6874]: info: Creating new output file: /home/svar/rec/bottom-left/current/BL-2025-02-13-0949.39.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SAMBA Config =&lt;br /&gt;
This makes a file share so that you can access the recordings on the system from another computer/windoze.&lt;br /&gt;
&lt;br /&gt;
Install software&lt;br /&gt;
 apt-get install samba smbclient wsdd&lt;br /&gt;
&lt;br /&gt;
'''Windoze 11 note'''&lt;br /&gt;
If you're running windoze 11, you will need to enable this in powershell.  M$ has fucked their shit up once again for no good reason. &lt;br /&gt;
 Set-SmbClientConfiguration -RequireSecuritySignature $false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== /etc/samba/smb.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   security = user&lt;br /&gt;
   netbios name = RecPie&lt;br /&gt;
   server string = RECORDER&lt;br /&gt;
   client min protocol = SMB2 &lt;br /&gt;
   server signing = mandatory&lt;br /&gt;
   client signing = mandatory&lt;br /&gt;
   interfaces = 127.0.0.0/8 eth0&lt;br /&gt;
   bind interfaces only = yes&lt;br /&gt;
   log file = /var/log/samba/log.%m&lt;br /&gt;
   max log size = 1000&lt;br /&gt;
   logging = file&lt;br /&gt;
   panic action = /usr/share/samba/panic-action %d&lt;br /&gt;
   server role = standalone server&lt;br /&gt;
   obey pam restrictions = yes&lt;br /&gt;
   unix password sync = yes&lt;br /&gt;
   passwd program = /usr/bin/passwd %u&lt;br /&gt;
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .&lt;br /&gt;
   pam password change = yes&lt;br /&gt;
   map to guest = Bad Password&lt;br /&gt;
   usershare allow guests = yes&lt;br /&gt;
[recorded]&lt;br /&gt;
    comment = recorder files&lt;br /&gt;
    path = /home/svar/rec&lt;br /&gt;
    read only = yes&lt;br /&gt;
    public = yes&lt;br /&gt;
    available = yes&lt;br /&gt;
    browsable = yes&lt;br /&gt;
    guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Transcription via OpenAI service =&lt;br /&gt;
&lt;br /&gt;
I've made a script that will use the wisperAI service to transcribe files into plain text and json format.  It also sorts them into a year/month/day directory hierarchy, and converts the wave files to 24 kbit/s Opus format which is about 20% the size of the wave format.  This allows up to a 2:22.22 long file to be automatically transcribed.  Anything longer will fail, and there's no support to split them up, so it's suggested that the $SEC and $FOLAG be touched to break files up.  &lt;br /&gt;
&lt;br /&gt;
This is then automated via systemd scripts that monitor the directories and fire off the transcription script in the background.  The only process that takes some CPU is opus encoding, but this is run with a 15 nice value to ensure there's no dropping of audio.  &lt;br /&gt;
&lt;br /&gt;
== transcribe.sh ==&lt;br /&gt;
&lt;br /&gt;
This is the script, it takes the basedir as it's only argument.  It's designed so that the source files will not be moved until all operations complete.&lt;br /&gt;
&lt;br /&gt;
https://github.com/W9CR/radiologger&lt;br /&gt;
&lt;br /&gt;
== Systemd config == &lt;br /&gt;
&lt;br /&gt;
There are two files needed, one to monitor the path and another to run when the path changes&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.path &amp;lt;&amp;lt;'EOF' &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Monitor folder %i/current for changes and transcribe files&lt;br /&gt;
&lt;br /&gt;
[Path]&lt;br /&gt;
PathChanged=/home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.service ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.service &amp;lt;&amp;lt;'EOF'&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe recording from /home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
User=svar&lt;br /&gt;
#EnvironmentFile=/etc/default/&lt;br /&gt;
ExecStart=/bin/bash /home/svar/scripts/transcriber.sh /home/svar/rec/%i&lt;br /&gt;
SyslogIdentifier=transcribe@%i&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Service ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable transcribe@top-left.path&lt;br /&gt;
systemctl enable transcribe@top-right.path&lt;br /&gt;
systemctl enable transcribe@bottom-left.path&lt;br /&gt;
systemctl enable transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
systemctl start transcribe@top-left.path&lt;br /&gt;
systemctl start transcribe@top-right.path&lt;br /&gt;
systemctl start transcribe@bottom-left.path&lt;br /&gt;
systemctl start transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
journalctl -f -u transcribe@top-left.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= todo = &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;S&amp;gt;opus support - opusenc --speech --bitrate 24 gives almost the same audio for 20% of the file size. &amp;lt;/S&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;speech to text&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;moving files into other directories via cron&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* script to make searching text files easier&lt;br /&gt;
&lt;br /&gt;
* script to compute the number of seconds per day/week/month/year on a channel&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8392</id>
		<title>Radio Channel Logger</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8392"/>
		<updated>2025-10-23T03:47:50Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Software */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems to be a common requirement to make recordings of a radio or scanner output.  I've not found much decent Free Software that can do this, and do it reliably in a headless configuration.  What I've used is documented here, and will do 4 audio channels reliably.  This soultion is unique as it uses OpenAI's API to transcribe the audio files to easily searchable text. &lt;br /&gt;
&lt;br /&gt;
My concept is based around a RPI 5 with Cmedia USB audio dongles as pictured below.  This is compact and low power, while a full Linux environment allows you to do many other things as needed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* 4 audio channels&lt;br /&gt;
* Date/time logging down to the seconds&lt;br /&gt;
* Configuration of settings per channel&lt;br /&gt;
* Recordings are 8000 samples per second 16 bit WAV&lt;br /&gt;
* VOX activated recording with VOX level set per channel &lt;br /&gt;
* Low Overhead on as no voice coding is taking place, should run on a pi0 for at least one channel (not tested)&lt;br /&gt;
* 1tb ssd used for recording.&lt;br /&gt;
&lt;br /&gt;
=Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPI 5==&lt;br /&gt;
* Case&lt;br /&gt;
* SSD&lt;br /&gt;
* nvme disk&lt;br /&gt;
* 4 usb jumpers&lt;br /&gt;
* PSU&lt;br /&gt;
* [https://www.ebay.com/itm/131905878673 Cmedia Dongles]&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
Per channel&lt;br /&gt;
&lt;br /&gt;
* CDM radio&lt;br /&gt;
* CDM radio interface cable&lt;br /&gt;
&lt;br /&gt;
== radio setup == &lt;br /&gt;
ensure the low level expansion is set in the personality and that demphasis is selected.&lt;br /&gt;
&lt;br /&gt;
= Linux = &lt;br /&gt;
The system is standard raspbian Linux &lt;br /&gt;
&lt;br /&gt;
What is different is that we are booting off the nvme directly.&lt;br /&gt;
&lt;br /&gt;
== Disk Setup ==&lt;br /&gt;
This is not a complete howto, but rather enough to figure it out.  You may want to do it differently.&lt;br /&gt;
&lt;br /&gt;
=== GPT table ===&lt;br /&gt;
Part 1 is /boot/firmware&lt;br /&gt;
&lt;br /&gt;
Part 2 is lvm&lt;br /&gt;
Leave a little at the end free, I picked 11gb&lt;br /&gt;
&lt;br /&gt;
 Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
    1            2048         1050623   512.0 MiB   0700  Microsoft basic data&lt;br /&gt;
    2         1050624      1930430463   920.0 GiB   8E00  Linux LVM&lt;br /&gt;
=== LVM config ===&lt;br /&gt;
From here I make that part 2 a LVM phsyical volume with 'pvcreate', then make the entire thing a volume group with vgcreate&lt;br /&gt;
&lt;br /&gt;
 pvcreate /dev/nvme0n1p2&lt;br /&gt;
 vgcreate vg0 /dev/nvme0n1p2&lt;br /&gt;
 &lt;br /&gt;
 # pvs&lt;br /&gt;
   PV             VG  Fmt  Attr PSize    PFree&lt;br /&gt;
   /dev/nvme0n1p2 vg0 lvm2 a--  &amp;lt;920.00g    0&lt;br /&gt;
 &lt;br /&gt;
 # vgs&lt;br /&gt;
   VG  #PV #LV #SN Attr   VSize    VFree&lt;br /&gt;
   vg0   1   4   0 wz--n- &amp;lt;920.00g    0&lt;br /&gt;
&lt;br /&gt;
Next we need make the swap thick LV of 8gb &lt;br /&gt;
 lvcreate --name SWAP --size 8GiB vg0&lt;br /&gt;
&lt;br /&gt;
Now make a the rest into a pool for the thin volumes&lt;br /&gt;
 lvcreate --type thin-pool --extents +100%FREE --name alberca vg0&lt;br /&gt;
&lt;br /&gt;
Last make a root volume and then one for storing the recordings&lt;br /&gt;
&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name ROOT --thinpool alberca vg0&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name recordings --thinpool alberca vg0&lt;br /&gt;
 &lt;br /&gt;
 # lvs&lt;br /&gt;
   LV         VG  Attr       LSize    Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
   ROOT       vg0 Vwi-aotz--  128.00g alberca        7.18&lt;br /&gt;
   SWAP       vg0 -wi-ao----    8.00g&lt;br /&gt;
   alberca    vg0 twi-aotz-- &amp;lt;911.77g                1.14   10.75&lt;br /&gt;
   recordings vg0 Vwi-aotz--   50.00g alberca        2.37&lt;br /&gt;
=== Filesystem setup === &lt;br /&gt;
Make some file systems on the root &lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-ROOT&lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-recordings&lt;br /&gt;
 mkswap /dev/mapper/SWAP&lt;br /&gt;
&lt;br /&gt;
=== Copy the sdcard to the filesystems ===&lt;br /&gt;
&lt;br /&gt;
so you can use cp or rsync to copy the file systems into the new place, but i used dd.  dd is not ideal as you need to tune the file systems to change the UUID's.&lt;br /&gt;
&lt;br /&gt;
 dd bs=4M conv=sparse if=/dev/mmblockroot of=/dev/mapper/ROOT&lt;br /&gt;
 dd bs=4M  if=/dev/mmblockboot of=/dev/nvme0n1p1&lt;br /&gt;
&lt;br /&gt;
Change the UUID's of the file systems&lt;br /&gt;
 tune2fs -U $(uuidgen) /dev/vg0/ROOT&lt;br /&gt;
 mlabel -n -i /dev/nvme0n1p1&lt;br /&gt;
 resize2fs /dev/vg0/ROOT&lt;br /&gt;
&lt;br /&gt;
get the new UUID's &lt;br /&gt;
 lsblk -f&lt;br /&gt;
&lt;br /&gt;
mount these in /mnt and chroot to them&lt;br /&gt;
 mount /dev/vg0/ROOT /mnt&lt;br /&gt;
 mount /dev/nvme0n0p1 /mnt/boot/firmware&lt;br /&gt;
 mount -t proc /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
 chroot /mnt&lt;br /&gt;
&lt;br /&gt;
Change fstab to boot off nvme&lt;br /&gt;
 cat /etc/fstab&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 UUID=1B01-6969  /boot/firmware  vfat    defaults          0       2&lt;br /&gt;
 UUID=d185ebc1-68df-4065-afe6-5ed288b28e32  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=01b68d2f-9577-4e63-b79f-6eaea8bbd61c       swap    swap    defaults        0       0&lt;br /&gt;
 UUID=d5d62f0a-054b-4f9b-a615-4c1b02373fdc       /home/svar      ext4    defaults,noatime  0       1&lt;br /&gt;
&lt;br /&gt;
disable swap in the chroot&lt;br /&gt;
 sudo systemctl disable dphys-swapfile.service&lt;br /&gt;
&lt;br /&gt;
exit the chroot and reboot.  remove the sdcard and confirm you're booting off the LVM.&lt;br /&gt;
&lt;br /&gt;
== Linux config == &lt;br /&gt;
&lt;br /&gt;
I set the timezone to local time and then configure the users/ssh keys.  If this will be remote it's a good idea to setup the ssh remote service for remote access. I have a page on this here [[Secure_Tunnel_Service|Secure Tunnel Service]]&lt;br /&gt;
&lt;br /&gt;
The user I use for this is 'svar' and must be added to the audio group&lt;br /&gt;
 usermod svar -a -G audio &lt;br /&gt;
 &lt;br /&gt;
 # groups svar&lt;br /&gt;
 svar : svar audio users&lt;br /&gt;
&lt;br /&gt;
== udev rules for ports == &lt;br /&gt;
I identify the ports as upper and lower, left and right on the RPI.  This should scale up to 32 devices max.  &lt;br /&gt;
&lt;br /&gt;
this will set the device properly using the name as below&lt;br /&gt;
 plughw:top-left,0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/udev/rules.d/50-alsa.rules&lt;br /&gt;
SUBSYSTEM!=&amp;quot;sound&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
ACTION!=&amp;quot;add&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
# top right port 1-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-right&amp;quot;&lt;br /&gt;
# bottom right 3-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-right&amp;quot;&lt;br /&gt;
# top left port 3-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-left&amp;quot;&lt;br /&gt;
# bottom left port 1-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-left&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LABEL=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software = &lt;br /&gt;
This uses this great software '[https://github.com/arkq/svar svar]'  https://github.com/arkq/svar&lt;br /&gt;
&lt;br /&gt;
compile and install it as /usr/loca/bin/svar &lt;br /&gt;
&lt;br /&gt;
== apt-get scripts ==&lt;br /&gt;
&lt;br /&gt;
Install the following pcacages&lt;br /&gt;
 apt-get install screen vim nvme-cli netcat-traditional lvm2 zfsutils-linux uml-utilities bridge-utils frr strongswan-swanctl strongswan isc-dhcp-client snmpd snmp locate xinetd snmpd php perl curl xinetd snmp libsnmp-dev libwww-perl ifupdown-extra ifupdown ifupdown-multi rsyslog cmake libopusenc-dev libalsa-ocaml-dev libsndfile1-dev lame libmp3lame-dev samba smbclient wsdd2 git opus-tools jq&lt;br /&gt;
&lt;br /&gt;
== systemd scripts ==&lt;br /&gt;
This runs as a script under systemd which will set the mic gain and the then invoke svar on each channel per it's config file.  if it crashes, it waits 5 seconds and restarts it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt;/etc/systemd/system/svar@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Start recording from %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=svar&lt;br /&gt;
EnvironmentFile=/etc/default/svar@%i&lt;br /&gt;
ExecStartPre=/usr/bin/amixer -D hw:%i -n sset Mic capture \${CAPLEVEL}&lt;br /&gt;
ExecStart=/usr/local/bin/svar -v --device=plughw:%i,0 -l\${VOXLEVEL} --rate=\${RATE} -s \${SEC} --fadeout-lag \${FOLAG} \${DIR}/\${FNAME}&lt;br /&gt;
# Restart every &amp;gt;2 seconds to avoid StartLimitInterval failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
Restart=always&lt;br /&gt;
SyslogIdentifier=svar@%i&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Config =&lt;br /&gt;
&lt;br /&gt;
== directory config ==&lt;br /&gt;
as svar you will need to make the following directories &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/svar/rec/top-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/top-left/current &lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-left/current&lt;br /&gt;
&lt;br /&gt;
== service config file == &lt;br /&gt;
&lt;br /&gt;
for each channel being recorded a separate service is used with it's own config&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export filename=''&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/default/svar@$filename&lt;br /&gt;
#audio level for capture&lt;br /&gt;
CAPLEVEL=&amp;quot;0&amp;quot; &lt;br /&gt;
#directory to put the files in&lt;br /&gt;
DIR=&amp;quot;/home/svar/rec/$filename/current&amp;quot;&lt;br /&gt;
FNAME=&amp;quot;$filename-%Y-%m-%d-%H%M.%S&amp;quot;&lt;br /&gt;
#this sets the VOX level &lt;br /&gt;
VOXLEVEL=&amp;quot;1&amp;quot;&lt;br /&gt;
RATE=&amp;quot;8000&amp;quot;&lt;br /&gt;
#seconds is the number of seconds to break up&lt;br /&gt;
#FOLAG is the lag in milliseconds and needs to match the seconds to ensure there is no&lt;br /&gt;
# clipping of silence in the output&lt;br /&gt;
SEC=&amp;quot;10&amp;quot;&lt;br /&gt;
FOLAG=&amp;quot;10000&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Start your services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable svar@top-right.service&lt;br /&gt;
systemctl start  svar@top-right.service&lt;br /&gt;
systemctl status svar@top-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@top-left.service&lt;br /&gt;
systemctl start  svar@top-left.service&lt;br /&gt;
systemctl status svar@top-left.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-right.service&lt;br /&gt;
systemctl start  svar@bottom-right.service&lt;br /&gt;
systemctl status svar@bottom-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-left.service&lt;br /&gt;
systemctl start  svar@bottom-left.service&lt;br /&gt;
systemctl status svar@bottom-left.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you should see all the audio dongles blinking if svar is active.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# service svar@* status&lt;br /&gt;
● svar@top-left.service - Start recording from top-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6873 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 17min 46.500s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-left.service&lt;br /&gt;
             └─6873 /usr/local/bin/svar -v --device=plughw:28,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-left/current/TL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@top-left.service - Start recording from top-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@top-left.service - Start recording from top-left.&lt;br /&gt;
Feb 13 09:50:00 DonPie svar[6873]: info: Creating new output file: /home/svar/rec/top-left/current/TL-2025-02-13-0950.00.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-right.service - Start recording from bottom-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2025-02-13 12:18:21 CST; 11h ago&lt;br /&gt;
    Process: 12137 ExecStartPre=/usr/bin/amixer -D hw:${HW} -n sset Mic capture 0 (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 12138 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 7min 3.715s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-right.service&lt;br /&gt;
             └─12138 /usr/local/bin/svar -v --device=plughw:31,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-right/current/BR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Starting svar@bottom-right.service - Start recording from bottom-right...&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Playback channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capture channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Started svar@bottom-right.service - Start recording from bottom-right.&lt;br /&gt;
&lt;br /&gt;
● svar@top-right.service - Start recording from top-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6864 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 18min 6.667s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-right.service&lt;br /&gt;
             └─6864 /usr/local/bin/svar -v --device=plughw:30,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-right/current/TR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 20:45:52 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2045.52.wav&lt;br /&gt;
Feb 13 20:54:56 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2054.56.wav&lt;br /&gt;
Feb 13 22:54:15 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2254.15.wav&lt;br /&gt;
Feb 13 22:56:06 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2256.06.wav&lt;br /&gt;
Feb 13 23:03:24 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2303.24.wav&lt;br /&gt;
Feb 13 23:11:22 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2311.22.wav&lt;br /&gt;
Feb 13 23:12:33 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2312.33.wav&lt;br /&gt;
Feb 13 23:16:16 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2316.16.wav&lt;br /&gt;
Feb 13 23:18:50 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2318.50.wav&lt;br /&gt;
Feb 13 23:21:41 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2321.41.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-left.service - Start recording from bottom-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6874 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 16min 49.254s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-left.service&lt;br /&gt;
             └─6874 /usr/local/bin/svar -v --device=plughw:29,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-left/current/BL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@bottom-left.service - Start recording from bottom-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@bottom-left.service - Start recording from bottom-left.&lt;br /&gt;
Feb 13 09:49:39 DonPie svar[6874]: info: Creating new output file: /home/svar/rec/bottom-left/current/BL-2025-02-13-0949.39.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SAMBA Config =&lt;br /&gt;
This makes a file share so that you can access the recordings on the system from another computer/windoze.&lt;br /&gt;
&lt;br /&gt;
Install software&lt;br /&gt;
 apt-get install samba smbclient wsdd&lt;br /&gt;
&lt;br /&gt;
'''Windoze 11 note'''&lt;br /&gt;
If you're running windoze 11, you will need to enable this in powershell.  M$ has fucked their shit up once again for no good reason. &lt;br /&gt;
 Set-SmbClientConfiguration -RequireSecuritySignature $false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== /etc/samba/smb.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   security = user&lt;br /&gt;
   netbios name = RecPie&lt;br /&gt;
   server string = RECORDER&lt;br /&gt;
   client min protocol = SMB2 &lt;br /&gt;
   server signing = mandatory&lt;br /&gt;
   client signing = mandatory&lt;br /&gt;
   interfaces = 127.0.0.0/8 eth0&lt;br /&gt;
   bind interfaces only = yes&lt;br /&gt;
   log file = /var/log/samba/log.%m&lt;br /&gt;
   max log size = 1000&lt;br /&gt;
   logging = file&lt;br /&gt;
   panic action = /usr/share/samba/panic-action %d&lt;br /&gt;
   server role = standalone server&lt;br /&gt;
   obey pam restrictions = yes&lt;br /&gt;
   unix password sync = yes&lt;br /&gt;
   passwd program = /usr/bin/passwd %u&lt;br /&gt;
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .&lt;br /&gt;
   pam password change = yes&lt;br /&gt;
   map to guest = Bad Password&lt;br /&gt;
   usershare allow guests = yes&lt;br /&gt;
[recorded]&lt;br /&gt;
    comment = recorder files&lt;br /&gt;
    path = /home/svar/rec&lt;br /&gt;
    read only = yes&lt;br /&gt;
    public = yes&lt;br /&gt;
    available = yes&lt;br /&gt;
    browsable = yes&lt;br /&gt;
    guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Transcription via OpenAI service =&lt;br /&gt;
&lt;br /&gt;
I've made a script that will use the wisperAI service to transcribe files into plain text and json format.  It also sorts them into a year/month/day directory hierarchy, and converts the wave files to 24 kbit/s Opus format which is about 20% the size of the wave format.  This allows up to a 2:22.22 long file to be automatically transcribed.  Anything longer will fail, and there's no support to split them up, so it's suggested that the $SEC and $FOLAG be touched to break files up.  &lt;br /&gt;
&lt;br /&gt;
This is then automated via systemd scripts that monitor the directories and fire off the transcription script in the background.  The only process that takes some CPU is opus encoding, but this is run with a 15 nice value to ensure there's no dropping of audio.  &lt;br /&gt;
&lt;br /&gt;
== transcribe.sh ==&lt;br /&gt;
&lt;br /&gt;
This is the script, it takes the basedir as it's only argument.  It's designed so that the source files will not be moved until all operations complete.&lt;br /&gt;
&lt;br /&gt;
https://github.com/W9CR/radiologger&lt;br /&gt;
&lt;br /&gt;
== Systemd config == &lt;br /&gt;
&lt;br /&gt;
There are two files needed, one to monitor the path and another to run when the path changes&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.path &amp;lt;&amp;lt;'EOF' &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Monitor folder %i/current for changes and transcribe files&lt;br /&gt;
&lt;br /&gt;
[Path]&lt;br /&gt;
PathChanged=/home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.service ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.service &amp;lt;&amp;lt;'EOF'&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe recording from /home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
User=svar&lt;br /&gt;
#EnvironmentFile=/etc/default/&lt;br /&gt;
ExecStart=/bin/bash /home/svar/scripts/transcriber.sh /home/svar/rec/%i&lt;br /&gt;
SyslogIdentifier=transcribe@%i&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Service ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable transcribe@top-left.path&lt;br /&gt;
systemctl enable transcribe@top-right.path&lt;br /&gt;
systemctl enable transcribe@bottom-left.path&lt;br /&gt;
systemctl enable transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
systemctl start transcribe@top-left.path&lt;br /&gt;
systemctl start transcribe@top-right.path&lt;br /&gt;
systemctl start transcribe@bottom-left.path&lt;br /&gt;
systemctl start transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
journalctl -f -u transcribe@top-left.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= todo = &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;S&amp;gt;opus support - opusenc --speech --bitrate 24 gives almost the same audio for 20% of the file size. &amp;lt;/S&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;speech to text&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;moving files into other directories via cron&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* script to make searching text files easier&lt;br /&gt;
&lt;br /&gt;
* script to compute the number of seconds per day/week/month/year on a channel&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8391</id>
		<title>GLKVM Reverse Proxy</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8391"/>
		<updated>2025-10-06T18:35:24Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is for configuring GLKVM behind an Apache reverse proxy.  &lt;br /&gt;
&lt;br /&gt;
There are some details online about this in their [https://forum.gl-inet.com/t/kvm-behind-a-reverse-proxy/61373/7 forum here], but it's for NGINX only.  As this is based on the pikvm, there's some examples of this, but not 100% working.  My setup also uses SSH to punch an outbound to my server.&lt;br /&gt;
&lt;br /&gt;
[https://www.amazon.com/dp/B0F21SQ4S8 These are under 100 USD on amazon now.]  &lt;br /&gt;
&lt;br /&gt;
= SSH proxy =&lt;br /&gt;
&lt;br /&gt;
I wanted to use something like https://wiki.w9cr.net/index.php/Secure_Tunnel_Service on this, but they don't use systemd, and I can't modify the inittab as it's on an overlay filesystem.  &lt;br /&gt;
&lt;br /&gt;
What I did was run a program from crontab, not great, but it works. &lt;br /&gt;
&lt;br /&gt;
# '''make a ssh key using the drop bear utility.''' &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;2&amp;quot;&amp;gt; '''Make this script /root/sshtunnel.sh'''&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will ssh to host.org as kvm, so you'll need to setup an account there and ensure ssh key login works.  Also ensure 34505 and 34506 ports are not in use on the host. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
PIDFILE=&amp;quot;/tmp/sshtunnelpid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -e &amp;quot;${PIDFILE}&amp;quot; ] &amp;amp;&amp;amp; (ps -u $(whoami) -opid= |&lt;br /&gt;
                           grep &amp;quot;^\s*$(cat ${PIDFILE})$&amp;quot; &amp;amp;&amp;gt; /dev/null); then&lt;br /&gt;
  echo &amp;quot;Already running.&amp;quot;&lt;br /&gt;
  exit 99&lt;br /&gt;
fi&lt;br /&gt;
ssh -y -K 60 -NT kvm@host.org -i /root/.ssh/dropbear_id_ed25519  -R 34505:127.0.0.1:22 -R 34506:127.0.0.1:443 &amp;amp; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; '''as root add this in your crontab (crontab -e)'''&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* * * * * /root/sshtunnel.sh &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will now restart this every min and if it's running, exit.&lt;br /&gt;
&lt;br /&gt;
= Apache config =&lt;br /&gt;
&lt;br /&gt;
This is the config for your domain in apache.  Note that this needs to be a root, you can't use like domain.com/kvm as the files are hard linked to /&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost kvm.example.com:443&amp;gt;&lt;br /&gt;
        ServerName kvm.example.com&lt;br /&gt;
        ServerAdmin me@you.org&lt;br /&gt;
        RewriteEngine On&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        SSLProxyEngine On&lt;br /&gt;
        SSLProxyVerify none&lt;br /&gt;
        SSLProxyCheckPeerCN off&lt;br /&gt;
        SSLProxyCheckPeerName off&lt;br /&gt;
        SSLProxyCheckPeerExpire off&lt;br /&gt;
&lt;br /&gt;
        ProxyPass / https://127.0.0.1:34506/&lt;br /&gt;
        ProxyPassReverse / https://127.0.0.1:34506/&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-Proto&amp;quot; expr=%{REQUEST_SCHEME}&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-SSL&amp;quot; expr=%{HTTPS}&lt;br /&gt;
        RewriteCond ${HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
        RewriteCond ${HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
        RewriteRule .* wss://127.0.0.1:34506/%{REQUEST_URI} [P,L]&lt;br /&gt;
&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ws wss://127.0.0.1:34506/extras/webterm/ttyd/ws&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
        ProxyPassReverse /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Location /api/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/api/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/api/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        &amp;lt;Location /janus/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8390</id>
		<title>GLKVM Reverse Proxy</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8390"/>
		<updated>2025-10-06T18:31:59Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Apache config */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is for configuring GLKVM behind an Apache reverse proxy.  &lt;br /&gt;
&lt;br /&gt;
There are some details online about this in their [https://forum.gl-inet.com/t/kvm-behind-a-reverse-proxy/61373/7 forum here], but it's for NGINX only.  As this is based on the pikvm, there's some examples of this, but not 100% working.  My setup also uses SSH to punch an outbound to my server &lt;br /&gt;
&lt;br /&gt;
= SSH proxy =&lt;br /&gt;
&lt;br /&gt;
I wanted to use something like https://wiki.w9cr.net/index.php/Secure_Tunnel_Service on this, but they don't use systemd, and I can't modify the inittab as it's on an overlay filesystem.  &lt;br /&gt;
&lt;br /&gt;
What I did was run a program from crontab, not great, but it works. &lt;br /&gt;
&lt;br /&gt;
# '''make a ssh key using the drop bear utility.''' &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;2&amp;quot;&amp;gt; '''Make this script /root/sshtunnel.sh'''&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will ssh to host.org as kvm, so you'll need to setup an account there and ensure ssh key login works.  Also ensure 34505 and 34506 ports are not in use on the host. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
PIDFILE=&amp;quot;/tmp/sshtunnelpid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -e &amp;quot;${PIDFILE}&amp;quot; ] &amp;amp;&amp;amp; (ps -u $(whoami) -opid= |&lt;br /&gt;
                           grep &amp;quot;^\s*$(cat ${PIDFILE})$&amp;quot; &amp;amp;&amp;gt; /dev/null); then&lt;br /&gt;
  echo &amp;quot;Already running.&amp;quot;&lt;br /&gt;
  exit 99&lt;br /&gt;
fi&lt;br /&gt;
ssh -y -K 60 -NT kvm@host.org -i /root/.ssh/dropbear_id_ed25519  -R 34505:127.0.0.1:22 -R 34506:127.0.0.1:443 &amp;amp; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; '''as root add this in your crontab (crontab -e)'''&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* * * * * /root/sshtunnel.sh &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will now restart this every min and if it's running, exit.&lt;br /&gt;
&lt;br /&gt;
= Apache config =&lt;br /&gt;
&lt;br /&gt;
This is the config for your domain in apache.  Note that this needs to be a root, you can't use like domain.com/kvm as the files are hard linked to /&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost kvm.example.com:443&amp;gt;&lt;br /&gt;
        ServerName kvm.example.com&lt;br /&gt;
        ServerAdmin me@you.org&lt;br /&gt;
        RewriteEngine On&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        SSLProxyEngine On&lt;br /&gt;
        SSLProxyVerify none&lt;br /&gt;
        SSLProxyCheckPeerCN off&lt;br /&gt;
        SSLProxyCheckPeerName off&lt;br /&gt;
        SSLProxyCheckPeerExpire off&lt;br /&gt;
&lt;br /&gt;
        ProxyPass / https://127.0.0.1:34506/&lt;br /&gt;
        ProxyPassReverse / https://127.0.0.1:34506/&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-Proto&amp;quot; expr=%{REQUEST_SCHEME}&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-SSL&amp;quot; expr=%{HTTPS}&lt;br /&gt;
        RewriteCond ${HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
        RewriteCond ${HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
        RewriteRule .* wss://127.0.0.1:34506/%{REQUEST_URI} [P,L]&lt;br /&gt;
&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ws wss://127.0.0.1:34506/extras/webterm/ttyd/ws&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
        ProxyPassReverse /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Location /api/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/api/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/api/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        &amp;lt;Location /janus/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8389</id>
		<title>GLKVM Reverse Proxy</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8389"/>
		<updated>2025-10-06T18:31:41Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* SSH proxy */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is for configuring GLKVM behind an Apache reverse proxy.  &lt;br /&gt;
&lt;br /&gt;
There are some details online about this in their [https://forum.gl-inet.com/t/kvm-behind-a-reverse-proxy/61373/7 forum here], but it's for NGINX only.  As this is based on the pikvm, there's some examples of this, but not 100% working.  My setup also uses SSH to punch an outbound to my server &lt;br /&gt;
&lt;br /&gt;
= SSH proxy =&lt;br /&gt;
&lt;br /&gt;
I wanted to use something like https://wiki.w9cr.net/index.php/Secure_Tunnel_Service on this, but they don't use systemd, and I can't modify the inittab as it's on an overlay filesystem.  &lt;br /&gt;
&lt;br /&gt;
What I did was run a program from crontab, not great, but it works. &lt;br /&gt;
&lt;br /&gt;
# '''make a ssh key using the drop bear utility.''' &lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;2&amp;quot;&amp;gt; '''Make this script /root/sshtunnel.sh'''&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will ssh to host.org as kvm, so you'll need to setup an account there and ensure ssh key login works.  Also ensure 34505 and 34506 ports are not in use on the host. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
PIDFILE=&amp;quot;/tmp/sshtunnelpid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -e &amp;quot;${PIDFILE}&amp;quot; ] &amp;amp;&amp;amp; (ps -u $(whoami) -opid= |&lt;br /&gt;
                           grep &amp;quot;^\s*$(cat ${PIDFILE})$&amp;quot; &amp;amp;&amp;gt; /dev/null); then&lt;br /&gt;
  echo &amp;quot;Already running.&amp;quot;&lt;br /&gt;
  exit 99&lt;br /&gt;
fi&lt;br /&gt;
ssh -y -K 60 -NT kvm@host.org -i /root/.ssh/dropbear_id_ed25519  -R 34505:127.0.0.1:22 -R 34506:127.0.0.1:443 &amp;amp; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#&amp;lt;li value=&amp;quot;3&amp;quot;&amp;gt; '''as root add this in your crontab (crontab -e)'''&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* * * * * /root/sshtunnel.sh &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will now restart this every min and if it's running, exit.&lt;br /&gt;
&lt;br /&gt;
= Apache config =&lt;br /&gt;
&lt;br /&gt;
This is the config for your domain in apache.  Note that this needs to be a root, you can't use like domain.com/kvm as the files are hard linked to /&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost kvm.example.com:443&amp;gt;&lt;br /&gt;
        ServerName kvm.example.com&lt;br /&gt;
        ServerAdmin me@you.org&lt;br /&gt;
        RewriteEngine On&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        SSLProxyEngine On&lt;br /&gt;
        SSLProxyVerify none&lt;br /&gt;
        SSLProxyCheckPeerCN off&lt;br /&gt;
        SSLProxyCheckPeerName off&lt;br /&gt;
        SSLProxyCheckPeerExpire off&lt;br /&gt;
&lt;br /&gt;
        ProxyPass / https://127.0.0.1:34506/&lt;br /&gt;
        ProxyPassReverse / https://127.0.0.1:34506/&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-Proto&amp;quot; expr=%{REQUEST_SCHEME}&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-SSL&amp;quot; expr=%{HTTPS}&lt;br /&gt;
        RewriteCond ${HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
        RewriteCond ${HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
        RewriteRule .* wss://127.0.0.1:34506/%{REQUEST_URI} [P,L]&lt;br /&gt;
&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ws wss://127.0.0.1:34506/extras/webterm/ttyd/ws&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
        ProxyPassReverse /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Location /api/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/api/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/api/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        &amp;lt;Location /janus/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8388</id>
		<title>GLKVM Reverse Proxy</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8388"/>
		<updated>2025-10-06T18:30:22Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is for configuring GLKVM behind an Apache reverse proxy.  &lt;br /&gt;
&lt;br /&gt;
There are some details online about this in their [https://forum.gl-inet.com/t/kvm-behind-a-reverse-proxy/61373/7 forum here], but it's for NGINX only.  As this is based on the pikvm, there's some examples of this, but not 100% working.  My setup also uses SSH to punch an outbound to my server &lt;br /&gt;
&lt;br /&gt;
= SSH proxy =&lt;br /&gt;
&lt;br /&gt;
I wanted to use something like https://wiki.w9cr.net/index.php/Secure_Tunnel_Service on this, but they don't use systemd, and I can't modify the inittab as it's on an overlay filesystem.  &lt;br /&gt;
&lt;br /&gt;
What I did was run a program from crontab, not great, but it works. &lt;br /&gt;
&lt;br /&gt;
# '''make a ssh key using the drop bear utility.''' &lt;br /&gt;
&lt;br /&gt;
#2 '''Make this script /root/sshtunnel.sh'''&lt;br /&gt;
&lt;br /&gt;
This will ssh to host.org as kvm, so you'll need to setup an account there and ensure ssh key login works.  Also ensure 34505 and 34506 ports are not in use on the host. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
PIDFILE=&amp;quot;/tmp/sshtunnelpid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -e &amp;quot;${PIDFILE}&amp;quot; ] &amp;amp;&amp;amp; (ps -u $(whoami) -opid= |&lt;br /&gt;
                           grep &amp;quot;^\s*$(cat ${PIDFILE})$&amp;quot; &amp;amp;&amp;gt; /dev/null); then&lt;br /&gt;
  echo &amp;quot;Already running.&amp;quot;&lt;br /&gt;
  exit 99&lt;br /&gt;
fi&lt;br /&gt;
ssh -y -K 60 -NT kvm@host.org -i /root/.ssh/dropbear_id_ed25519  -R 34505:127.0.0.1:22 -R 34506:127.0.0.1:443 &amp;amp; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
as root add this in your crontab (crontab -e)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* * * * * /root/sshtunnel.sh &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will now restart this every min and if it's running, exit.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Apache config =&lt;br /&gt;
&lt;br /&gt;
This is the config for your domain in apache.  Note that this needs to be a root, you can't use like domain.com/kvm as the files are hard linked to /&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost kvm.example.com:443&amp;gt;&lt;br /&gt;
        ServerName kvm.example.com&lt;br /&gt;
        ServerAdmin me@you.org&lt;br /&gt;
        RewriteEngine On&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        SSLProxyEngine On&lt;br /&gt;
        SSLProxyVerify none&lt;br /&gt;
        SSLProxyCheckPeerCN off&lt;br /&gt;
        SSLProxyCheckPeerName off&lt;br /&gt;
        SSLProxyCheckPeerExpire off&lt;br /&gt;
&lt;br /&gt;
        ProxyPass / https://127.0.0.1:34506/&lt;br /&gt;
        ProxyPassReverse / https://127.0.0.1:34506/&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-Proto&amp;quot; expr=%{REQUEST_SCHEME}&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-SSL&amp;quot; expr=%{HTTPS}&lt;br /&gt;
        RewriteCond ${HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
        RewriteCond ${HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
        RewriteRule .* wss://127.0.0.1:34506/%{REQUEST_URI} [P,L]&lt;br /&gt;
&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ws wss://127.0.0.1:34506/extras/webterm/ttyd/ws&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
        ProxyPassReverse /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Location /api/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/api/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/api/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        &amp;lt;Location /janus/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8387</id>
		<title>GLKVM Reverse Proxy</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=GLKVM_Reverse_Proxy&amp;diff=8387"/>
		<updated>2025-10-06T18:29:51Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Created page with &amp;quot;This is for configuring GLKVM behind an Apache reverse proxy.    There are some details online about this in their [https://forum.gl-inet.com/t/kvm-behind-a-reverse-proxy/6137...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is for configuring GLKVM behind an Apache reverse proxy.  &lt;br /&gt;
&lt;br /&gt;
There are some details online about this in their [https://forum.gl-inet.com/t/kvm-behind-a-reverse-proxy/61373/7 forum here], but it's for NGINX only.  As this is based on the pikvm, there's some examples of this, but not 100% working.  My setup also uses SSH to punch an outbound to my server &lt;br /&gt;
&lt;br /&gt;
= SSH proxy =&lt;br /&gt;
&lt;br /&gt;
I wanted to use something like https://wiki.w9cr.net/index.php/Secure_Tunnel_Service on this, but they don't use systemd, and I can't modify the inittab as it's on an overlay filesystem.  &lt;br /&gt;
&lt;br /&gt;
What I did was run a program from crontab, not great, but it works. &lt;br /&gt;
&lt;br /&gt;
'''make a ssh key using the drop bear utility.''' &lt;br /&gt;
&lt;br /&gt;
'''Make this script /root/sshtunnel.sh'''&lt;br /&gt;
&lt;br /&gt;
This will ssh to host.org as kvm, so you'll need to setup an account there and ensure ssh key login works.  Also ensure 34505 and 34506 ports are not in use on the host. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
PIDFILE=&amp;quot;/tmp/sshtunnelpid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
if [ -e &amp;quot;${PIDFILE}&amp;quot; ] &amp;amp;&amp;amp; (ps -u $(whoami) -opid= |&lt;br /&gt;
                           grep &amp;quot;^\s*$(cat ${PIDFILE})$&amp;quot; &amp;amp;&amp;gt; /dev/null); then&lt;br /&gt;
  echo &amp;quot;Already running.&amp;quot;&lt;br /&gt;
  exit 99&lt;br /&gt;
fi&lt;br /&gt;
ssh -y -K 60 -NT kvm@host.org -i /root/.ssh/dropbear_id_ed25519  -R 34505:127.0.0.1:22 -R 34506:127.0.0.1:443 &amp;amp; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
as root add this in your crontab (crontab -e)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* * * * * /root/sshtunnel.sh &amp;gt; /dev/null&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will now restart this every min and if it's running, exit.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Apache config =&lt;br /&gt;
&lt;br /&gt;
This is the config for your domain in apache.  Note that this needs to be a root, you can't use like domain.com/kvm as the files are hard linked to /&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost kvm.example.com:443&amp;gt;&lt;br /&gt;
        ServerName kvm.example.com&lt;br /&gt;
        ServerAdmin me@you.org&lt;br /&gt;
        RewriteEngine On&lt;br /&gt;
        ProxyPreserveHost On&lt;br /&gt;
        SSLProxyEngine On&lt;br /&gt;
        SSLProxyVerify none&lt;br /&gt;
        SSLProxyCheckPeerCN off&lt;br /&gt;
        SSLProxyCheckPeerName off&lt;br /&gt;
        SSLProxyCheckPeerExpire off&lt;br /&gt;
&lt;br /&gt;
        ProxyPass / https://127.0.0.1:34506/&lt;br /&gt;
        ProxyPassReverse / https://127.0.0.1:34506/&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-Proto&amp;quot; expr=%{REQUEST_SCHEME}&lt;br /&gt;
        RequestHeader set &amp;quot;X-Forwarded-SSL&amp;quot; expr=%{HTTPS}&lt;br /&gt;
        RewriteCond ${HTTP:UPGRADE} ^WebSocket$ [NC]&lt;br /&gt;
        RewriteCond ${HTTP:CONNECTION} ^Upgrade$ [NC]&lt;br /&gt;
        RewriteRule .* wss://127.0.0.1:34506/%{REQUEST_URI} [P,L]&lt;br /&gt;
&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ws wss://127.0.0.1:34506/extras/webterm/ttyd/ws&lt;br /&gt;
        ProxyPass /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
        ProxyPassReverse /extras/webterm/ttyd/ https://127.0.0.1:34506/extras/webterm/ttyd/&lt;br /&gt;
&lt;br /&gt;
        &amp;lt;Location /api/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/api/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/api/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        &amp;lt;Location /janus/ws&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
                ProxyPass wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
                ProxyPassReverse wss://127.0.0.1:34506/janus/ws&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Cisco_GRE_Tunnel_over_IPSEC_to_Dynamic_IP_Neighbor&amp;diff=8386</id>
		<title>Cisco GRE Tunnel over IPSEC to Dynamic IP Neighbor</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Cisco_GRE_Tunnel_over_IPSEC_to_Dynamic_IP_Neighbor&amp;diff=8386"/>
		<updated>2025-10-04T17:26:13Z</updated>

		<summary type="html">&lt;p&gt;Bryan: Created page with &amp;quot;This is how to do IOS to IOS and other without using DMVPN.  This also works across ios to linux.   Basically you need a IPSEC in tunnel mode and some loopbacks.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is how to do IOS to IOS and other without using DMVPN.  This also works across ios to linux. &lt;br /&gt;
&lt;br /&gt;
Basically you need a IPSEC in tunnel mode and some loopbacks.&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8385</id>
		<title>Radio Channel Logger</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8385"/>
		<updated>2025-10-04T16:12:55Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* transcribe@.service */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems to be a common requirement to make recordings of a radio or scanner output.  I've not found much decent Free Software that can do this, and do it reliably in a headless configuration.  What I've used is documented here, and will do 4 audio channels reliably.  This soultion is unique as it uses OpenAI's API to transcribe the audio files to easily searchable text. &lt;br /&gt;
&lt;br /&gt;
My concept is based around a RPI 5 with Cmedia USB audio dongles as pictured below.  This is compact and low power, while a full Linux environment allows you to do many other things as needed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* 4 audio channels&lt;br /&gt;
* Date/time logging down to the seconds&lt;br /&gt;
* Configuration of settings per channel&lt;br /&gt;
* Recordings are 8000 samples per second 16 bit WAV&lt;br /&gt;
* VOX activated recording with VOX level set per channel &lt;br /&gt;
* Low Overhead on as no voice coding is taking place, should run on a pi0 for at least one channel (not tested)&lt;br /&gt;
* 1tb ssd used for recording.&lt;br /&gt;
&lt;br /&gt;
=Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPI 5==&lt;br /&gt;
* Case&lt;br /&gt;
* SSD&lt;br /&gt;
* nvme disk&lt;br /&gt;
* 4 usb jumpers&lt;br /&gt;
* PSU&lt;br /&gt;
* [https://www.ebay.com/itm/131905878673 Cmedia Dongles]&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
Per channel&lt;br /&gt;
&lt;br /&gt;
* CDM radio&lt;br /&gt;
* CDM radio interface cable&lt;br /&gt;
&lt;br /&gt;
== radio setup == &lt;br /&gt;
ensure the low level expansion is set in the personality and that demphasis is selected.&lt;br /&gt;
&lt;br /&gt;
= Linux = &lt;br /&gt;
The system is standard raspbian Linux &lt;br /&gt;
&lt;br /&gt;
What is different is that we are booting off the nvme directly.&lt;br /&gt;
&lt;br /&gt;
== Disk Setup ==&lt;br /&gt;
This is not a complete howto, but rather enough to figure it out.  You may want to do it differently.&lt;br /&gt;
&lt;br /&gt;
=== GPT table ===&lt;br /&gt;
Part 1 is /boot/firmware&lt;br /&gt;
&lt;br /&gt;
Part 2 is lvm&lt;br /&gt;
Leave a little at the end free, I picked 11gb&lt;br /&gt;
&lt;br /&gt;
 Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
    1            2048         1050623   512.0 MiB   0700  Microsoft basic data&lt;br /&gt;
    2         1050624      1930430463   920.0 GiB   8E00  Linux LVM&lt;br /&gt;
=== LVM config ===&lt;br /&gt;
From here I make that part 2 a LVM phsyical volume with 'pvcreate', then make the entire thing a volume group with vgcreate&lt;br /&gt;
&lt;br /&gt;
 pvcreate /dev/nvme0n1p2&lt;br /&gt;
 vgcreate vg0 /dev/nvme0n1p2&lt;br /&gt;
 &lt;br /&gt;
 # pvs&lt;br /&gt;
   PV             VG  Fmt  Attr PSize    PFree&lt;br /&gt;
   /dev/nvme0n1p2 vg0 lvm2 a--  &amp;lt;920.00g    0&lt;br /&gt;
 &lt;br /&gt;
 # vgs&lt;br /&gt;
   VG  #PV #LV #SN Attr   VSize    VFree&lt;br /&gt;
   vg0   1   4   0 wz--n- &amp;lt;920.00g    0&lt;br /&gt;
&lt;br /&gt;
Next we need make the swap thick LV of 8gb &lt;br /&gt;
 lvcreate --name SWAP --size 8GiB vg0&lt;br /&gt;
&lt;br /&gt;
Now make a the rest into a pool for the thin volumes&lt;br /&gt;
 lvcreate --type thin-pool --extents +100%FREE --name alberca vg0&lt;br /&gt;
&lt;br /&gt;
Last make a root volume and then one for storing the recordings&lt;br /&gt;
&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name ROOT --thinpool alberca vg0&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name recordings --thinpool alberca vg0&lt;br /&gt;
 &lt;br /&gt;
 # lvs&lt;br /&gt;
   LV         VG  Attr       LSize    Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
   ROOT       vg0 Vwi-aotz--  128.00g alberca        7.18&lt;br /&gt;
   SWAP       vg0 -wi-ao----    8.00g&lt;br /&gt;
   alberca    vg0 twi-aotz-- &amp;lt;911.77g                1.14   10.75&lt;br /&gt;
   recordings vg0 Vwi-aotz--   50.00g alberca        2.37&lt;br /&gt;
=== Filesystem setup === &lt;br /&gt;
Make some file systems on the root &lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-ROOT&lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-recordings&lt;br /&gt;
 mkswap /dev/mapper/SWAP&lt;br /&gt;
&lt;br /&gt;
=== Copy the sdcard to the filesystems ===&lt;br /&gt;
&lt;br /&gt;
so you can use cp or rsync to copy the file systems into the new place, but i used dd.  dd is not ideal as you need to tune the file systems to change the UUID's.&lt;br /&gt;
&lt;br /&gt;
 dd bs=4M conv=sparse if=/dev/mmblockroot of=/dev/mapper/ROOT&lt;br /&gt;
 dd bs=4M  if=/dev/mmblockboot of=/dev/nvme0n1p1&lt;br /&gt;
&lt;br /&gt;
Change the UUID's of the file systems&lt;br /&gt;
 tune2fs -U $(uuidgen) /dev/vg0/ROOT&lt;br /&gt;
 mlabel -n -i /dev/nvme0n1p1&lt;br /&gt;
 resize2fs /dev/vg0/ROOT&lt;br /&gt;
&lt;br /&gt;
get the new UUID's &lt;br /&gt;
 lsblk -f&lt;br /&gt;
&lt;br /&gt;
mount these in /mnt and chroot to them&lt;br /&gt;
 mount /dev/vg0/ROOT /mnt&lt;br /&gt;
 mount /dev/nvme0n0p1 /mnt/boot/firmware&lt;br /&gt;
 mount -t proc /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
 chroot /mnt&lt;br /&gt;
&lt;br /&gt;
Change fstab to boot off nvme&lt;br /&gt;
 cat /etc/fstab&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 UUID=1B01-6969  /boot/firmware  vfat    defaults          0       2&lt;br /&gt;
 UUID=d185ebc1-68df-4065-afe6-5ed288b28e32  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=01b68d2f-9577-4e63-b79f-6eaea8bbd61c       swap    swap    defaults        0       0&lt;br /&gt;
 UUID=d5d62f0a-054b-4f9b-a615-4c1b02373fdc       /home/svar      ext4    defaults,noatime  0       1&lt;br /&gt;
&lt;br /&gt;
disable swap in the chroot&lt;br /&gt;
 sudo systemctl disable dphys-swapfile.service&lt;br /&gt;
&lt;br /&gt;
exit the chroot and reboot.  remove the sdcard and confirm you're booting off the LVM.&lt;br /&gt;
&lt;br /&gt;
== Linux config == &lt;br /&gt;
&lt;br /&gt;
I set the timezone to local time and then configure the users/ssh keys.  If this will be remote it's a good idea to setup the ssh remote service for remote access. I have a page on this here [[Secure_Tunnel_Service|Secure Tunnel Service]]&lt;br /&gt;
&lt;br /&gt;
The user I use for this is 'svar' and must be added to the audio group&lt;br /&gt;
 usermod svar -a -G audio &lt;br /&gt;
 &lt;br /&gt;
 # groups svar&lt;br /&gt;
 svar : svar audio users&lt;br /&gt;
&lt;br /&gt;
== udev rules for ports == &lt;br /&gt;
I identify the ports as upper and lower, left and right on the RPI.  This should scale up to 32 devices max.  &lt;br /&gt;
&lt;br /&gt;
this will set the device properly using the name as below&lt;br /&gt;
 plughw:top-left,0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/udev/rules.d/50-alsa.rules&lt;br /&gt;
SUBSYSTEM!=&amp;quot;sound&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
ACTION!=&amp;quot;add&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
# top right port 1-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-right&amp;quot;&lt;br /&gt;
# bottom right 3-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-right&amp;quot;&lt;br /&gt;
# top left port 3-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-left&amp;quot;&lt;br /&gt;
# bottom left port 1-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-left&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LABEL=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software = &lt;br /&gt;
This uses this great software '[https://github.com/arkq/svar svar]'  https://github.com/arkq/svar&lt;br /&gt;
&lt;br /&gt;
compile and install it as /usr/loca/bin/svar &lt;br /&gt;
&lt;br /&gt;
== systemd scripts ==&lt;br /&gt;
This runs as a script under systemd which will set the mic gain and the then invoke svar on each channel per it's config file.  if it crashes, it waits 5 seconds and restarts it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt;/etc/systemd/system/svar@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Start recording from %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=svar&lt;br /&gt;
EnvironmentFile=/etc/default/svar@%i&lt;br /&gt;
ExecStartPre=/usr/bin/amixer -D hw:%i -n sset Mic capture \${CAPLEVEL}&lt;br /&gt;
ExecStart=/usr/local/bin/svar -v --device=plughw:%i,0 -l\${VOXLEVEL} --rate=\${RATE} -s \${SEC} --fadeout-lag \${FOLAG} \${DIR}/\${FNAME}&lt;br /&gt;
# Restart every &amp;gt;2 seconds to avoid StartLimitInterval failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
Restart=always&lt;br /&gt;
SyslogIdentifier=svar@%i&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Config =&lt;br /&gt;
&lt;br /&gt;
== directory config ==&lt;br /&gt;
as svar you will need to make the following directories &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/svar/rec/top-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/top-left/current &lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-left/current&lt;br /&gt;
&lt;br /&gt;
== service config file == &lt;br /&gt;
&lt;br /&gt;
for each channel being recorded a separate service is used with it's own config&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export filename=''&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/default/svar@$filename&lt;br /&gt;
#audio level for capture&lt;br /&gt;
CAPLEVEL=&amp;quot;0&amp;quot; &lt;br /&gt;
#directory to put the files in&lt;br /&gt;
DIR=&amp;quot;/home/svar/rec/$filename/current&amp;quot;&lt;br /&gt;
FNAME=&amp;quot;$filename-%Y-%m-%d-%H%M.%S&amp;quot;&lt;br /&gt;
#this sets the VOX level &lt;br /&gt;
VOXLEVEL=&amp;quot;1&amp;quot;&lt;br /&gt;
RATE=&amp;quot;8000&amp;quot;&lt;br /&gt;
#seconds is the number of seconds to break up&lt;br /&gt;
#FOLAG is the lag in milliseconds and needs to match the seconds to ensure there is no&lt;br /&gt;
# clipping of silence in the output&lt;br /&gt;
SEC=&amp;quot;10&amp;quot;&lt;br /&gt;
FOLAG=&amp;quot;10000&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Start your services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable svar@top-right.service&lt;br /&gt;
systemctl start  svar@top-right.service&lt;br /&gt;
systemctl status svar@top-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@top-left.service&lt;br /&gt;
systemctl start  svar@top-left.service&lt;br /&gt;
systemctl status svar@top-left.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-right.service&lt;br /&gt;
systemctl start  svar@bottom-right.service&lt;br /&gt;
systemctl status svar@bottom-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-left.service&lt;br /&gt;
systemctl start  svar@bottom-left.service&lt;br /&gt;
systemctl status svar@bottom-left.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you should see all the audio dongles blinking if svar is active.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# service svar@* status&lt;br /&gt;
● svar@top-left.service - Start recording from top-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6873 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 17min 46.500s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-left.service&lt;br /&gt;
             └─6873 /usr/local/bin/svar -v --device=plughw:28,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-left/current/TL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@top-left.service - Start recording from top-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@top-left.service - Start recording from top-left.&lt;br /&gt;
Feb 13 09:50:00 DonPie svar[6873]: info: Creating new output file: /home/svar/rec/top-left/current/TL-2025-02-13-0950.00.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-right.service - Start recording from bottom-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2025-02-13 12:18:21 CST; 11h ago&lt;br /&gt;
    Process: 12137 ExecStartPre=/usr/bin/amixer -D hw:${HW} -n sset Mic capture 0 (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 12138 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 7min 3.715s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-right.service&lt;br /&gt;
             └─12138 /usr/local/bin/svar -v --device=plughw:31,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-right/current/BR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Starting svar@bottom-right.service - Start recording from bottom-right...&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Playback channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capture channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Started svar@bottom-right.service - Start recording from bottom-right.&lt;br /&gt;
&lt;br /&gt;
● svar@top-right.service - Start recording from top-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6864 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 18min 6.667s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-right.service&lt;br /&gt;
             └─6864 /usr/local/bin/svar -v --device=plughw:30,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-right/current/TR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 20:45:52 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2045.52.wav&lt;br /&gt;
Feb 13 20:54:56 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2054.56.wav&lt;br /&gt;
Feb 13 22:54:15 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2254.15.wav&lt;br /&gt;
Feb 13 22:56:06 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2256.06.wav&lt;br /&gt;
Feb 13 23:03:24 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2303.24.wav&lt;br /&gt;
Feb 13 23:11:22 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2311.22.wav&lt;br /&gt;
Feb 13 23:12:33 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2312.33.wav&lt;br /&gt;
Feb 13 23:16:16 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2316.16.wav&lt;br /&gt;
Feb 13 23:18:50 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2318.50.wav&lt;br /&gt;
Feb 13 23:21:41 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2321.41.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-left.service - Start recording from bottom-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6874 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 16min 49.254s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-left.service&lt;br /&gt;
             └─6874 /usr/local/bin/svar -v --device=plughw:29,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-left/current/BL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@bottom-left.service - Start recording from bottom-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@bottom-left.service - Start recording from bottom-left.&lt;br /&gt;
Feb 13 09:49:39 DonPie svar[6874]: info: Creating new output file: /home/svar/rec/bottom-left/current/BL-2025-02-13-0949.39.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SAMBA Config =&lt;br /&gt;
This makes a file share so that you can access the recordings on the system from another computer/windoze.&lt;br /&gt;
&lt;br /&gt;
Install software&lt;br /&gt;
 apt-get install samba smbclient wsdd&lt;br /&gt;
&lt;br /&gt;
'''Windoze 11 note'''&lt;br /&gt;
If you're running windoze 11, you will need to enable this in powershell.  M$ has fucked their shit up once again for no good reason. &lt;br /&gt;
 Set-SmbClientConfiguration -RequireSecuritySignature $false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== /etc/samba/smb.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   security = user&lt;br /&gt;
   netbios name = RecPie&lt;br /&gt;
   server string = RECORDER&lt;br /&gt;
   client min protocol = SMB2 &lt;br /&gt;
   server signing = mandatory&lt;br /&gt;
   client signing = mandatory&lt;br /&gt;
   interfaces = 127.0.0.0/8 eth0&lt;br /&gt;
   bind interfaces only = yes&lt;br /&gt;
   log file = /var/log/samba/log.%m&lt;br /&gt;
   max log size = 1000&lt;br /&gt;
   logging = file&lt;br /&gt;
   panic action = /usr/share/samba/panic-action %d&lt;br /&gt;
   server role = standalone server&lt;br /&gt;
   obey pam restrictions = yes&lt;br /&gt;
   unix password sync = yes&lt;br /&gt;
   passwd program = /usr/bin/passwd %u&lt;br /&gt;
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .&lt;br /&gt;
   pam password change = yes&lt;br /&gt;
   map to guest = Bad Password&lt;br /&gt;
   usershare allow guests = yes&lt;br /&gt;
[recorded]&lt;br /&gt;
    comment = recorder files&lt;br /&gt;
    path = /home/svar/rec&lt;br /&gt;
    read only = yes&lt;br /&gt;
    public = yes&lt;br /&gt;
    available = yes&lt;br /&gt;
    browsable = yes&lt;br /&gt;
    guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Transcription via OpenAI service =&lt;br /&gt;
&lt;br /&gt;
I've made a script that will use the wisperAI service to transcribe files into plain text and json format.  It also sorts them into a year/month/day directory hierarchy, and converts the wave files to 24 kbit/s Opus format which is about 20% the size of the wave format.  This allows up to a 2:22.22 long file to be automatically transcribed.  Anything longer will fail, and there's no support to split them up, so it's suggested that the $SEC and $FOLAG be touched to break files up.  &lt;br /&gt;
&lt;br /&gt;
This is then automated via systemd scripts that monitor the directories and fire off the transcription script in the background.  The only process that takes some CPU is opus encoding, but this is run with a 15 nice value to ensure there's no dropping of audio.  &lt;br /&gt;
&lt;br /&gt;
== transcribe.sh ==&lt;br /&gt;
&lt;br /&gt;
This is the script, it takes the basedir as it's only argument.  It's designed so that the source files will not be moved until all operations complete.&lt;br /&gt;
&lt;br /&gt;
https://github.com/W9CR/radiologger&lt;br /&gt;
&lt;br /&gt;
== Systemd config == &lt;br /&gt;
&lt;br /&gt;
There are two files needed, one to monitor the path and another to run when the path changes&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.path &amp;lt;&amp;lt;'EOF' &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Monitor folder %i/current for changes and transcribe files&lt;br /&gt;
&lt;br /&gt;
[Path]&lt;br /&gt;
PathChanged=/home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.service ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.service &amp;lt;&amp;lt;'EOF'&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe recording from /home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
User=svar&lt;br /&gt;
#EnvironmentFile=/etc/default/&lt;br /&gt;
ExecStart=/bin/bash /home/svar/scripts/transcriber.sh /home/svar/rec/%i&lt;br /&gt;
SyslogIdentifier=transcribe@%i&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Service ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable transcribe@top-left.path&lt;br /&gt;
systemctl enable transcribe@top-right.path&lt;br /&gt;
systemctl enable transcribe@bottom-left.path&lt;br /&gt;
systemctl enable transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
systemctl start transcribe@top-left.path&lt;br /&gt;
systemctl start transcribe@top-right.path&lt;br /&gt;
systemctl start transcribe@bottom-left.path&lt;br /&gt;
systemctl start transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
journalctl -f -u transcribe@top-left.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= todo = &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;S&amp;gt;opus support - opusenc --speech --bitrate 24 gives almost the same audio for 20% of the file size. &amp;lt;/S&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;speech to text&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;moving files into other directories via cron&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* script to make searching text files easier&lt;br /&gt;
&lt;br /&gt;
* script to compute the number of seconds per day/week/month/year on a channel&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8384</id>
		<title>Radio Channel Logger</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8384"/>
		<updated>2025-10-04T16:12:28Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* systemd scripts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems to be a common requirement to make recordings of a radio or scanner output.  I've not found much decent Free Software that can do this, and do it reliably in a headless configuration.  What I've used is documented here, and will do 4 audio channels reliably.  This soultion is unique as it uses OpenAI's API to transcribe the audio files to easily searchable text. &lt;br /&gt;
&lt;br /&gt;
My concept is based around a RPI 5 with Cmedia USB audio dongles as pictured below.  This is compact and low power, while a full Linux environment allows you to do many other things as needed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* 4 audio channels&lt;br /&gt;
* Date/time logging down to the seconds&lt;br /&gt;
* Configuration of settings per channel&lt;br /&gt;
* Recordings are 8000 samples per second 16 bit WAV&lt;br /&gt;
* VOX activated recording with VOX level set per channel &lt;br /&gt;
* Low Overhead on as no voice coding is taking place, should run on a pi0 for at least one channel (not tested)&lt;br /&gt;
* 1tb ssd used for recording.&lt;br /&gt;
&lt;br /&gt;
=Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPI 5==&lt;br /&gt;
* Case&lt;br /&gt;
* SSD&lt;br /&gt;
* nvme disk&lt;br /&gt;
* 4 usb jumpers&lt;br /&gt;
* PSU&lt;br /&gt;
* [https://www.ebay.com/itm/131905878673 Cmedia Dongles]&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
Per channel&lt;br /&gt;
&lt;br /&gt;
* CDM radio&lt;br /&gt;
* CDM radio interface cable&lt;br /&gt;
&lt;br /&gt;
== radio setup == &lt;br /&gt;
ensure the low level expansion is set in the personality and that demphasis is selected.&lt;br /&gt;
&lt;br /&gt;
= Linux = &lt;br /&gt;
The system is standard raspbian Linux &lt;br /&gt;
&lt;br /&gt;
What is different is that we are booting off the nvme directly.&lt;br /&gt;
&lt;br /&gt;
== Disk Setup ==&lt;br /&gt;
This is not a complete howto, but rather enough to figure it out.  You may want to do it differently.&lt;br /&gt;
&lt;br /&gt;
=== GPT table ===&lt;br /&gt;
Part 1 is /boot/firmware&lt;br /&gt;
&lt;br /&gt;
Part 2 is lvm&lt;br /&gt;
Leave a little at the end free, I picked 11gb&lt;br /&gt;
&lt;br /&gt;
 Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
    1            2048         1050623   512.0 MiB   0700  Microsoft basic data&lt;br /&gt;
    2         1050624      1930430463   920.0 GiB   8E00  Linux LVM&lt;br /&gt;
=== LVM config ===&lt;br /&gt;
From here I make that part 2 a LVM phsyical volume with 'pvcreate', then make the entire thing a volume group with vgcreate&lt;br /&gt;
&lt;br /&gt;
 pvcreate /dev/nvme0n1p2&lt;br /&gt;
 vgcreate vg0 /dev/nvme0n1p2&lt;br /&gt;
 &lt;br /&gt;
 # pvs&lt;br /&gt;
   PV             VG  Fmt  Attr PSize    PFree&lt;br /&gt;
   /dev/nvme0n1p2 vg0 lvm2 a--  &amp;lt;920.00g    0&lt;br /&gt;
 &lt;br /&gt;
 # vgs&lt;br /&gt;
   VG  #PV #LV #SN Attr   VSize    VFree&lt;br /&gt;
   vg0   1   4   0 wz--n- &amp;lt;920.00g    0&lt;br /&gt;
&lt;br /&gt;
Next we need make the swap thick LV of 8gb &lt;br /&gt;
 lvcreate --name SWAP --size 8GiB vg0&lt;br /&gt;
&lt;br /&gt;
Now make a the rest into a pool for the thin volumes&lt;br /&gt;
 lvcreate --type thin-pool --extents +100%FREE --name alberca vg0&lt;br /&gt;
&lt;br /&gt;
Last make a root volume and then one for storing the recordings&lt;br /&gt;
&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name ROOT --thinpool alberca vg0&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name recordings --thinpool alberca vg0&lt;br /&gt;
 &lt;br /&gt;
 # lvs&lt;br /&gt;
   LV         VG  Attr       LSize    Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
   ROOT       vg0 Vwi-aotz--  128.00g alberca        7.18&lt;br /&gt;
   SWAP       vg0 -wi-ao----    8.00g&lt;br /&gt;
   alberca    vg0 twi-aotz-- &amp;lt;911.77g                1.14   10.75&lt;br /&gt;
   recordings vg0 Vwi-aotz--   50.00g alberca        2.37&lt;br /&gt;
=== Filesystem setup === &lt;br /&gt;
Make some file systems on the root &lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-ROOT&lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-recordings&lt;br /&gt;
 mkswap /dev/mapper/SWAP&lt;br /&gt;
&lt;br /&gt;
=== Copy the sdcard to the filesystems ===&lt;br /&gt;
&lt;br /&gt;
so you can use cp or rsync to copy the file systems into the new place, but i used dd.  dd is not ideal as you need to tune the file systems to change the UUID's.&lt;br /&gt;
&lt;br /&gt;
 dd bs=4M conv=sparse if=/dev/mmblockroot of=/dev/mapper/ROOT&lt;br /&gt;
 dd bs=4M  if=/dev/mmblockboot of=/dev/nvme0n1p1&lt;br /&gt;
&lt;br /&gt;
Change the UUID's of the file systems&lt;br /&gt;
 tune2fs -U $(uuidgen) /dev/vg0/ROOT&lt;br /&gt;
 mlabel -n -i /dev/nvme0n1p1&lt;br /&gt;
 resize2fs /dev/vg0/ROOT&lt;br /&gt;
&lt;br /&gt;
get the new UUID's &lt;br /&gt;
 lsblk -f&lt;br /&gt;
&lt;br /&gt;
mount these in /mnt and chroot to them&lt;br /&gt;
 mount /dev/vg0/ROOT /mnt&lt;br /&gt;
 mount /dev/nvme0n0p1 /mnt/boot/firmware&lt;br /&gt;
 mount -t proc /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
 chroot /mnt&lt;br /&gt;
&lt;br /&gt;
Change fstab to boot off nvme&lt;br /&gt;
 cat /etc/fstab&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 UUID=1B01-6969  /boot/firmware  vfat    defaults          0       2&lt;br /&gt;
 UUID=d185ebc1-68df-4065-afe6-5ed288b28e32  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=01b68d2f-9577-4e63-b79f-6eaea8bbd61c       swap    swap    defaults        0       0&lt;br /&gt;
 UUID=d5d62f0a-054b-4f9b-a615-4c1b02373fdc       /home/svar      ext4    defaults,noatime  0       1&lt;br /&gt;
&lt;br /&gt;
disable swap in the chroot&lt;br /&gt;
 sudo systemctl disable dphys-swapfile.service&lt;br /&gt;
&lt;br /&gt;
exit the chroot and reboot.  remove the sdcard and confirm you're booting off the LVM.&lt;br /&gt;
&lt;br /&gt;
== Linux config == &lt;br /&gt;
&lt;br /&gt;
I set the timezone to local time and then configure the users/ssh keys.  If this will be remote it's a good idea to setup the ssh remote service for remote access. I have a page on this here [[Secure_Tunnel_Service|Secure Tunnel Service]]&lt;br /&gt;
&lt;br /&gt;
The user I use for this is 'svar' and must be added to the audio group&lt;br /&gt;
 usermod svar -a -G audio &lt;br /&gt;
 &lt;br /&gt;
 # groups svar&lt;br /&gt;
 svar : svar audio users&lt;br /&gt;
&lt;br /&gt;
== udev rules for ports == &lt;br /&gt;
I identify the ports as upper and lower, left and right on the RPI.  This should scale up to 32 devices max.  &lt;br /&gt;
&lt;br /&gt;
this will set the device properly using the name as below&lt;br /&gt;
 plughw:top-left,0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/udev/rules.d/50-alsa.rules&lt;br /&gt;
SUBSYSTEM!=&amp;quot;sound&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
ACTION!=&amp;quot;add&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
# top right port 1-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-right&amp;quot;&lt;br /&gt;
# bottom right 3-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-right&amp;quot;&lt;br /&gt;
# top left port 3-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-left&amp;quot;&lt;br /&gt;
# bottom left port 1-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-left&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LABEL=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software = &lt;br /&gt;
This uses this great software '[https://github.com/arkq/svar svar]'  https://github.com/arkq/svar&lt;br /&gt;
&lt;br /&gt;
compile and install it as /usr/loca/bin/svar &lt;br /&gt;
&lt;br /&gt;
== systemd scripts ==&lt;br /&gt;
This runs as a script under systemd which will set the mic gain and the then invoke svar on each channel per it's config file.  if it crashes, it waits 5 seconds and restarts it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt;/etc/systemd/system/svar@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Start recording from %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=svar&lt;br /&gt;
EnvironmentFile=/etc/default/svar@%i&lt;br /&gt;
ExecStartPre=/usr/bin/amixer -D hw:%i -n sset Mic capture \${CAPLEVEL}&lt;br /&gt;
ExecStart=/usr/local/bin/svar -v --device=plughw:%i,0 -l\${VOXLEVEL} --rate=\${RATE} -s \${SEC} --fadeout-lag \${FOLAG} \${DIR}/\${FNAME}&lt;br /&gt;
# Restart every &amp;gt;2 seconds to avoid StartLimitInterval failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
Restart=always&lt;br /&gt;
SyslogIdentifier=svar@%i&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Config =&lt;br /&gt;
&lt;br /&gt;
== directory config ==&lt;br /&gt;
as svar you will need to make the following directories &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/svar/rec/top-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/top-left/current &lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-left/current&lt;br /&gt;
&lt;br /&gt;
== service config file == &lt;br /&gt;
&lt;br /&gt;
for each channel being recorded a separate service is used with it's own config&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export filename=''&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/default/svar@$filename&lt;br /&gt;
#audio level for capture&lt;br /&gt;
CAPLEVEL=&amp;quot;0&amp;quot; &lt;br /&gt;
#directory to put the files in&lt;br /&gt;
DIR=&amp;quot;/home/svar/rec/$filename/current&amp;quot;&lt;br /&gt;
FNAME=&amp;quot;$filename-%Y-%m-%d-%H%M.%S&amp;quot;&lt;br /&gt;
#this sets the VOX level &lt;br /&gt;
VOXLEVEL=&amp;quot;1&amp;quot;&lt;br /&gt;
RATE=&amp;quot;8000&amp;quot;&lt;br /&gt;
#seconds is the number of seconds to break up&lt;br /&gt;
#FOLAG is the lag in milliseconds and needs to match the seconds to ensure there is no&lt;br /&gt;
# clipping of silence in the output&lt;br /&gt;
SEC=&amp;quot;10&amp;quot;&lt;br /&gt;
FOLAG=&amp;quot;10000&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Start your services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable svar@top-right.service&lt;br /&gt;
systemctl start  svar@top-right.service&lt;br /&gt;
systemctl status svar@top-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@top-left.service&lt;br /&gt;
systemctl start  svar@top-left.service&lt;br /&gt;
systemctl status svar@top-left.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-right.service&lt;br /&gt;
systemctl start  svar@bottom-right.service&lt;br /&gt;
systemctl status svar@bottom-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-left.service&lt;br /&gt;
systemctl start  svar@bottom-left.service&lt;br /&gt;
systemctl status svar@bottom-left.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you should see all the audio dongles blinking if svar is active.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# service svar@* status&lt;br /&gt;
● svar@top-left.service - Start recording from top-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6873 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 17min 46.500s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-left.service&lt;br /&gt;
             └─6873 /usr/local/bin/svar -v --device=plughw:28,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-left/current/TL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@top-left.service - Start recording from top-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@top-left.service - Start recording from top-left.&lt;br /&gt;
Feb 13 09:50:00 DonPie svar[6873]: info: Creating new output file: /home/svar/rec/top-left/current/TL-2025-02-13-0950.00.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-right.service - Start recording from bottom-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2025-02-13 12:18:21 CST; 11h ago&lt;br /&gt;
    Process: 12137 ExecStartPre=/usr/bin/amixer -D hw:${HW} -n sset Mic capture 0 (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 12138 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 7min 3.715s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-right.service&lt;br /&gt;
             └─12138 /usr/local/bin/svar -v --device=plughw:31,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-right/current/BR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Starting svar@bottom-right.service - Start recording from bottom-right...&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Playback channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capture channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Started svar@bottom-right.service - Start recording from bottom-right.&lt;br /&gt;
&lt;br /&gt;
● svar@top-right.service - Start recording from top-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6864 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 18min 6.667s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-right.service&lt;br /&gt;
             └─6864 /usr/local/bin/svar -v --device=plughw:30,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-right/current/TR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 20:45:52 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2045.52.wav&lt;br /&gt;
Feb 13 20:54:56 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2054.56.wav&lt;br /&gt;
Feb 13 22:54:15 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2254.15.wav&lt;br /&gt;
Feb 13 22:56:06 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2256.06.wav&lt;br /&gt;
Feb 13 23:03:24 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2303.24.wav&lt;br /&gt;
Feb 13 23:11:22 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2311.22.wav&lt;br /&gt;
Feb 13 23:12:33 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2312.33.wav&lt;br /&gt;
Feb 13 23:16:16 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2316.16.wav&lt;br /&gt;
Feb 13 23:18:50 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2318.50.wav&lt;br /&gt;
Feb 13 23:21:41 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2321.41.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-left.service - Start recording from bottom-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6874 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 16min 49.254s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-left.service&lt;br /&gt;
             └─6874 /usr/local/bin/svar -v --device=plughw:29,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-left/current/BL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@bottom-left.service - Start recording from bottom-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@bottom-left.service - Start recording from bottom-left.&lt;br /&gt;
Feb 13 09:49:39 DonPie svar[6874]: info: Creating new output file: /home/svar/rec/bottom-left/current/BL-2025-02-13-0949.39.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SAMBA Config =&lt;br /&gt;
This makes a file share so that you can access the recordings on the system from another computer/windoze.&lt;br /&gt;
&lt;br /&gt;
Install software&lt;br /&gt;
 apt-get install samba smbclient wsdd&lt;br /&gt;
&lt;br /&gt;
'''Windoze 11 note'''&lt;br /&gt;
If you're running windoze 11, you will need to enable this in powershell.  M$ has fucked their shit up once again for no good reason. &lt;br /&gt;
 Set-SmbClientConfiguration -RequireSecuritySignature $false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== /etc/samba/smb.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   security = user&lt;br /&gt;
   netbios name = RecPie&lt;br /&gt;
   server string = RECORDER&lt;br /&gt;
   client min protocol = SMB2 &lt;br /&gt;
   server signing = mandatory&lt;br /&gt;
   client signing = mandatory&lt;br /&gt;
   interfaces = 127.0.0.0/8 eth0&lt;br /&gt;
   bind interfaces only = yes&lt;br /&gt;
   log file = /var/log/samba/log.%m&lt;br /&gt;
   max log size = 1000&lt;br /&gt;
   logging = file&lt;br /&gt;
   panic action = /usr/share/samba/panic-action %d&lt;br /&gt;
   server role = standalone server&lt;br /&gt;
   obey pam restrictions = yes&lt;br /&gt;
   unix password sync = yes&lt;br /&gt;
   passwd program = /usr/bin/passwd %u&lt;br /&gt;
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .&lt;br /&gt;
   pam password change = yes&lt;br /&gt;
   map to guest = Bad Password&lt;br /&gt;
   usershare allow guests = yes&lt;br /&gt;
[recorded]&lt;br /&gt;
    comment = recorder files&lt;br /&gt;
    path = /home/svar/rec&lt;br /&gt;
    read only = yes&lt;br /&gt;
    public = yes&lt;br /&gt;
    available = yes&lt;br /&gt;
    browsable = yes&lt;br /&gt;
    guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Transcription via OpenAI service =&lt;br /&gt;
&lt;br /&gt;
I've made a script that will use the wisperAI service to transcribe files into plain text and json format.  It also sorts them into a year/month/day directory hierarchy, and converts the wave files to 24 kbit/s Opus format which is about 20% the size of the wave format.  This allows up to a 2:22.22 long file to be automatically transcribed.  Anything longer will fail, and there's no support to split them up, so it's suggested that the $SEC and $FOLAG be touched to break files up.  &lt;br /&gt;
&lt;br /&gt;
This is then automated via systemd scripts that monitor the directories and fire off the transcription script in the background.  The only process that takes some CPU is opus encoding, but this is run with a 15 nice value to ensure there's no dropping of audio.  &lt;br /&gt;
&lt;br /&gt;
== transcribe.sh ==&lt;br /&gt;
&lt;br /&gt;
This is the script, it takes the basedir as it's only argument.  It's designed so that the source files will not be moved until all operations complete.&lt;br /&gt;
&lt;br /&gt;
https://github.com/W9CR/radiologger&lt;br /&gt;
&lt;br /&gt;
== Systemd config == &lt;br /&gt;
&lt;br /&gt;
There are two files needed, one to monitor the path and another to run when the path changes&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.path &amp;lt;&amp;lt;'EOF' &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Monitor folder %i/current for changes and transcribe files&lt;br /&gt;
&lt;br /&gt;
[Path]&lt;br /&gt;
PathChanged=/home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.service ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.service &amp;lt;&amp;lt;'EOF'&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe recording from /home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
User=svar&lt;br /&gt;
#EnvironmentFile=/etc/default/&lt;br /&gt;
ExecStart=/bin/bash /home/svar/scripts/transcriber.sh /home/svar/rec/%i&lt;br /&gt;
SyslogIdentifier==transcribe@%i&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Service ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable transcribe@top-left.path&lt;br /&gt;
systemctl enable transcribe@top-right.path&lt;br /&gt;
systemctl enable transcribe@bottom-left.path&lt;br /&gt;
systemctl enable transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
systemctl start transcribe@top-left.path&lt;br /&gt;
systemctl start transcribe@top-right.path&lt;br /&gt;
systemctl start transcribe@bottom-left.path&lt;br /&gt;
systemctl start transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
journalctl -f -u transcribe@top-left.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= todo = &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;S&amp;gt;opus support - opusenc --speech --bitrate 24 gives almost the same audio for 20% of the file size. &amp;lt;/S&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;speech to text&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;moving files into other directories via cron&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* script to make searching text files easier&lt;br /&gt;
&lt;br /&gt;
* script to compute the number of seconds per day/week/month/year on a channel&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8383</id>
		<title>Radio Channel Logger</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Radio_Channel_Logger&amp;diff=8383"/>
		<updated>2025-10-04T16:11:56Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* transcribe@.service */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It seems to be a common requirement to make recordings of a radio or scanner output.  I've not found much decent Free Software that can do this, and do it reliably in a headless configuration.  What I've used is documented here, and will do 4 audio channels reliably.  This soultion is unique as it uses OpenAI's API to transcribe the audio files to easily searchable text. &lt;br /&gt;
&lt;br /&gt;
My concept is based around a RPI 5 with Cmedia USB audio dongles as pictured below.  This is compact and low power, while a full Linux environment allows you to do many other things as needed. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* 4 audio channels&lt;br /&gt;
* Date/time logging down to the seconds&lt;br /&gt;
* Configuration of settings per channel&lt;br /&gt;
* Recordings are 8000 samples per second 16 bit WAV&lt;br /&gt;
* VOX activated recording with VOX level set per channel &lt;br /&gt;
* Low Overhead on as no voice coding is taking place, should run on a pi0 for at least one channel (not tested)&lt;br /&gt;
* 1tb ssd used for recording.&lt;br /&gt;
&lt;br /&gt;
=Hardware =&lt;br /&gt;
&lt;br /&gt;
== RPI 5==&lt;br /&gt;
* Case&lt;br /&gt;
* SSD&lt;br /&gt;
* nvme disk&lt;br /&gt;
* 4 usb jumpers&lt;br /&gt;
* PSU&lt;br /&gt;
* [https://www.ebay.com/itm/131905878673 Cmedia Dongles]&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
Per channel&lt;br /&gt;
&lt;br /&gt;
* CDM radio&lt;br /&gt;
* CDM radio interface cable&lt;br /&gt;
&lt;br /&gt;
== radio setup == &lt;br /&gt;
ensure the low level expansion is set in the personality and that demphasis is selected.&lt;br /&gt;
&lt;br /&gt;
= Linux = &lt;br /&gt;
The system is standard raspbian Linux &lt;br /&gt;
&lt;br /&gt;
What is different is that we are booting off the nvme directly.&lt;br /&gt;
&lt;br /&gt;
== Disk Setup ==&lt;br /&gt;
This is not a complete howto, but rather enough to figure it out.  You may want to do it differently.&lt;br /&gt;
&lt;br /&gt;
=== GPT table ===&lt;br /&gt;
Part 1 is /boot/firmware&lt;br /&gt;
&lt;br /&gt;
Part 2 is lvm&lt;br /&gt;
Leave a little at the end free, I picked 11gb&lt;br /&gt;
&lt;br /&gt;
 Number  Start (sector)    End (sector)  Size       Code  Name&lt;br /&gt;
    1            2048         1050623   512.0 MiB   0700  Microsoft basic data&lt;br /&gt;
    2         1050624      1930430463   920.0 GiB   8E00  Linux LVM&lt;br /&gt;
=== LVM config ===&lt;br /&gt;
From here I make that part 2 a LVM phsyical volume with 'pvcreate', then make the entire thing a volume group with vgcreate&lt;br /&gt;
&lt;br /&gt;
 pvcreate /dev/nvme0n1p2&lt;br /&gt;
 vgcreate vg0 /dev/nvme0n1p2&lt;br /&gt;
 &lt;br /&gt;
 # pvs&lt;br /&gt;
   PV             VG  Fmt  Attr PSize    PFree&lt;br /&gt;
   /dev/nvme0n1p2 vg0 lvm2 a--  &amp;lt;920.00g    0&lt;br /&gt;
 &lt;br /&gt;
 # vgs&lt;br /&gt;
   VG  #PV #LV #SN Attr   VSize    VFree&lt;br /&gt;
   vg0   1   4   0 wz--n- &amp;lt;920.00g    0&lt;br /&gt;
&lt;br /&gt;
Next we need make the swap thick LV of 8gb &lt;br /&gt;
 lvcreate --name SWAP --size 8GiB vg0&lt;br /&gt;
&lt;br /&gt;
Now make a the rest into a pool for the thin volumes&lt;br /&gt;
 lvcreate --type thin-pool --extents +100%FREE --name alberca vg0&lt;br /&gt;
&lt;br /&gt;
Last make a root volume and then one for storing the recordings&lt;br /&gt;
&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name ROOT --thinpool alberca vg0&lt;br /&gt;
 lvcreate --type thin --virtualsize 128GiB --name recordings --thinpool alberca vg0&lt;br /&gt;
 &lt;br /&gt;
 # lvs&lt;br /&gt;
   LV         VG  Attr       LSize    Pool    Origin Data%  Meta%  Move Log Cpy%Sync Convert&lt;br /&gt;
   ROOT       vg0 Vwi-aotz--  128.00g alberca        7.18&lt;br /&gt;
   SWAP       vg0 -wi-ao----    8.00g&lt;br /&gt;
   alberca    vg0 twi-aotz-- &amp;lt;911.77g                1.14   10.75&lt;br /&gt;
   recordings vg0 Vwi-aotz--   50.00g alberca        2.37&lt;br /&gt;
=== Filesystem setup === &lt;br /&gt;
Make some file systems on the root &lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-ROOT&lt;br /&gt;
 mkfs.ext4 /dev/mapper/vg0-recordings&lt;br /&gt;
 mkswap /dev/mapper/SWAP&lt;br /&gt;
&lt;br /&gt;
=== Copy the sdcard to the filesystems ===&lt;br /&gt;
&lt;br /&gt;
so you can use cp or rsync to copy the file systems into the new place, but i used dd.  dd is not ideal as you need to tune the file systems to change the UUID's.&lt;br /&gt;
&lt;br /&gt;
 dd bs=4M conv=sparse if=/dev/mmblockroot of=/dev/mapper/ROOT&lt;br /&gt;
 dd bs=4M  if=/dev/mmblockboot of=/dev/nvme0n1p1&lt;br /&gt;
&lt;br /&gt;
Change the UUID's of the file systems&lt;br /&gt;
 tune2fs -U $(uuidgen) /dev/vg0/ROOT&lt;br /&gt;
 mlabel -n -i /dev/nvme0n1p1&lt;br /&gt;
 resize2fs /dev/vg0/ROOT&lt;br /&gt;
&lt;br /&gt;
get the new UUID's &lt;br /&gt;
 lsblk -f&lt;br /&gt;
&lt;br /&gt;
mount these in /mnt and chroot to them&lt;br /&gt;
 mount /dev/vg0/ROOT /mnt&lt;br /&gt;
 mount /dev/nvme0n0p1 /mnt/boot/firmware&lt;br /&gt;
 mount -t proc /proc /mnt/proc/&lt;br /&gt;
 mount --rbind /sys /mnt/sys/&lt;br /&gt;
 mount --rbind /dev /mnt/dev/&lt;br /&gt;
 chroot /mnt&lt;br /&gt;
&lt;br /&gt;
Change fstab to boot off nvme&lt;br /&gt;
 cat /etc/fstab&lt;br /&gt;
 proc            /proc           proc    defaults          0       0&lt;br /&gt;
 UUID=1B01-6969  /boot/firmware  vfat    defaults          0       2&lt;br /&gt;
 UUID=d185ebc1-68df-4065-afe6-5ed288b28e32  /               ext4    defaults,noatime  0       1&lt;br /&gt;
 # a swapfile is not a swap partition, no line here&lt;br /&gt;
 #   use  dphys-swapfile swap[on|off]  for that&lt;br /&gt;
 UUID=01b68d2f-9577-4e63-b79f-6eaea8bbd61c       swap    swap    defaults        0       0&lt;br /&gt;
 UUID=d5d62f0a-054b-4f9b-a615-4c1b02373fdc       /home/svar      ext4    defaults,noatime  0       1&lt;br /&gt;
&lt;br /&gt;
disable swap in the chroot&lt;br /&gt;
 sudo systemctl disable dphys-swapfile.service&lt;br /&gt;
&lt;br /&gt;
exit the chroot and reboot.  remove the sdcard and confirm you're booting off the LVM.&lt;br /&gt;
&lt;br /&gt;
== Linux config == &lt;br /&gt;
&lt;br /&gt;
I set the timezone to local time and then configure the users/ssh keys.  If this will be remote it's a good idea to setup the ssh remote service for remote access. I have a page on this here [[Secure_Tunnel_Service|Secure Tunnel Service]]&lt;br /&gt;
&lt;br /&gt;
The user I use for this is 'svar' and must be added to the audio group&lt;br /&gt;
 usermod svar -a -G audio &lt;br /&gt;
 &lt;br /&gt;
 # groups svar&lt;br /&gt;
 svar : svar audio users&lt;br /&gt;
&lt;br /&gt;
== udev rules for ports == &lt;br /&gt;
I identify the ports as upper and lower, left and right on the RPI.  This should scale up to 32 devices max.  &lt;br /&gt;
&lt;br /&gt;
this will set the device properly using the name as below&lt;br /&gt;
 plughw:top-left,0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/udev/rules.d/50-alsa.rules&lt;br /&gt;
SUBSYSTEM!=&amp;quot;sound&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
ACTION!=&amp;quot;add&amp;quot;, GOTO=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
# top right port 1-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-right&amp;quot;&lt;br /&gt;
# bottom right 3-2:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-2:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-right&amp;quot;&lt;br /&gt;
# top left port 3-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/3-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;top-left&amp;quot;&lt;br /&gt;
# bottom left port 1-1:1.0&lt;br /&gt;
DEVPATH==&amp;quot;*/1-1:1.0/sound/card*&amp;quot;, ATTR{id}=&amp;quot;bottom-left&amp;quot;&lt;br /&gt;
&lt;br /&gt;
LABEL=&amp;quot;my_usb_audio_end&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Software = &lt;br /&gt;
This uses this great software '[https://github.com/arkq/svar svar]'  https://github.com/arkq/svar&lt;br /&gt;
&lt;br /&gt;
compile and install it as /usr/loca/bin/svar &lt;br /&gt;
&lt;br /&gt;
== systemd scripts ==&lt;br /&gt;
This runs as a script under systemd which will set the mic gain and the then invoke svar on each channel per it's config file.  if it crashes, it waits 5 seconds and restarts it. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt;/etc/systemd/system/svar@.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Start recording from %i&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
User=svar&lt;br /&gt;
EnvironmentFile=/etc/default/svar@%i&lt;br /&gt;
ExecStartPre=/usr/bin/amixer -D hw:%i -n sset Mic capture \${CAPLEVEL}&lt;br /&gt;
ExecStart=/usr/local/bin/svar -v --device=plughw:%i,0 -l\${VOXLEVEL} --rate=\${RATE} -s \${SEC} --fadeout-lag \${FOLAG} \${DIR}/\${FNAME}&lt;br /&gt;
# Restart every &amp;gt;2 seconds to avoid StartLimitInterval failure&lt;br /&gt;
RestartSec=5&lt;br /&gt;
Restart=always&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Config =&lt;br /&gt;
&lt;br /&gt;
== directory config ==&lt;br /&gt;
as svar you will need to make the following directories &lt;br /&gt;
&lt;br /&gt;
 mkdir -p /home/svar/rec/top-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/top-left/current &lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-right/current&lt;br /&gt;
 mkdir -p /home/svar/rec/bottom-left/current&lt;br /&gt;
&lt;br /&gt;
== service config file == &lt;br /&gt;
&lt;br /&gt;
for each channel being recorded a separate service is used with it's own config&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export filename=''&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF &amp;gt; /etc/default/svar@$filename&lt;br /&gt;
#audio level for capture&lt;br /&gt;
CAPLEVEL=&amp;quot;0&amp;quot; &lt;br /&gt;
#directory to put the files in&lt;br /&gt;
DIR=&amp;quot;/home/svar/rec/$filename/current&amp;quot;&lt;br /&gt;
FNAME=&amp;quot;$filename-%Y-%m-%d-%H%M.%S&amp;quot;&lt;br /&gt;
#this sets the VOX level &lt;br /&gt;
VOXLEVEL=&amp;quot;1&amp;quot;&lt;br /&gt;
RATE=&amp;quot;8000&amp;quot;&lt;br /&gt;
#seconds is the number of seconds to break up&lt;br /&gt;
#FOLAG is the lag in milliseconds and needs to match the seconds to ensure there is no&lt;br /&gt;
# clipping of silence in the output&lt;br /&gt;
SEC=&amp;quot;10&amp;quot;&lt;br /&gt;
FOLAG=&amp;quot;10000&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Start your services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable svar@top-right.service&lt;br /&gt;
systemctl start  svar@top-right.service&lt;br /&gt;
systemctl status svar@top-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@top-left.service&lt;br /&gt;
systemctl start  svar@top-left.service&lt;br /&gt;
systemctl status svar@top-left.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-right.service&lt;br /&gt;
systemctl start  svar@bottom-right.service&lt;br /&gt;
systemctl status svar@bottom-right.service&lt;br /&gt;
&lt;br /&gt;
systemctl enable svar@bottom-left.service&lt;br /&gt;
systemctl start  svar@bottom-left.service&lt;br /&gt;
systemctl status svar@bottom-left.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
you should see all the audio dongles blinking if svar is active.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# service svar@* status&lt;br /&gt;
● svar@top-left.service - Start recording from top-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6873 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 17min 46.500s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-left.service&lt;br /&gt;
             └─6873 /usr/local/bin/svar -v --device=plughw:28,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-left/current/TL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@top-left.service - Start recording from top-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6871]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@top-left.service - Start recording from top-left.&lt;br /&gt;
Feb 13 09:50:00 DonPie svar[6873]: info: Creating new output file: /home/svar/rec/top-left/current/TL-2025-02-13-0950.00.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-right.service - Start recording from bottom-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Thu 2025-02-13 12:18:21 CST; 11h ago&lt;br /&gt;
    Process: 12137 ExecStartPre=/usr/bin/amixer -D hw:${HW} -n sset Mic capture 0 (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 12138 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 7min 3.715s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-right.service&lt;br /&gt;
             └─12138 /usr/local/bin/svar -v --device=plughw:31,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-right/current/BR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Starting svar@bottom-right.service - Start recording from bottom-right...&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Playback channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Capture channels: Mono&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 13 12:18:21 DonPie amixer[12137]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 13 12:18:21 DonPie systemd[1]: Started svar@bottom-right.service - Start recording from bottom-right.&lt;br /&gt;
&lt;br /&gt;
● svar@top-right.service - Start recording from top-right&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6864 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 18min 6.667s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@top-right.service&lt;br /&gt;
             └─6864 /usr/local/bin/svar -v --device=plughw:30,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/top-right/current/TR-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 13 20:45:52 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2045.52.wav&lt;br /&gt;
Feb 13 20:54:56 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2054.56.wav&lt;br /&gt;
Feb 13 22:54:15 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2254.15.wav&lt;br /&gt;
Feb 13 22:56:06 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2256.06.wav&lt;br /&gt;
Feb 13 23:03:24 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2303.24.wav&lt;br /&gt;
Feb 13 23:11:22 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2311.22.wav&lt;br /&gt;
Feb 13 23:12:33 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2312.33.wav&lt;br /&gt;
Feb 13 23:16:16 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2316.16.wav&lt;br /&gt;
Feb 13 23:18:50 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2318.50.wav&lt;br /&gt;
Feb 13 23:21:41 DonPie svar[6864]: info: Creating new output file: /home/svar/rec/top-right/current/TR-2025-02-13-2321.41.wav&lt;br /&gt;
&lt;br /&gt;
● svar@bottom-left.service - Start recording from bottom-left&lt;br /&gt;
     Loaded: loaded (/etc/systemd/system/svar@.service; enabled; preset: enabled)&lt;br /&gt;
     Active: active (running) since Wed 2025-02-12 18:24:38 CST; 1 day 5h ago&lt;br /&gt;
   Main PID: 6874 (svar)&lt;br /&gt;
      Tasks: 3 (limit: 9574)&lt;br /&gt;
        CPU: 16min 49.254s&lt;br /&gt;
     CGroup: /system.slice/system-svar.slice/svar@bottom-left.service&lt;br /&gt;
             └─6874 /usr/local/bin/svar -v --device=plughw:29,0 -l1 --rate=8000 -s 10 --fadeout-lag 10000 /home/svar/rec/bottom-left/current/BL-%Y-%m-%d-%H%M.%S&lt;br /&gt;
&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Starting svar@bottom-left.service - Start recording from bottom-left...&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]: Simple mixer control 'Mic',0&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capabilities: pvolume pvolume-joined cvolume cvolume-joined pswitch pswitch-joined cswitch cswitch-joined&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Playback channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Capture channels: Mono&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Limits: Playback 0 - 127 Capture 0 - 16&lt;br /&gt;
Feb 12 18:24:38 DonPie amixer[6872]:   Mono: Playback 0 [0%] [0.00dB] [off] Capture 0 [0%] [0.00dB] [on]&lt;br /&gt;
Feb 12 18:24:38 DonPie systemd[1]: Started svar@bottom-left.service - Start recording from bottom-left.&lt;br /&gt;
Feb 13 09:49:39 DonPie svar[6874]: info: Creating new output file: /home/svar/rec/bottom-left/current/BL-2025-02-13-0949.39.wav&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SAMBA Config =&lt;br /&gt;
This makes a file share so that you can access the recordings on the system from another computer/windoze.&lt;br /&gt;
&lt;br /&gt;
Install software&lt;br /&gt;
 apt-get install samba smbclient wsdd&lt;br /&gt;
&lt;br /&gt;
'''Windoze 11 note'''&lt;br /&gt;
If you're running windoze 11, you will need to enable this in powershell.  M$ has fucked their shit up once again for no good reason. &lt;br /&gt;
 Set-SmbClientConfiguration -RequireSecuritySignature $false&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== /etc/samba/smb.conf ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[global]&lt;br /&gt;
   workgroup = WORKGROUP&lt;br /&gt;
   security = user&lt;br /&gt;
   netbios name = RecPie&lt;br /&gt;
   server string = RECORDER&lt;br /&gt;
   client min protocol = SMB2 &lt;br /&gt;
   server signing = mandatory&lt;br /&gt;
   client signing = mandatory&lt;br /&gt;
   interfaces = 127.0.0.0/8 eth0&lt;br /&gt;
   bind interfaces only = yes&lt;br /&gt;
   log file = /var/log/samba/log.%m&lt;br /&gt;
   max log size = 1000&lt;br /&gt;
   logging = file&lt;br /&gt;
   panic action = /usr/share/samba/panic-action %d&lt;br /&gt;
   server role = standalone server&lt;br /&gt;
   obey pam restrictions = yes&lt;br /&gt;
   unix password sync = yes&lt;br /&gt;
   passwd program = /usr/bin/passwd %u&lt;br /&gt;
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .&lt;br /&gt;
   pam password change = yes&lt;br /&gt;
   map to guest = Bad Password&lt;br /&gt;
   usershare allow guests = yes&lt;br /&gt;
[recorded]&lt;br /&gt;
    comment = recorder files&lt;br /&gt;
    path = /home/svar/rec&lt;br /&gt;
    read only = yes&lt;br /&gt;
    public = yes&lt;br /&gt;
    available = yes&lt;br /&gt;
    browsable = yes&lt;br /&gt;
    guest ok = yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Transcription via OpenAI service =&lt;br /&gt;
&lt;br /&gt;
I've made a script that will use the wisperAI service to transcribe files into plain text and json format.  It also sorts them into a year/month/day directory hierarchy, and converts the wave files to 24 kbit/s Opus format which is about 20% the size of the wave format.  This allows up to a 2:22.22 long file to be automatically transcribed.  Anything longer will fail, and there's no support to split them up, so it's suggested that the $SEC and $FOLAG be touched to break files up.  &lt;br /&gt;
&lt;br /&gt;
This is then automated via systemd scripts that monitor the directories and fire off the transcription script in the background.  The only process that takes some CPU is opus encoding, but this is run with a 15 nice value to ensure there's no dropping of audio.  &lt;br /&gt;
&lt;br /&gt;
== transcribe.sh ==&lt;br /&gt;
&lt;br /&gt;
This is the script, it takes the basedir as it's only argument.  It's designed so that the source files will not be moved until all operations complete.&lt;br /&gt;
&lt;br /&gt;
https://github.com/W9CR/radiologger&lt;br /&gt;
&lt;br /&gt;
== Systemd config == &lt;br /&gt;
&lt;br /&gt;
There are two files needed, one to monitor the path and another to run when the path changes&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.path ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.path &amp;lt;&amp;lt;'EOF' &lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Monitor folder %i/current for changes and transcribe files&lt;br /&gt;
&lt;br /&gt;
[Path]&lt;br /&gt;
PathChanged=/home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transcribe@.service ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;gt;/etc/systemd/system/transcribe@.service &amp;lt;&amp;lt;'EOF'&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Transcribe recording from /home/svar/rec/%i/current/&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
User=svar&lt;br /&gt;
#EnvironmentFile=/etc/default/&lt;br /&gt;
ExecStart=/bin/bash /home/svar/scripts/transcriber.sh /home/svar/rec/%i&lt;br /&gt;
SyslogIdentifier==transcribe@%i&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Enable Service ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable transcribe@top-left.path&lt;br /&gt;
systemctl enable transcribe@top-right.path&lt;br /&gt;
systemctl enable transcribe@bottom-left.path&lt;br /&gt;
systemctl enable transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
systemctl start transcribe@top-left.path&lt;br /&gt;
systemctl start transcribe@top-right.path&lt;br /&gt;
systemctl start transcribe@bottom-left.path&lt;br /&gt;
systemctl start transcribe@bottom-right.path&lt;br /&gt;
&lt;br /&gt;
journalctl -f -u transcribe@top-left.service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= todo = &lt;br /&gt;
&lt;br /&gt;
* &amp;lt;S&amp;gt;opus support - opusenc --speech --bitrate 24 gives almost the same audio for 20% of the file size. &amp;lt;/S&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;speech to text&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;moving files into other directories via cron&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* script to make searching text files easier&lt;br /&gt;
&lt;br /&gt;
* script to compute the number of seconds per day/week/month/year on a channel&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Goatse.cx_Mirrors&amp;diff=8382</id>
		<title>Goatse.cx Mirrors</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Goatse.cx_Mirrors&amp;diff=8382"/>
		<updated>2025-10-02T15:58:45Z</updated>

		<summary type="html">&lt;p&gt;Bryan: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of goatse.cx mirrors.  Only legit mirrors are listed.  If the mirror has cookies, pop-ups, divs, tracking shit, fuck off, it's not permitted.&lt;br /&gt;
&lt;br /&gt;
= List of Mirrors =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;http://goatse.cx&amp;lt;/s&amp;gt; - The OG, offline but not forgotten&lt;br /&gt;
* https://goatse.mx - Mexican goatse mirror&lt;br /&gt;
* https://goatse.ax - Åland goatse mirror&lt;br /&gt;
* https://goatse.ru - Russian goatse mirror&lt;br /&gt;
* https://goatse.es - Spanish goatse mirror&lt;br /&gt;
* https://goatse.fr - French goatse mirror&lt;br /&gt;
* https://goatse.info &lt;br /&gt;
* https://goatse.lol&lt;br /&gt;
&lt;br /&gt;
=Honorary Mentions =&lt;br /&gt;
&lt;br /&gt;
Not mirrors, but in the spirit of goatse&lt;br /&gt;
&lt;br /&gt;
* https://www.goatse.fi/ &lt;br /&gt;
* https://goatse.sh - bash goatse&lt;br /&gt;
&lt;br /&gt;
=Former mirrors=&lt;br /&gt;
* &amp;lt;s&amp;gt;http://goatse.xyz&amp;lt;/s&amp;gt; - now a scam site&lt;br /&gt;
* https://goatse.us/ - Down 2025-09-30&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Goatse.cx_Mirrors&amp;diff=8381</id>
		<title>Goatse.cx Mirrors</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Goatse.cx_Mirrors&amp;diff=8381"/>
		<updated>2025-10-02T15:54:15Z</updated>

		<summary type="html">&lt;p&gt;Bryan: List of Goatse mirrors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a list of goatse.cx mirrors.  Only legit mirrors are listed.  If the mirror is got cookies, pop-ups, divs, tracking shit, fuck off, it's not permitted.&lt;br /&gt;
&lt;br /&gt;
= List of Mirrors =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;http://goatse.cx&amp;lt;/s&amp;gt; - The OG, offline but not forgotten&lt;br /&gt;
* https://goatse.mx - Mexican goatse mirror&lt;br /&gt;
* https://goatse.ax - Åland goatse mirror&lt;br /&gt;
* https://goatse.ru - Russian goatse mirror&lt;br /&gt;
* https://goatse.es - Spanish goatse mirror&lt;br /&gt;
* https://goatse.fr - French goatse mirror&lt;br /&gt;
* https://goatse.info &lt;br /&gt;
* https://goatse.lol&lt;br /&gt;
&lt;br /&gt;
=Honorary Mentions =&lt;br /&gt;
&lt;br /&gt;
Not mirrors, but in the spirit of goatse&lt;br /&gt;
&lt;br /&gt;
* https://www.goatse.fi/ &lt;br /&gt;
* https://goatse.sh - bash goatse&lt;br /&gt;
&lt;br /&gt;
=Former mirrors=&lt;br /&gt;
* &amp;lt;s&amp;gt;http://goatse.xyz&amp;lt;/s&amp;gt; - now a scam site&lt;br /&gt;
* https://goatse.us/ - Down 2025-09-30&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=File:APPLE_SSD_AP8192Z_-_Apple_M2_Ultra_-_-_Poly_soft_8tb_crypt_APFS.png&amp;diff=8379</id>
		<title>File:APPLE SSD AP8192Z - Apple M2 Ultra - - Poly soft 8tb crypt APFS.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=File:APPLE_SSD_AP8192Z_-_Apple_M2_Ultra_-_-_Poly_soft_8tb_crypt_APFS.png&amp;diff=8379"/>
		<updated>2025-09-07T03:03:45Z</updated>

		<summary type="html">&lt;p&gt;Bryan: User created page with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=APPLE SSD AP8192Z - Apple M2 Ultra - - Poly soft 8tb crypt APFS}}&lt;br /&gt;
|date=2025-09-01&lt;br /&gt;
|source={{own}}&lt;br /&gt;
|author=[[User:Bryan|Bryan]]&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{self|cc-by-sa-4.0}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Polysoft]]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=File:APPLE_SSD_AP8192Z_-_Apple_M2_Ultra_-_Poly_soft_8tb_no-crypt_APFS.png&amp;diff=8380</id>
		<title>File:APPLE SSD AP8192Z - Apple M2 Ultra - Poly soft 8tb no-crypt APFS.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=File:APPLE_SSD_AP8192Z_-_Apple_M2_Ultra_-_Poly_soft_8tb_no-crypt_APFS.png&amp;diff=8380"/>
		<updated>2025-09-07T03:03:45Z</updated>

		<summary type="html">&lt;p&gt;Bryan: User created page with UploadWizard&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=={{int:filedesc}}==&lt;br /&gt;
{{Information&lt;br /&gt;
|description={{en|1=APPLE SSD AP8192Z - Apple M2 Ultra - Poly soft 8tb no-crypt APFS}}&lt;br /&gt;
|date=2025-09-01&lt;br /&gt;
|source={{own}}&lt;br /&gt;
|author=[[User:Bryan|Bryan]]&lt;br /&gt;
|permission=&lt;br /&gt;
|other versions=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=={{int:license-header}}==&lt;br /&gt;
{{self|cc-by-sa-4.0}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Polysoft]]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.w9cr.net/index.php?title=Main_Page&amp;diff=8378</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.w9cr.net/index.php?title=Main_Page&amp;diff=8378"/>
		<updated>2025-08-01T14:00:51Z</updated>

		<summary type="html">&lt;p&gt;Bryan: /* Computers/Networking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''W9CR info site'''&lt;br /&gt;
&lt;br /&gt;
This is a small collection of stuff about hacking various radios.  Right now it's mostly about the [[Quantar]] series of radios.&lt;br /&gt;
&lt;br /&gt;
I expect to have some info on the [[AstroTac]] receiver and [[ASTRO-TAC|Comparators]] as well.  &lt;br /&gt;
&lt;br /&gt;
I've added some details on the [[PDR 3500|PDR3500 Transportable Repeater]] too.  &lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
*[[Special:Categories|Categories]] - A listing of all categories on this wiki&lt;br /&gt;
----&lt;br /&gt;
= Radios/Electronics =&lt;br /&gt;
&lt;br /&gt;
*Information on the [[MTR Repeater|MTR2000 repeater]] I've messed with a while back.  These are a &amp;quot;Quantar-lite&amp;quot;, and kinda suck.  I've recently added how to update them to the latest firmware. &lt;br /&gt;
*There is some information on the [[Uniden MRS904]] repeater converting it for amateur use.&lt;br /&gt;
*Motorola [[Waris|Waris]] modifications and tech info.  This covers the entire Waris line, HT/CDM/Pro/GP/GM/MTM700/EX/PR/CP &lt;br /&gt;
*[[Motorola R2001D|Motorola R2001A/B/C/D communication service monitor information and manuals]]&lt;br /&gt;
*[[Hamtronics 220 repeater]] notes&lt;br /&gt;
*[[Telewave]] antenna patterns for radio mobile.&lt;br /&gt;
*[[XTS 2500]] notes on programing for the 900 MHz Ham band.&lt;br /&gt;
*[[XTL Radio]] info on the XTL 2500/5000 mobile radios &lt;br /&gt;
*[[EF_Johnson]] some notes and programing info on the EF Johnson 5100 and 5300 radios&lt;br /&gt;
*[[Yaesu FT-51]] Info on modification and service manual&lt;br /&gt;
*[[Kenwood Manuals|Kenwood Service Manuals]] - Kenwood service manuals I've scanned&lt;br /&gt;
*[[:Category:Kenwood Manuals| Kenwood Manual Category]]&lt;br /&gt;
*[[:Category:Yaesu|Yaesu Category]]&lt;br /&gt;
*[[Harris Falcon]]&lt;br /&gt;
*[[DMR IDs]] - Thoughts on the ham DMR ID fiasco. &lt;br /&gt;
*[[Trasnmitter Combiners]] - notes on transmitter combiners I've worked with and general theory.&lt;br /&gt;
*[[2020 Ram 1500 Radio Install|2020 Ram 1500 Eco Diesel Radio Install]] - Work in progress about how I installed radios in my truck.&lt;br /&gt;
*[[BreezeACCESS|BreezeACCESS FHSS radios]] - work in progress about how to repurpose the BreezeCOM/Alvarion BreezeACCESS II/900/V radios and convert the SU to AU.  This was the top of the line wireless ISP gear circa 1998-2004.&lt;br /&gt;
*[[:Category:Astro_Saber/Spectra|Astro Saber/XTS/Spectra category and notes]]&lt;br /&gt;
*[[:Category:SABER|Motorola Saber Radio category]]&lt;br /&gt;
*[[Transmitter Fingerprinting]] Info on various Transmitter Fingerprinting Implementations.&lt;br /&gt;
*[[QST Metaverse &amp;amp; Furries Cover|QST November 2023 Furry Fandom Cover idiocy]]&lt;br /&gt;
*[[Logbook of The World (LOTW) Cyberattack|ARRL Logbook of The World (LOTW) Cyberattack notes]]&lt;br /&gt;
&lt;br /&gt;
= Computers/Networking =&lt;br /&gt;
*[[Cisco 3945|Cisco 3945 Notes on changing fans to be quieter]]&lt;br /&gt;
*[[HamWAN Remote Site|HamWAN remote]], a way to link into HamWAN Tampa via VPN using cheap routers.&lt;br /&gt;
*[[:Category:Inmarsat|Inmarsat Docs]] Found online&lt;br /&gt;
&lt;br /&gt;
*[[Radio Channel Logger|Radio Channel Logger]], a low cost multi-channel logging recorder, with transcription.  Suitable for radio or telephony applications.&lt;br /&gt;
&lt;br /&gt;
= Allstar =&lt;br /&gt;
*[[Dahdi dummy|dahdi_dummy for AllStarLink 1.01 and HamVoIP theft of code.]]&lt;br /&gt;
*[[AllStarLink, Inc.|Information about the take over of AllStarLink, Inc.]]&lt;br /&gt;
== Todd Lesser ==&lt;br /&gt;
*[[Todd Lesser|Todd Lesser of San Diego, CA and his company North County Communication, Inc.]] is known to engage in fraudulent telecom billing via his sex chat lines.  Has several judgements against him and and his companies in [[Todd_Lesser#San_Diego_County|California]] and [[Todd_Lesser#West_Virginia|West Virginia]].  His company has also lost a case in [[Todd_Lesser#New_York|New York]] and was denied a petition for review by the [[Todd_Lesser#United_States_Supreme_Court|US Supreme Court]].&lt;br /&gt;
&lt;br /&gt;
= Documents and Standards =&lt;br /&gt;
*[[R56 - Standards and Guidelines for Communication Sites]]&lt;br /&gt;
&lt;br /&gt;
= Miscellaneous =&lt;br /&gt;
*[[TEOTWAWKI]] - This might be useful for regular and irregular forces.&lt;br /&gt;
&lt;br /&gt;
* [[Ken Bryant|Ken Bryant, K1DMR of North Georgia Communications doesn't want you to see this]]&lt;br /&gt;
&lt;br /&gt;
= Useful Links = &lt;br /&gt;
&lt;br /&gt;
[https://www.penpapernomographic.com/ High Quality PDF Smith Charts]&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
----&lt;br /&gt;
*Total pages on this wiki: {{NUMBEROFPAGES}}&lt;br /&gt;
*Total articles on this wiki: {{NUMBEROFARTICLES}}&lt;br /&gt;
*Total files on this wiki: {{NUMBEROFFILES}}&lt;br /&gt;
*Total edits of this wiki: {{NUMBEROFEDITS}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://wiki.w9cr.net/sitemap.xml sitemap]&lt;/div&gt;</summary>
		<author><name>Bryan</name></author>
		
	</entry>
</feed>