<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://nurdspace.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Flok</id>
	<title>NURDspace - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://nurdspace.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Flok"/>
	<link rel="alternate" type="text/html" href="https://nurdspace.nl/Special:Contributions/Flok"/>
	<updated>2026-05-02T13:07:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13084</id>
		<title>Meshtastic</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13084"/>
		<updated>2023-01-22T10:48:35Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &amp;lt;nowiki&amp;gt;meshtastic --seturl &#039;https://meshtastic.org/e/#Ci0SIEfowNqBHrltz7bk6VcMvfDmtR87KcwwusNcNYchIRw4GglOdXJkU3BhY2USCggBOANAA0gBUBs&#039;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
meshtastic --set mqtt.address &#039;10.208.30.67&#039; --set mqtt.enabled true --set mqtt.json_enabled true --set mqtt.username &#039;&#039; --set mqtt.password &#039;&#039;&lt;br /&gt;
meshtastic --ch-set downlink_enabled true --ch-index 0&lt;br /&gt;
meshtastic --ch-set uplink_enabled true --ch-index 0&lt;br /&gt;
&lt;br /&gt;
or:&lt;br /&gt;
&lt;br /&gt;
meshtastic --set bluetooth.enabled 1&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13083</id>
		<title>Meshtastic</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13083"/>
		<updated>2023-01-22T10:32:11Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &amp;lt;nowiki&amp;gt;meshtastic --seturl &#039;https://meshtastic.org/e/#Ci0SIEfowNqBHrltz7bk6VcMvfDmtR87KcwwusNcNYchIRw4GglOdXJkU3BhY2USCggBOANAA0gBUBs&#039;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
meshtastic --set mqtt.address &#039;10.208.30.67&#039; --set mqtt.enabled true --set mqtt.json_enabled true --set mqtt.username &#039;&#039; --set mqtt.password &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
or:&lt;br /&gt;
&lt;br /&gt;
meshtastic --set bluetooth.enabled 1&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13082</id>
		<title>Meshtastic</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13082"/>
		<updated>2023-01-22T10:31:54Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &amp;lt;nowiki&amp;gt;meshtastic --seturl &#039;https://meshtastic.org/e/#Ci0SIEfowNqBHrltz7bk6VcMvfDmtR87KcwwusNcNYchIRw4GglOdXJkU3BhY2USCggBOANAA0gBUBs&#039;&lt;br /&gt;
&lt;br /&gt;
meshtastic --set mqtt.address &#039;10.208.30.67&#039; --set mqtt.enabled true --set mqtt.json_enabled true --set mqtt.username &#039;&#039; --set mqtt.password &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
meshtastic --set bluetooth.enabled 1&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13081</id>
		<title>Meshtastic</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13081"/>
		<updated>2023-01-22T10:25:22Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &amp;lt;nowiki&amp;gt;meshtastic --seturl &#039;https://meshtastic.org/e/#Ci0SIEfowNqBHrltz7bk6VcMvfDmtR87KcwwusNcNYchIRw4GglOdXJkU3BhY2USCggBOANAA0gBUBs&#039;&lt;br /&gt;
&lt;br /&gt;
meshtastic --set mqtt.address &#039;10.208.30.67&#039; --set mqtt.enabled true --set mqtt.json_enabled true&lt;br /&gt;
&lt;br /&gt;
meshtastic --set bluetooth.enabled 1&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13080</id>
		<title>Meshtastic</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13080"/>
		<updated>2023-01-21T23:27:54Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &amp;lt;nowiki&amp;gt;meshtastic --seturl &#039;https://meshtastic.org/e/#Ci0SIEfowNqBHrltz7bk6VcMvfDmtR87KcwwusNcNYchIRw4GglOdXJkU3BhY2USCggBOANAA0gBUBs&#039;&lt;br /&gt;
&lt;br /&gt;
meshtastic --set mqtt.address &#039;10.208.30.67&#039;&lt;br /&gt;
&lt;br /&gt;
meshtastic --set mqtt.enabled true --set mqtt.json_enabled true&lt;br /&gt;
&lt;br /&gt;
meshtastic --set bluetooth.enabled 1&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13079</id>
		<title>Meshtastic</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Meshtastic&amp;diff=13079"/>
		<updated>2023-01-21T22:02:57Z</updated>

		<summary type="html">&lt;p&gt;Flok: Created page with &amp;quot; &amp;lt;nowiki&amp;gt;meshtastic --seturl &amp;#039;https://meshtastic.org/e/#Ci0SIEfowNqBHrltz7bk6VcMvfDmtR87KcwwusNcNYchIRw4GglOdXJkU3BhY2USCggBOANAA0gBUBs&amp;#039;  meshtastic --set mqtt.address &amp;#039;10.208...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; &amp;lt;nowiki&amp;gt;meshtastic --seturl &#039;https://meshtastic.org/e/#Ci0SIEfowNqBHrltz7bk6VcMvfDmtR87KcwwusNcNYchIRw4GglOdXJkU3BhY2USCggBOANAA0gBUBs&#039;&lt;br /&gt;
&lt;br /&gt;
meshtastic --set mqtt.address &#039;10.208.30.67&#039;&lt;br /&gt;
&lt;br /&gt;
meshtastic --set mqtt.enabled true --set mqtt.json_enabled true&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Asterisk&amp;diff=13032</id>
		<title>Asterisk</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Asterisk&amp;diff=13032"/>
		<updated>2022-12-29T13:04:20Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* extensions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Asterisk&lt;br /&gt;
|Status=Active&lt;br /&gt;
|Picture=Foon_rookhok.jpg&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Space&lt;br /&gt;
|Participants=Flok&lt;br /&gt;
}}&lt;br /&gt;
=== general ===&lt;br /&gt;
&lt;br /&gt;
* ip address: 10.208.11.13&lt;br /&gt;
&lt;br /&gt;
* Erratic container: 109&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Voip subscription ===&lt;br /&gt;
We have a VoIP subscription from budgetphone.nl. The number is: &#039;&#039;&#039;0317-794512.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The account from budgetphone.nl can be accessed with username &#039;penningmeester@nurdspace.nl&#039; and the usual password.&lt;br /&gt;
&lt;br /&gt;
=== extensions ===&lt;br /&gt;
&lt;br /&gt;
* 9: main menu&lt;br /&gt;
** 1 bar&lt;br /&gt;
** 2 buzz&lt;br /&gt;
** 3 rookhok&lt;br /&gt;
** 4 zaal1&lt;br /&gt;
** 5 studio&lt;br /&gt;
** 6 gamers&lt;br /&gt;
** 8 flok mobile&lt;br /&gt;
** not making a choice will ring -all- extensions&lt;br /&gt;
&lt;br /&gt;
* 2222: Music&lt;br /&gt;
* 2223: Music skip&lt;br /&gt;
* 3010: Tahtkev (Softphone)&lt;br /&gt;
* 3011: Tahtkev (Deskphone)&lt;br /&gt;
* 4001: bar&lt;br /&gt;
* 4222: rookhok&lt;br /&gt;
* 4333: studio&lt;br /&gt;
* 4455: zaal1&lt;br /&gt;
* 4666: zaal3 (gamershok)&lt;br /&gt;
* 4667: zaal2&lt;br /&gt;
* 9999: party line (conference call)&lt;br /&gt;
* 4200: buZz&lt;br /&gt;
* 1990: boots&lt;br /&gt;
* 4500: zarya&lt;br /&gt;
* 4501: zarya lte cell (add local lte nr behind 4501)&lt;br /&gt;
** 1210&lt;br /&gt;
** 1211&lt;br /&gt;
** 1212&lt;br /&gt;
** 1216&lt;br /&gt;
* 4300: niz&lt;br /&gt;
&lt;br /&gt;
* 6669: ????&lt;br /&gt;
* 1234: ????&lt;br /&gt;
* 2001: flunk&lt;br /&gt;
* 4999: &#039;tester&#039;&lt;br /&gt;
* 4700: r3boot (deskphone)&lt;br /&gt;
* 4701: r3boot (softphone)&lt;br /&gt;
* 6002: ????&lt;br /&gt;
* 9200: ????&lt;br /&gt;
* 1515 Melan&lt;br /&gt;
* 1111: flok&lt;br /&gt;
* 1107: flok mobiel&lt;br /&gt;
* 1109: flok&#039;s vaste lijn-via-omweg&lt;br /&gt;
&lt;br /&gt;
===configuring===&lt;br /&gt;
&lt;br /&gt;
* /etc/asterisk&lt;br /&gt;
** sip.conf&lt;br /&gt;
** iax.conf&lt;br /&gt;
** users.conf&lt;br /&gt;
** extensions.conf (please keep ordering of extentions)&lt;br /&gt;
&lt;br /&gt;
=== telefoons ===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!MAC Address&lt;br /&gt;
!Extension&lt;br /&gt;
!Name&lt;br /&gt;
|Type&lt;br /&gt;
|-&lt;br /&gt;
|00:04:f2:6f:b1:fd&lt;br /&gt;
|4001&lt;br /&gt;
|Bar&lt;br /&gt;
|VVX410&lt;br /&gt;
|-&lt;br /&gt;
|00:04:f2:6f:be:7d&lt;br /&gt;
|4666&lt;br /&gt;
|Zaal3&lt;br /&gt;
|VVX410&lt;br /&gt;
|-&lt;br /&gt;
|00:04:f2:6f:c2:18&lt;br /&gt;
|4222&lt;br /&gt;
|Rookhok&lt;br /&gt;
|VVX410&lt;br /&gt;
|-&lt;br /&gt;
|00:04:f2:6f:c8:d5&lt;br /&gt;
|4667&lt;br /&gt;
|Zaal2&lt;br /&gt;
|VVX410&lt;br /&gt;
|-&lt;br /&gt;
|00:04:f2:81;9d:df&lt;br /&gt;
|4455&lt;br /&gt;
|Zaal1&lt;br /&gt;
|VVX500&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In extensions.conf you configure what happens when someone calls in or out. This is also the place where the &#039;&#039;&#039;/usr/local/bin/push-it.sh&#039;&#039;&#039; script is invoked when someone dials-in.&lt;br /&gt;
&lt;br /&gt;
=== provisioning ===&lt;br /&gt;
All polycom phones are managed via DHCP and a http-based configuration provider. See [[Asterisk/Polycom_VVX_Series#Setting_up_provisioning|the provisioning page]] for details.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
!Filename&lt;br /&gt;
|Description&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;macaddress&amp;gt;.cfg&lt;br /&gt;
|Global configuration of phone (needed to let provisioning work)&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;macaddress&amp;gt;-web.cfg&lt;br /&gt;
|All specific configuration wrt SIP and customization is set in this file&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;macaddress&amp;gt;-phone.cfg&lt;br /&gt;
|All device related settings are set in this file.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== phone management ===&lt;br /&gt;
The polycoms have a rest api available. Via this rest api, several automations have been written. To see documentation of this rest api, click [https://support.polycom.com/content/dam/polycom-support/products/voice/polycom-uc/other-documents/en/2018/ucsoftware-restapi.pdf here]. To use these automations, run the /usr/local/bin/phones.sh script on the asterisk server. Run the script without any options to see what is possible:&lt;br /&gt;
&lt;br /&gt;
 Usage: phones.sh &amp;lt;list|deviceinfo|restart|reboot|configreset|factoryreset|lineinfo&amp;gt; [&amp;lt;filter&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
The script will discover managed phones via parsing of the /var/log/phones.log file to which all phones write their syslog output. By default, the tool will work on all phones which are on. To restrict the script to a specific phone, you can specify the macaddr, ipaddr or line name as a filter. Below you can find a couple of examples how to use this tool:&lt;br /&gt;
&lt;br /&gt;
List all discovered phones (note, this does not imply that the phones are on):&lt;br /&gt;
 root@asterisk:~# phones.sh list&lt;br /&gt;
 0004f26fb1fd 10.208.42.236 Bar online&lt;br /&gt;
 0004f26fbe7d 10.208.42.252 Zaal3 online&lt;br /&gt;
 0004f26fc218 10.208.42.201 Rookhok online&lt;br /&gt;
 0004f26fc8d5 10.208.43.179 Zaal2 online&lt;br /&gt;
 0004f2819ddf 10.208.43.119 Zaal1 offline&lt;br /&gt;
&lt;br /&gt;
Show information about a specific device. This also shows how to apply a label (as found in the list output) as a filter:&lt;br /&gt;
 root@asterisk:~# phones.sh deviceinfo Rookhok&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;data&amp;quot;: {&lt;br /&gt;
     &amp;quot;UpTime&amp;quot;: {&lt;br /&gt;
       &amp;quot;Minutes&amp;quot;: &amp;quot;57&amp;quot;,&lt;br /&gt;
       &amp;quot;Seconds&amp;quot;: &amp;quot;6&amp;quot;,&lt;br /&gt;
       &amp;quot;Hours&amp;quot;: &amp;quot;23&amp;quot;,&lt;br /&gt;
       &amp;quot;Days&amp;quot;: &amp;quot;0&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;DeviceType&amp;quot;: &amp;quot;HardwareEndpoint&amp;quot;,&lt;br /&gt;
     &amp;quot;IPStack&amp;quot;: &amp;quot;IPv4 Only&amp;quot;,&lt;br /&gt;
     &amp;quot;IntendToShutdown&amp;quot;: &amp;quot;False&amp;quot;,&lt;br /&gt;
     &amp;quot;IPAddress&amp;quot;: &amp;quot;10.208.42.201&amp;quot;,&lt;br /&gt;
     &amp;quot;AttachedHardware&amp;quot;: {&lt;br /&gt;
       &amp;quot;EM&amp;quot;: []&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;DeviceVendor&amp;quot;: &amp;quot;Polycom&amp;quot;,&lt;br /&gt;
     &amp;quot;CanApplyShutdownRequest&amp;quot;: &amp;quot;True&amp;quot;,&lt;br /&gt;
     &amp;quot;Firmware&amp;quot;: {&lt;br /&gt;
       &amp;quot;BootBlock&amp;quot;: &amp;quot;3.0.4.0146 (46162-001)&amp;quot;,&lt;br /&gt;
       &amp;quot;Application&amp;quot;: &amp;quot;5.9.6.2996 30-Jan-21 15:28&amp;quot;,&lt;br /&gt;
       &amp;quot;Updater&amp;quot;: &amp;quot;5.9.7.42880&amp;quot;&lt;br /&gt;
     },&lt;br /&gt;
     &amp;quot;PreferredNetwork&amp;quot;: &amp;quot;IPv6&amp;quot;,&lt;br /&gt;
     &amp;quot;ModelNumber&amp;quot;: &amp;quot;VVX 410&amp;quot;,&lt;br /&gt;
     &amp;quot;IPv6Address&amp;quot;: &amp;quot;::&amp;quot;,&lt;br /&gt;
     &amp;quot;IPv6LinkAddress&amp;quot;: &amp;quot;::&amp;quot;,&lt;br /&gt;
     &amp;quot;IPv6ULAAddress&amp;quot;: &amp;quot;::&amp;quot;,&lt;br /&gt;
     &amp;quot;MACAddress&amp;quot;: &amp;quot;0004f26fc218&amp;quot;,&lt;br /&gt;
     &amp;quot;AppState&amp;quot;: &amp;quot;AppStateCall&amp;quot;,&lt;br /&gt;
     &amp;quot;ReadyToUse&amp;quot;: &amp;quot;True&amp;quot;&lt;br /&gt;
   },&lt;br /&gt;
   &amp;quot;Status&amp;quot;: &amp;quot;2000&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Show the current line config for a phone. This also shows how you can filter on macaddress:&lt;br /&gt;
 root@asterisk:~# phones.sh lineinfo 0004f26fbe7d&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;data&amp;quot;: [&lt;br /&gt;
     {&lt;br /&gt;
       &amp;quot;LineNumber&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
       &amp;quot;RegistrationStatus&amp;quot;: &amp;quot;registered&amp;quot;,&lt;br /&gt;
       &amp;quot;SIPAddress&amp;quot;: &amp;quot;4666&amp;quot;,&lt;br /&gt;
       &amp;quot;Port&amp;quot;: &amp;quot;5060&amp;quot;,&lt;br /&gt;
       &amp;quot;LineType&amp;quot;: &amp;quot;private&amp;quot;,&lt;br /&gt;
       &amp;quot;Label&amp;quot;: &amp;quot;Zaal3&amp;quot;,&lt;br /&gt;
       &amp;quot;Protocol&amp;quot;: &amp;quot;SIP&amp;quot;,&lt;br /&gt;
       &amp;quot;UserID&amp;quot;: &amp;quot;Zaal3&amp;quot;,&lt;br /&gt;
       &amp;quot;ProxyAddress&amp;quot;: &amp;quot;10.208.11.13&amp;quot;&lt;br /&gt;
     }&lt;br /&gt;
   ],&lt;br /&gt;
   &amp;quot;Status&amp;quot;: &amp;quot;2000&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Reset the configuration of a phone. This also shows how you can use the ip address as a filter:&lt;br /&gt;
 root@asterisk:~# phones.sh configreset 10.208.42.201&lt;br /&gt;
 {&lt;br /&gt;
   &amp;quot;Status&amp;quot;: &amp;quot;2000&amp;quot;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== MPD ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;audio_output {&lt;br /&gt;
	type 		&amp;quot;httpd&amp;quot;&lt;br /&gt;
	name 		&amp;quot;pcm wav Stream&amp;quot;&lt;br /&gt;
	encoder 	&amp;quot;wave&amp;quot;&lt;br /&gt;
	port 		&amp;quot;6666&amp;quot;&lt;br /&gt;
	format 		&amp;quot;8000:16:1&amp;quot;&lt;br /&gt;
}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* /usr/local/bin/stream.sh&lt;br /&gt;
** /usr/bin/curl -s http://10.208.43.94:6666/ --output -&lt;br /&gt;
&lt;br /&gt;
* musiconhold.conf&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[default]&lt;br /&gt;
mode=custom&lt;br /&gt;
application=/usr/local/bin/stream.sh&lt;br /&gt;
format=pcm&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== allowing people from internet to connect to this asterisk instance ===&lt;br /&gt;
&lt;br /&gt;
* adjust sip.conf and extensions.conf&lt;br /&gt;
* add their static ip-address to /etc/iptables/rules.v4&lt;br /&gt;
OR&lt;br /&gt;
* let them connect via [[Wireguard|vpn]]&lt;br /&gt;
&lt;br /&gt;
Then, create a sip account which can be used as a trunk. Add a stanza like below to sip.conf&lt;br /&gt;
 [member_username]&lt;br /&gt;
 type=peer&lt;br /&gt;
 username=member_username&lt;br /&gt;
 secret=PASSWORD_HERE&lt;br /&gt;
 host=dynamic&lt;br /&gt;
 canreinvite=no&lt;br /&gt;
 insecure=invite,port&lt;br /&gt;
 qualify=yes&lt;br /&gt;
 context=users&lt;br /&gt;
 trunk=yes&lt;br /&gt;
 directmedia=no&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next, create the extension(s) you want in extensions.conf:&lt;br /&gt;
 ; When 4700 is dialed, forward the call to extension 100 running on the PBX of member_username&lt;br /&gt;
 exten =&amp;gt; 4700,1,Dial(SIP/member_username/100,90,rum)&lt;br /&gt;
 exten =&amp;gt; 4700,2,VoiceMail(member_username@default,u)&lt;br /&gt;
 exten =&amp;gt; 4700,3,Hangup()&lt;br /&gt;
&lt;br /&gt;
=== Getting Access ===&lt;br /&gt;
It is possible to link [[Asterisk/MemberPBX|your own PBX]] to the NURDspace PBX. This will make it possible that you can call extensions at NURDspace, and that people at nurdspace can contact you at home. To get this to work, you need to request a [[Wireguard|vpn tunnel]] together with a SIP account, and follow the [[Asterisk/MemberPBX|documentation]] to install and configure your very own PBX.&lt;br /&gt;
&lt;br /&gt;
=== member phones ===&lt;br /&gt;
We have a large stock of phones for people to use for voip purposes. You can pick one or more of these to hookup to [[Asterisk/MemberPBX|your very own home PBX]].&lt;br /&gt;
&lt;br /&gt;
For space and personal use, we recommend:&lt;br /&gt;
* ~Various [[Asterisk/Polycom_VVX_Series|Poly/Polycom VVX series phones]]&lt;br /&gt;
* ~A handfull of Polycom CXX 300 phones (works perfect for if you only want a softphone but like the deskphone experience)&lt;br /&gt;
* ~Some 48V adapters for the phones&lt;br /&gt;
[[Category:VoIP]]&lt;br /&gt;
&lt;br /&gt;
We also have a huge stack of phones that need to be put on marktplaats&lt;br /&gt;
* ~30 Aastra/[[Asterisk/mitel_6865i|Mitel 6865i]] gbit (~dozen complete kit inc psu)&lt;br /&gt;
* ~100 Aastra/[[Asterisk/mitel_6735i|Mitel 6735i]] 100mbit&lt;br /&gt;
* ~big box with handsets, cords and feet&lt;br /&gt;
* ~dozen selection of various voip devices&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=ScarlettScroller&amp;diff=13022</id>
		<title>ScarlettScroller</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=ScarlettScroller&amp;diff=13022"/>
		<updated>2022-12-24T16:19:06Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Network */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Scarlett Scroller&lt;br /&gt;
|Skills=Hacking, Electronics, Programming, making, lights,&lt;br /&gt;
|Status=Active&lt;br /&gt;
|Niche=Artsy stuff&lt;br /&gt;
|Purpose=Fun&lt;br /&gt;
|Picture=ScarlettScroller_IMG_0015.JPG&lt;br /&gt;
|Tool=Yes&lt;br /&gt;
|Location=Zaal1&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Image:ScarlettScroller_IMG_0015.JPG&lt;br /&gt;
Image:ScarlettScroller_IMG_0016 (3).JPG&lt;br /&gt;
Image:ScarlettScroller_IMG_0017 (1).JPG&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:ScarlettScroller.gif|right|Scarlett Scroller]]&lt;br /&gt;
&lt;br /&gt;
For questions about this project, see [[User:Bertrik]] on how to contact me.&lt;br /&gt;
&lt;br /&gt;
This page is about modifying a 80x7 pixel scrolling red LED sign with an alternative controller (ESP8266) running custom firmware.&lt;br /&gt;
This makes it possible to use the LED sign as a networked display (WiFi), with pixels that can be individually dimmed in 255 levels.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
The model number is AM03127.&lt;br /&gt;
&lt;br /&gt;
It has 16 elements of 5x7 red LEDs each, for a total of 80x7 LEDs.&lt;br /&gt;
This particular board has monochrome LEDs only.&lt;br /&gt;
&lt;br /&gt;
The electronics consist of two boards: a controller board and a LED board.&lt;br /&gt;
&lt;br /&gt;
The LED board has the following ICs:&lt;br /&gt;
* SN74HC138: 3-to-8 line decoder/multiplexer&lt;br /&gt;
* SN74HC04: 6 inverters&lt;br /&gt;
* 10x SN74HC164: 8-bit parallel-out serial shift registers&lt;br /&gt;
* 4x APM4953: dual P-Channel Enhancement Mode Mosfet &lt;br /&gt;
&lt;br /&gt;
The boards are connected through a 10 pin connector and a 5V power connector.&lt;br /&gt;
&lt;br /&gt;
=== Control connector ===&lt;br /&gt;
[[File:lichtkrant_flok_jp7.jpg|thumb|right|Lichtkrant connector]]&lt;br /&gt;
&lt;br /&gt;
Pinout:&lt;br /&gt;
* pin 1: SCLK&lt;br /&gt;
* pin 2: SCLK (shorted to pin 1)&lt;br /&gt;
* pin 3: G = &#039;green&#039; data bit shifted into row, goes through inverter 6&lt;br /&gt;
* pin 4: R = &#039;red&#039; data bit, goes through inverter 1&lt;br /&gt;
* pin 5: A = row select LSB&lt;br /&gt;
* pin 6: B = row select&lt;br /&gt;
* pin 7: C = row select MSB&lt;br /&gt;
* pin 8: D = appears to not be connected to anything&lt;br /&gt;
* pin 9: GND&lt;br /&gt;
* pin 10: GND&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;caption-side:bottom; text-align:center;&amp;quot;&lt;br /&gt;
|+JP7&lt;br /&gt;
|-&lt;br /&gt;
|  SCLK|| SCLK&lt;br /&gt;
|-&lt;br /&gt;
| R || G&lt;br /&gt;
|-&lt;br /&gt;
| B || A&lt;br /&gt;
|-&lt;br /&gt;
| D || C&lt;br /&gt;
|-&lt;br /&gt;
| GND || GND&lt;br /&gt;
|}&lt;br /&gt;
(as viewed on the controller board)&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;caption-side:bottom; text-align:center;&amp;quot;&lt;br /&gt;
|+JP1&lt;br /&gt;
|-&lt;br /&gt;
| GND || D || B || R || SCLK&lt;br /&gt;
|-&lt;br /&gt;
| GND || C || A || G || SCLK&lt;br /&gt;
|}&lt;br /&gt;
(as viewed from the back side)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Unfortunately the connector does not seem to carry 5V. If that were the case, a replacement microcontroller could be powered directly from the connector, with the main power entering through the 5V power plug.&lt;br /&gt;
&lt;br /&gt;
The display can be blanked by selecting row 0, e.g. signals A, B and C all 0.&lt;br /&gt;
&lt;br /&gt;
=== Power ===&lt;br /&gt;
The control board is powered by a 12V supply and probably contains a step-down converter to turn it into 5V internally.&lt;br /&gt;
&lt;br /&gt;
== Theory of operation ==&lt;br /&gt;
There are 80 pixels horizontally and 10 serial-parallel chips with 8 outputs each,&lt;br /&gt;
so one row of pixels can be kept in the shift registers.&lt;br /&gt;
&lt;br /&gt;
The 3-to-8 decoder selects one particular row to light, through pins A/B/C.&lt;br /&gt;
The MOSFETs are used as drivers.&lt;br /&gt;
Selecting row 0 (A, B, C all 0) disables the display, i.e. does not light any row.&lt;br /&gt;
 &lt;br /&gt;
The SCLK signal goes to the CLK input of all serial-parallel SN74HC164 chips.&lt;br /&gt;
&lt;br /&gt;
The LED board is prepared to be used with R+G LED modules, however this particular board does not have the shift register populated for the dual-color.&lt;br /&gt;
&lt;br /&gt;
It appears there is no &#039;latch&#039; signal, although the controller board has the text &#039;LAT&#039;.&lt;br /&gt;
A latch signal could activate the row data after it&#039;s been written to the shift registers, thereby avoiding the pixels showing up already as they&#039;re being written and reducing the contrast.&lt;br /&gt;
&lt;br /&gt;
== Firmware ==&lt;br /&gt;
Github archive: https://github.com/bertrik/scarlettscroller&lt;br /&gt;
&lt;br /&gt;
The firmware run this on an ESP8266 (wemos d1 mini), which is connected to the LED board through dupont-wire.&lt;br /&gt;
&lt;br /&gt;
The firmware connects to the local wifi network (sets up a captive portal when no wifi has been configured yet).&lt;br /&gt;
Then the framebuffer can be accessed over UDP port 8888. Just send a UDP frame consisting of 80x7 bytes, each byte representing a brightness.&lt;br /&gt;
&lt;br /&gt;
== Integration into nurdspace infrastructure ==&lt;br /&gt;
This scroller is mounted above the door in zaal 1.&lt;br /&gt;
&lt;br /&gt;
=== Power ===&lt;br /&gt;
Power to the scroller is switched along with the power to the *zaal 1 amplifier*.&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
The scroller itself has the following network configuration:&lt;br /&gt;
* host name ESP-74AAEB.dhcp.nurd.space&lt;br /&gt;
* port 5000 (UDP): accepts a text message, the message is scrolled 3 times&lt;br /&gt;
* port 8888 (UDP): accepts a 560 byte (80x7 pixel) frame with 8-bit intensity data&lt;br /&gt;
&lt;br /&gt;
On ticker-proxy.vm.nurd.space port 5108 listens for UDP pixelflood (text!).&lt;br /&gt;
Port 5120 (also UDP) listens for text messages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Scarlettscroller.jpg|640px]]&lt;br /&gt;
&lt;br /&gt;
=== Audio ===&lt;br /&gt;
The plan is to show an audio waveform if music/audio is playing.&lt;br /&gt;
* snap client protocol https://github.com/badaix/snapcast/blob/master/doc/binary_protocol.md&lt;br /&gt;
&lt;br /&gt;
The display shows part of the waveform:&lt;br /&gt;
&lt;br /&gt;
Concepts/calculation:&lt;br /&gt;
* about 10 updates/second, say about 4096 bytes per frame (44100 samples/second)&lt;br /&gt;
* use FFT to find the waveform segment that best matches the currently displayed waveform&lt;br /&gt;
* algorithm: complex FFT of both current waveform and segment to search in, multitply by complex conjugate, IFFT then find largest correlation peak&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13021</id>
		<title>Aandemuur</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13021"/>
		<updated>2022-12-24T16:12:42Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=AanDeMuur&lt;br /&gt;
|Skills=Vision&lt;br /&gt;
|Status=Somewhat working&lt;br /&gt;
|Niche=Hardware&lt;br /&gt;
|Purpose=To look at while smoking&lt;br /&gt;
|Picture=Nieuwe.jpg&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=rookhol&lt;br /&gt;
|Cost=100&lt;br /&gt;
|Participants=Flok&lt;br /&gt;
}}&lt;br /&gt;
== hardware ==&lt;br /&gt;
&lt;br /&gt;
* HUB75 led matrix&lt;br /&gt;
* adafruit HUB75 hat&lt;br /&gt;
* raspberry pi 2&lt;br /&gt;
* 4A 5V powersupply&lt;br /&gt;
&lt;br /&gt;
== software == &lt;br /&gt;
&lt;br /&gt;
* 2022/12/23: only &#039;&#039;pixelflut&#039;&#039; currently, listening on port &#039;&#039;&#039;9891&#039;&#039;&#039; (TCP)&lt;br /&gt;
&lt;br /&gt;
* 2022/12/24: added a binary-format listener (untested!) port &#039;&#039;&#039;9282&#039;&#039;&#039; (UDP)&lt;br /&gt;
** format:&lt;br /&gt;
** short int in network order: y offset, then upto the end of the packet: RGBRGBRGB... (1 byte per color)&lt;br /&gt;
&lt;br /&gt;
* IP address: 10.208.42.188&lt;br /&gt;
* also reachable on aandemuur.local&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13020</id>
		<title>Aandemuur</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13020"/>
		<updated>2022-12-24T16:06:09Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=AanDeMuur&lt;br /&gt;
|Skills=Vision&lt;br /&gt;
|Status=Somewhat working&lt;br /&gt;
|Niche=Hardware&lt;br /&gt;
|Purpose=To look at while smoking&lt;br /&gt;
|Picture=Nieuwe.jpg&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=rookhol&lt;br /&gt;
|Cost=100&lt;br /&gt;
|Participants=Flok&lt;br /&gt;
}}&lt;br /&gt;
== hardware ==&lt;br /&gt;
&lt;br /&gt;
* HUB75 led matrix&lt;br /&gt;
* adafruit HUB75 hat&lt;br /&gt;
* raspberry pi 2&lt;br /&gt;
* 4A 5V powersupply&lt;br /&gt;
&lt;br /&gt;
== software == &lt;br /&gt;
&lt;br /&gt;
* 2022/12/23: only &#039;&#039;pixelflut&#039;&#039; currently, listening on port &#039;&#039;&#039;9891&#039;&#039;&#039; (TCP)&lt;br /&gt;
&lt;br /&gt;
* 2022/12/24: added a binary-format listener (untested!) port &#039;&#039;&#039;9282&#039;&#039;&#039; (UDP)&lt;br /&gt;
** format:&lt;br /&gt;
** short int in network order: y offset, then upto the end of the packet: RGBRGBRGB... (1 byte per color)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13019</id>
		<title>Aandemuur</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13019"/>
		<updated>2022-12-24T15:11:57Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=AanDeMuur&lt;br /&gt;
|Skills=Vision&lt;br /&gt;
|Status=Somewhat working&lt;br /&gt;
|Niche=Hardware&lt;br /&gt;
|Purpose=To look at while smoking&lt;br /&gt;
|Picture=Nieuwe.jpg&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=rookhol&lt;br /&gt;
|Cost=100&lt;br /&gt;
|Participants=Flok&lt;br /&gt;
}}&lt;br /&gt;
== hardware ==&lt;br /&gt;
&lt;br /&gt;
* HUB75 led matrix&lt;br /&gt;
* adafruit HUB75 hat&lt;br /&gt;
* raspberry pi 2&lt;br /&gt;
* 4A 5V powersupply&lt;br /&gt;
&lt;br /&gt;
== software == &lt;br /&gt;
&lt;br /&gt;
* 2022/12/24: only &#039;&#039;pixelflut&#039;&#039; currently, listening on port &#039;&#039;&#039;9891&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13018</id>
		<title>Aandemuur</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13018"/>
		<updated>2022-12-24T15:11:03Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Participants=Flok&lt;br /&gt;
|Name=AanDeMuur&lt;br /&gt;
|Skills=Vision&lt;br /&gt;
|Status=Somewhat working&lt;br /&gt;
|Niche=Hardware&lt;br /&gt;
|Purpose=To look at while smoking&lt;br /&gt;
|Picture=Nieuwe.jpg&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=rookhol&lt;br /&gt;
|Cost=100&lt;br /&gt;
}}&lt;br /&gt;
== hardware ==&lt;br /&gt;
&lt;br /&gt;
* HUB75 led matrix&lt;br /&gt;
* adafruit HUB75 hat&lt;br /&gt;
* raspberry pi 2&lt;br /&gt;
* 4A 5V powersupply&lt;br /&gt;
&lt;br /&gt;
== software == &lt;br /&gt;
&lt;br /&gt;
* 2022/12/24: only &#039;&#039;pixelflut&#039;&#039; currently, listening on port &#039;&#039;&#039;9891&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13017</id>
		<title>Aandemuur</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13017"/>
		<updated>2022-12-24T15:09:57Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=AanDeMuur&lt;br /&gt;
|Skills=Vision&lt;br /&gt;
|Status=Somewhat working&lt;br /&gt;
|Niche=Hardware&lt;br /&gt;
|Purpose=To look at while smoking&lt;br /&gt;
|Picture=Nieuwe.jpg&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=rookhol&lt;br /&gt;
|Cost=100&lt;br /&gt;
}}&lt;br /&gt;
== hardware ==&lt;br /&gt;
&lt;br /&gt;
* HUB75 led matrix&lt;br /&gt;
* adafruit HUB75 hat&lt;br /&gt;
* raspberry pi 2&lt;br /&gt;
* 4A 5V powersupply&lt;br /&gt;
&lt;br /&gt;
== software == &lt;br /&gt;
&lt;br /&gt;
* 2022/12/24: only &#039;&#039;pixelflut&#039;&#039; currently, listening on port &#039;&#039;&#039;9891&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13016</id>
		<title>Aandemuur</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Aandemuur&amp;diff=13016"/>
		<updated>2022-12-24T15:09:33Z</updated>

		<summary type="html">&lt;p&gt;Flok: Created page with &amp;quot;{{Project |Name=AanDeMuur |Skills=Vision |Status=Somewhat working |Niche=Hardware |Purpose=To look at while smoking |Picture=Nieuwe.jpg |Tool=No }}  == hardware ==  * HUB75 le...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=AanDeMuur&lt;br /&gt;
|Skills=Vision&lt;br /&gt;
|Status=Somewhat working&lt;br /&gt;
|Niche=Hardware&lt;br /&gt;
|Purpose=To look at while smoking&lt;br /&gt;
|Picture=Nieuwe.jpg&lt;br /&gt;
|Tool=No&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== hardware ==&lt;br /&gt;
&lt;br /&gt;
* HUB75 led matrix&lt;br /&gt;
* adafruit HUB75 hat&lt;br /&gt;
* raspberry pi 2&lt;br /&gt;
* 4A 5V powersupply&lt;br /&gt;
&lt;br /&gt;
== software == &lt;br /&gt;
&lt;br /&gt;
* 2022/12/24: only &#039;&#039;pixelflut&#039;&#039; currently, listening on port &#039;&#039;&#039;9891&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=File:Nieuwe.jpg&amp;diff=13015</id>
		<title>File:Nieuwe.jpg</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=File:Nieuwe.jpg&amp;diff=13015"/>
		<updated>2022-12-24T15:07:47Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=HAIrk&amp;diff=13009</id>
		<title>HAIrk</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=HAIrk&amp;diff=13009"/>
		<updated>2022-12-21T17:09:26Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=hAIrk&lt;br /&gt;
|Skills=software, neural networks, gpu,&lt;br /&gt;
|Status=Active&lt;br /&gt;
|Niche=Artsy stuff&lt;br /&gt;
|Purpose=Fun&lt;br /&gt;
|Picture=HAIrk.png&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=gpu.vm.nurd.space&lt;br /&gt;
}}&lt;br /&gt;
== What is this ==&lt;br /&gt;
&lt;br /&gt;
NURDspace goes Stable Diffusion! &lt;br /&gt;
&lt;br /&gt;
Stable Diffusion is a machine learning model developed by Stability.ai to generate digital images from natural language descriptions.&lt;br /&gt;
&lt;br /&gt;
Right now we are running the latest version which is 1.4.&lt;br /&gt;
&lt;br /&gt;
== How does it work ==&lt;br /&gt;
&lt;br /&gt;
For now ; http://10.208.30.24:8000/&lt;br /&gt;
For Discord, contact Melan to get an invite link for the bot.&lt;br /&gt;
&lt;br /&gt;
There&#039;s a queuing system in place, and soon it&#039;ll get hooked up through ghbot and perhaps mediawiki(!!!)&lt;br /&gt;
&lt;br /&gt;
# open webpage&lt;br /&gt;
# enter a prompt (this is a piece of text describing what you want to see , for example &#039;a digital artwork of a rake floating in cyberspace with many fragments of keyboards floating around , photorealistic , trending on artstation&#039;&lt;br /&gt;
# click &#039;generate&#039;&lt;br /&gt;
# wait ~45 seconds per queue item&lt;br /&gt;
# you get a picture \o/&lt;br /&gt;
&lt;br /&gt;
Another thing you can try is remixing original images with the &#039;img2img&#039; features.&lt;br /&gt;
&lt;br /&gt;
# open webpage&lt;br /&gt;
# enter a prompt for what you want to see the image become (for example &#039;trump raking the forest&#039;)&lt;br /&gt;
# next to &#039;img2img&#039; click on &#039;choose file&#039; , choose some trump.jpg , preferebly somewhat close to the prompt you want&lt;br /&gt;
# click &#039;generate&#039;&lt;br /&gt;
# wait ~45 seconds per queue item&lt;br /&gt;
# you get a picture \o/&lt;br /&gt;
&lt;br /&gt;
Please don&#039;t over abuse it :D &lt;br /&gt;
&lt;br /&gt;
== Some tips ==&lt;br /&gt;
&lt;br /&gt;
Tips by [[User:Buzz|buZz]] ([[User talk:Buzz|talk]])&lt;br /&gt;
&lt;br /&gt;
* &#039; cfg scale &#039; has some complexity addition to the generated image (see the reddit post somewhere below)&lt;br /&gt;
* &#039; steps &#039; is amount of iterations the model runs on top of itself to match your prompt, higher takes longer, but most samplers (default we use is KLMS) dont do well with &amp;lt;32 steps , notably k_euler_a DOES get some nice results for ~10 steps already, so if you&#039;re in a hurry ...&lt;br /&gt;
* lowering &#039; img2img strength &#039; will make it MORE the original picture (under 0.4 is usually nowhere near any changes, unless you use a high cfg scale?? see stolentips below) &lt;br /&gt;
* you can subdivide topics in your prompt with a comma. for example (&#039;a duck, a pond, a submarine&#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Stolen from this site (if you dont wanna click links with &#039;nsfw&#039; in the url) (i removed the tips about running the model)&lt;br /&gt;
* https://mrdeepfakes.com/forums/threads/guide-using-stable-diffusion-to-generate-custom-nsfw-images.10289/&lt;br /&gt;
&lt;br /&gt;
* You can drag your favorite result from the output tab on the right back into img2img for further iteration&lt;br /&gt;
* The k_euler_a and k_dpm_2_a samplers give vastly different, more intricate results from the same seed &amp;amp; prompt&lt;br /&gt;
* Unlike other samplers, k_euler_a can generate high quality results from low steps. Try it with 10-25 instead of 50&lt;br /&gt;
* The seed for each generated result is in the output filename if you want to revisit it&lt;br /&gt;
* Using the same keywords as a generated image in img2img produces interesting variants&lt;br /&gt;
* It&#039;s recommended to have your prompts be at least 512 pixels in one dimension, or a 384x384 square at the smallest&lt;br /&gt;
* Anything smaller will have heavy artifacting&lt;br /&gt;
* 512x512 will always yield the most accurate results as the model was trained at that resolution&lt;br /&gt;
* Try Low strength (0.3-0.4) + High CFG in img2img for interesting outputs&lt;br /&gt;
* You can use Japanese Unicode characters in prompts&lt;br /&gt;
&lt;br /&gt;
== Some good prompt examples ==&lt;br /&gt;
&lt;br /&gt;
a digital artwork of a active hackerspace during a rave, many laptops, ambient lighting, fantasy, steampunk, trending on artstation&lt;br /&gt;
&lt;br /&gt;
[[File:SD-ravinghackerspaces.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maybe people can place some cool stuff they made here, and what prompt and/or parameters they used? :)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Extra links ==&lt;br /&gt;
&lt;br /&gt;
* Checkout the GPU stats in [[Grafana]] on https://metrics.nurd.space/d/tAe_RuWVz/erratic-gpu&lt;br /&gt;
&lt;br /&gt;
There are many tutorials for this stuff around, not all as SFW, but still good:&lt;br /&gt;
&lt;br /&gt;
* https://mrdeepfakes.com/forums/threads/guide-using-stable-diffusion-to-generate-custom-nsfw-images.10289/&lt;br /&gt;
* https://www.reddit.com/r/StableDiffusion/comments/wnlsn8/steps_and_cfg_scale_tests/&lt;br /&gt;
* https://strikingloo.github.io/stable-diffusion-vs-dalle-2&lt;br /&gt;
* https://thealgorithmicbridge.substack.com/p/stable-diffusion-is-the-most-important&lt;br /&gt;
* &lt;br /&gt;
&lt;br /&gt;
Prompt generators are a thing too : &lt;br /&gt;
&lt;br /&gt;
* https://www.phase.art/&lt;br /&gt;
* https://promptomania.com/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Textual inversion is a thing now aswell (soon/eventually in our version) : &lt;br /&gt;
&lt;br /&gt;
* https://huggingface.co/spaces/pharma/CLIP-Interrogator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== GPU ===&lt;br /&gt;
We are using a Gigabyte P106-100 (Basically a Nvidia GTX1060 6GB trimmed down for mining), which is PCIe forwarded/exposed to a KVM running on [[Erratic]]. &lt;br /&gt;
&lt;br /&gt;
Of course, better would be a higher memory card, so we can run Dall-E mini mega as well (seemingly requires 24GB). Although for just Stable Diffusion a faster more current card, with 8~12GB of ram would be suitable enough as well as we are running a fork that uses less memory. A Geforce 3060 with 12GB of vram is a interesting, not too expensive (~350 euro) upgrade.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
GPU_fan.jpg|A Sun Ace 80 fan has been strapped to the GPU&lt;br /&gt;
GPU_erratic.jpg|The GPU fitting &amp;quot;snugly&amp;quot; inside Erratic&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wanna run your own? ===&lt;br /&gt;
&lt;br /&gt;
* http://github.com/lstein/stable-diffusion&lt;br /&gt;
&lt;br /&gt;
* https://github.com/borisdayma/dalle-mini&lt;br /&gt;
&lt;br /&gt;
* https://stability.ai&lt;br /&gt;
&lt;br /&gt;
=== Wanna train your own? ===&lt;br /&gt;
&lt;br /&gt;
* dataset is 240TB for 384x384 resolution images, https://laion.ai/blog/laion-5b/&lt;br /&gt;
* a search engine for the dataset is here ; https://rom1504.github.io/clip-retrieval/&lt;br /&gt;
&lt;br /&gt;
=== 24GB cards ===&lt;br /&gt;
&lt;br /&gt;
* https://tweakers.net/videokaarten/vergelijken/#filter:PYxNCsIwEIXvMusIrTWp5gCFLlzlBCEddSRtQhJELLm7ExBXj_e9nx1oe2Eq5hGiQY-uUNhA36zPKCCkBdNE6BfQEBM9M_ygCakws9n9SUQ3c-_QC4j2joY-CLrvOtGWDq_Ev2wy9ybyBVMGvcM4XM5N1xbD8SRHxY-rfbNTUg4Kaq1f&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== what if it breaks ==&lt;br /&gt;
&lt;br /&gt;
* login to nurds@gpu.vm.nurd.space&lt;br /&gt;
* screen -S gpu&lt;br /&gt;
* under dreamingAPI start run.sh&lt;br /&gt;
* under stable-diffusion-webui start webui.sh&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Max&amp;diff=12991</id>
		<title>Max</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Max&amp;diff=12991"/>
		<updated>2022-12-10T13:16:28Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is Max:&lt;br /&gt;
&lt;br /&gt;
[[File:Max-auto.jpg|450px]]&lt;br /&gt;
&lt;br /&gt;
Max loves to sit in the car. Max loves to eat. He loves to sleep. To walk with his [[flok|owner]]. Running and playing are also his favourite. He has a lot of toys. He loves his toys.&lt;br /&gt;
&lt;br /&gt;
 (born January 2020)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are also [[Dogs|other dogs]] in NURDspace as well.&lt;br /&gt;
&lt;br /&gt;
commands:&lt;br /&gt;
&lt;br /&gt;
* wacht&lt;br /&gt;
* zit&lt;br /&gt;
* laag&lt;br /&gt;
* braaf&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12988</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12988"/>
		<updated>2022-12-06T20:20:54Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Feature Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* create an alias for a nick (...the hostname of a nick):&lt;br /&gt;
** merge newnick oldnick&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;!merge new-nick old-nick&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* &amp;lt;s&amp;gt;!karma-whyup !karma-whoup !karma-whodown !karma-whydown&amp;lt;/s&amp;gt; !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
** implemented as !whykarma&lt;br /&gt;
* &amp;lt;s&amp;gt;!op / auto-op&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
=== !what ===&lt;br /&gt;
&lt;br /&gt;
* runs under ghbot user (via systemd) on nurdservices. invokes dhcp-lease-list underneath (with some awk magic)&lt;br /&gt;
* has a -v switch for verbose mode&lt;br /&gt;
&lt;br /&gt;
=== spacesound ===&lt;br /&gt;
&lt;br /&gt;
* mpd_plugin.py&lt;br /&gt;
** !np / !mpd / !radio / !radiolink&lt;br /&gt;
** mpd_plugin.service&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12987</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12987"/>
		<updated>2022-12-06T20:20:29Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Feature Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* create an alias for a nick (...the hostname of a nick):&lt;br /&gt;
** merge newnick oldnick&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;!merge new-nick old-nick&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* &amp;lt;s&amp;gt;!karma-whyup !karma-whoup !karma-whodown !karma-whydown&amp;lt;/s !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
** implemented as !whykarma&lt;br /&gt;
* &amp;lt;s&amp;gt;!op / auto-op&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
=== !what ===&lt;br /&gt;
&lt;br /&gt;
* runs under ghbot user (via systemd) on nurdservices. invokes dhcp-lease-list underneath (with some awk magic)&lt;br /&gt;
* has a -v switch for verbose mode&lt;br /&gt;
&lt;br /&gt;
=== spacesound ===&lt;br /&gt;
&lt;br /&gt;
* mpd_plugin.py&lt;br /&gt;
** !np / !mpd / !radio / !radiolink&lt;br /&gt;
** mpd_plugin.service&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12986</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12986"/>
		<updated>2022-12-05T20:22:26Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Feature Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* create an alias for a nick (...the hostname of a nick):&lt;br /&gt;
** merge newnick oldnick&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;!merge new-nick old-nick&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
* &amp;lt;s&amp;gt;!op / auto-op&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
=== !what ===&lt;br /&gt;
&lt;br /&gt;
* runs under ghbot user (via systemd) on nurdservices. invokes dhcp-lease-list underneath (with some awk magic)&lt;br /&gt;
* has a -v switch for verbose mode&lt;br /&gt;
&lt;br /&gt;
=== spacesound ===&lt;br /&gt;
&lt;br /&gt;
* mpd_plugin.py&lt;br /&gt;
** !np / !mpd / !radio / !radiolink&lt;br /&gt;
** mpd_plugin.service&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12855</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12855"/>
		<updated>2022-10-29T15:22:24Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python.&lt;br /&gt;
&lt;br /&gt;
Flok messed around with things as well (added a few bugs).&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Tahtk3v/Nurdopen (python code)&lt;br /&gt;
&lt;br /&gt;
* https://github.com/NURDspace/NurdOpen-ESP32  (esp32)&lt;br /&gt;
&lt;br /&gt;
== Sending a text to it (to use it as a ticker) ==&lt;br /&gt;
&lt;br /&gt;
*  mosquitto_pub -h mqtt.vm.nurd.space -t &#039;doorpixel/scroll&#039; -m &#039;niet poepen bij de deur&#039;&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;br /&gt;
* /home/nurds/openClosedSign&lt;br /&gt;
* start via Portainer (see [[Erratic]], look for &amp;quot;goofy_chatelet&amp;quot; in the list of containers)&lt;br /&gt;
* recreate: docker stop openclosesign &amp;amp;&amp;amp; docker rm openclosesign &amp;amp;&amp;amp; docker build --no-cache . -t openclosesign  &amp;amp;&amp;amp; docker run -d --name openclosesign openclosesign:latest&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
* the ESP32 seems to lose connection with the network after a couple of hours if the space is closed [https://github.com/NURDspace/Nurdopen/issues/7]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12849</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12849"/>
		<updated>2022-10-28T18:55:54Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* What/where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python.&lt;br /&gt;
&lt;br /&gt;
Flok messed around with things as well (added a few bugs).&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Tahtk3v/Nurdopen (python code)&lt;br /&gt;
&lt;br /&gt;
* https://github.com/NURDspace/NurdOpen-ESP32  (esp32)&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;br /&gt;
* /home/nurds/openClosedSign&lt;br /&gt;
* start via Portainer (see [[Erratic]], look for &amp;quot;goofy_chatelet&amp;quot; in the list of containers)&lt;br /&gt;
* recreate: docker stop openclosesign &amp;amp;&amp;amp; docker rm openclosesign &amp;amp;&amp;amp; docker build --no-cache . -t openclosesign  &amp;amp;&amp;amp; docker run -d --name openclosesign openclosesign:latest&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12848</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12848"/>
		<updated>2022-10-28T17:58:47Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* How it was made? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python.&lt;br /&gt;
&lt;br /&gt;
Flok messed around with things as well (added a few bugs).&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Tahtk3v/Nurdopen (python code)&lt;br /&gt;
&lt;br /&gt;
* https://github.com/NURDspace/NurdOpen-ESP32  (esp32)&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;br /&gt;
* /home/nurds/openClosedSign&lt;br /&gt;
* start via Portainer (see [[Erratic]], look for &amp;quot;goofy_chatelet&amp;quot; in the list of containers)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12847</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12847"/>
		<updated>2022-10-28T17:58:13Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made? ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Tahtk3v/Nurdopen (python code)&lt;br /&gt;
&lt;br /&gt;
* https://github.com/NURDspace/NurdOpen-ESP32  (esp32)&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;br /&gt;
* /home/nurds/openClosedSign&lt;br /&gt;
* start via Portainer (see [[Erratic]], look for &amp;quot;goofy_chatelet&amp;quot; in the list of containers)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12843</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12843"/>
		<updated>2022-10-28T11:52:44Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* What/where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made? ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/Tahtk3v/Nurdopen&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;br /&gt;
* /home/nurds/openClosedSign&lt;br /&gt;
* start via Portainer (see [[Erratic]], look for &amp;quot;goofy_chatelet&amp;quot; in the list of containers)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Erratic&amp;diff=12842</id>
		<title>Erratic</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Erratic&amp;diff=12842"/>
		<updated>2022-10-28T11:51:39Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Inventory&lt;br /&gt;
|Name=Erratic&lt;br /&gt;
|Owner=Space&lt;br /&gt;
|Status=Infra&lt;br /&gt;
|Hostname=erratic.lan.nurd.space&lt;br /&gt;
|Picture=erratic-duringsetup.jpg&lt;br /&gt;
|Tool=Yes&lt;br /&gt;
|Category=Infrastructure&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Image:erratic_case1.jpg&lt;br /&gt;
Image:erratic_case2.jpg&lt;br /&gt;
Image:erratic_case4.jpg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Erratic ==&lt;br /&gt;
Erratic is our current primary server that&#039;s running things such as nurdservices, ipam and many other tools that we use as well as a few member projects. Erratic is the successor of [[Coherence]].&lt;br /&gt;
&lt;br /&gt;
== Addresses ==&lt;br /&gt;
&lt;br /&gt;
 erratic.lan.nurd.space 10.208.30.70&lt;br /&gt;
 erratic-bmc.lan.nurd.space 10.208.30.71&lt;br /&gt;
&lt;br /&gt;
== Software Stack ==&lt;br /&gt;
&lt;br /&gt;
Please try your best to document VMs and LXC containers and their use, as well as any docker containers that you setup. This so it&#039;s easier for your fellow Nurds to do maintenance or fix something going haywire. &lt;br /&gt;
&lt;br /&gt;
== Specs ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Type !! Name &lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Motherboard&#039;&#039;&#039; || [https://www.supermicro.com/en/products/motherboard/X10SRi-F Supermicro X10SRi-F]&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Processor&#039;&#039;&#039; || [https://ark.intel.com/content/www/us/en/ark/products/83352/intel-xeon-processor-e52620-v3-15m-cache-2-40-ghz.html Intel Xeon E5-2620 v3] (vintage 2014, 6core, 12threads, 15M cache @ 2.4G , 3.2G turbo (actually it seems to do 4Ghz?))&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;OS&#039;&#039;&#039; || Proxmox 7.1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Memory&#039;&#039;&#039; || 2x 32GB DDR4 ECC running at 1866MT/s (max speed of modules 2133MT/s)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;OS SSD&#039;&#039;&#039; || Samsung 840 EVO 250GB&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;NVME Storage&#039;&#039;&#039; || 2x Samsung 980 1TB&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;HDD Storage&#039;&#039;&#039; || 2x Samsung HD204UI 2TB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== bare-metal ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Service !! port(s) !! link !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Proxmox || 8006 ||https://erratic.lan.nurd.space:8006 || Proxmox web interface&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Docker ===&lt;br /&gt;
The system is running a Docker LXC at docker.vm.nurd.space/10.208.11.8 which can be managed using Portainer at [https://10.208.11.8/ https://10.208.11.8/] (username &#039;admin&#039;).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Docker container !! port(s) !! link !! Maintainer !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Portainer || 8000, 443 || https://10.208.11.8 || Space || Web interface for managing docker containers (Username admin)&lt;br /&gt;
|- &lt;br /&gt;
| Scrutiny || 8001 || http://10.208.11.8:8001 || Space || Web interface showing smart status, collector running on Erratic.&lt;br /&gt;
|-&lt;br /&gt;
| epcmqttbridge  || - || -  || Melan || A EPC to mqtt bridge. See https://github.com/NURDspace/epcMqttBridge&lt;br /&gt;
|-&lt;br /&gt;
| doordaemon || - || -  || Melan || Doordaemon that handles the email for who-opened-the-door, used to run on Nurdbot&lt;br /&gt;
|-&lt;br /&gt;
| nurds-streamer || - || -  || Melan || A snapcast-pulseaudio-darkice integration for streaming nurdspace radio&lt;br /&gt;
|-&lt;br /&gt;
| nurdslq-streamer || - || -  || Melan || A snapcast-pulseaudio-darkice integration for streaming nurdspace radio (LQ version)&lt;br /&gt;
|-&lt;br /&gt;
| openclosedsign || - || -  || Melan || https://github.com/NURDspace/Nurdopen&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== LXC ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! ID !! LXC Name !! port(s) !! link !! Maintainer || Description&lt;br /&gt;
|-&lt;br /&gt;
| 100 ||docker.vm.nurd.space || See docker || - || Space || LXC running docker containers&lt;br /&gt;
|-&lt;br /&gt;
| 101 || monitoring.vm.nurd.space || ? || - || r3boot || monitoring&lt;br /&gt;
|-&lt;br /&gt;
| 102 ||parts.nurd.space || ? || - || Space || PartKeepr&lt;br /&gt;
|-&lt;br /&gt;
| 103 ||postgresql.vm.nurd.space || - || - || Space || Database for PartKeepr&lt;br /&gt;
|-&lt;br /&gt;
| 104 ||status.vm.nurd.space || - || - || - || Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 105 ||influx.vm.nurd.space || ? || - || - || Running influxdb and grafana&lt;br /&gt;
|-&lt;br /&gt;
| 106 ||harkbot.vm.nurd.space || - || - || Flok || GHBot&lt;br /&gt;
|-&lt;br /&gt;
| 108 ||gitea.vm.nurd.space || ? || - || Space || Gitea instance&lt;br /&gt;
|-&lt;br /&gt;
| 109 ||asterisk.vm.nurd.space || - || - || Flok || Asterisk instance&lt;br /&gt;
|-&lt;br /&gt;
| 110 ||IPFIXer.vm.nurd.space || - || - || Flok || No idea&lt;br /&gt;
|-&lt;br /&gt;
| 111 ||Flunk || - || - || Flunk || No idea&lt;br /&gt;
|-&lt;br /&gt;
| 113 ||auth.vm.nurd.space || - || - || space || does ldap??&lt;br /&gt;
|-&lt;br /&gt;
| 114 ||irctvserver || - || - || Flok || Handles IRC tv&lt;br /&gt;
|-&lt;br /&gt;
| 115 ||wekan.vm.nurd.space || 443 || - || Space || Wekan instance&lt;br /&gt;
|-&lt;br /&gt;
| 116 ||nurdwiki-migration.vm.nurd.space || - || - || r3boot || Attempt to update the wiki&lt;br /&gt;
|-&lt;br /&gt;
| 117 ||snor.vm.nurd.space || - || - || ? || Honestly, no idea.&lt;br /&gt;
|-&lt;br /&gt;
| 118 ||gopher || - || - || buZz || No idea.&lt;br /&gt;
|-&lt;br /&gt;
| 119 ||gallery.vm.nurd.space || - || - || ? || No idea&lt;br /&gt;
|-&lt;br /&gt;
| 120 ||librenms.vm.nurd.space || - || - || Space || Librenms instance&lt;br /&gt;
|-&lt;br /&gt;
| 121 ||mercator.vm.nurd.space || - || - || Petraea || 🤷‍♀️&lt;br /&gt;
|-&lt;br /&gt;
| 122 ||saml.vm.nurd.space || - || - || idk || idk&lt;br /&gt;
|-&lt;br /&gt;
| 124 ||sdr.vm.nurd.space || See [[Airplane_Tracking]] || http://sdr.dhcp.nurd.space:8082 || Melan || SDR and airplane tracking instance&lt;br /&gt;
|-&lt;br /&gt;
| 125 ||ipam.vm.nurd.space || 443 || https://ipam.nurd.space/ || Petraea || ipam stance&lt;br /&gt;
|-&lt;br /&gt;
| 126 ||soundfx.dhcp.nurd.space || See [[soundfx]] || - || Melan || Container that makes leds go flashy on music&lt;br /&gt;
|-&lt;br /&gt;
| 127 || mail.vm.nurd.space || - || - || idk || idk&lt;br /&gt;
|-&lt;br /&gt;
| 128 ||revproxy01.vm.nurd.space || 443 || - || space || Instance running nginx to make internal sites accessible outside&lt;br /&gt;
|-&lt;br /&gt;
| 130 ||ticker-proxy.vm.nurd.space || - || - || Flok || Proxy for the tickers&lt;br /&gt;
|-&lt;br /&gt;
| 132 ||minecraft.vm.nurd.space || - || - || Flok || Provides a Minecraft server for members&lt;br /&gt;
|-&lt;br /&gt;
| 132 ||polyding.vm.nurd.space || - || - || ??? || ???&lt;br /&gt;
|-&lt;br /&gt;
| 133 ||egg.vm.nurd.space || - || - || Space || Provides shells to members&lt;br /&gt;
|-&lt;br /&gt;
| 134 ||webmpd.vm.nurd.space || - || - || r3boot || A mpd web interface&lt;br /&gt;
|-&lt;br /&gt;
| 136 ||tesderdetest.vm.nurd.space || - || - || ??? || ??? &lt;br /&gt;
|-&lt;br /&gt;
| 136 ||xmpp.vm.nurd.space || - || - || Flok || A xmpp server for members&lt;br /&gt;
|-&lt;br /&gt;
| 140 || nurdbot.vm.nurd.space || - || - || Space || Runs Nurdbot (Offline, replaced by GHbot)&lt;br /&gt;
|-&lt;br /&gt;
| 142 || mongodb.vm.nurd.space || - || - || Flok|| Mongodb instance&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== VM ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
! ID !! VM Name !! port(s) !! link !! Maintainer || Description&lt;br /&gt;
|-&lt;br /&gt;
| 112 || portal.nurd.space || - || - || Zarya || User portal&lt;br /&gt;
|-&lt;br /&gt;
| 123 || jarvis.vm.nurd.space || - || - || Space || Runs homeassistant&lt;br /&gt;
|-&lt;br /&gt;
| 137 || backup.vm.nurd.space || - || - || r3boot || VM that handles our backups&lt;br /&gt;
|-&lt;br /&gt;
| 138 || gpu.vm.nurd.space || - || - || Melan || VM for machine learning w/gpu passthrough&lt;br /&gt;
|-&lt;br /&gt;
| 139 || ldap-dev.vm.nurd.space || - || - || Petraea || LDAP Dev instance&lt;br /&gt;
|-&lt;br /&gt;
| 144 || nurdservices.nurd.space || - || - || Space || Runs DHCP and DNS&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Raid ===&lt;br /&gt;
The two NVME drives are running in raid 1, aside from a 50GB partition that is run in raid 0 to provide a cache for the hdd storage.&lt;br /&gt;
&lt;br /&gt;
This HDD storage is running a raid 1 as well and reaches very good performance. [[SSD_Acceleration#attempt_3|measured speeds]]&lt;br /&gt;
&lt;br /&gt;
The NVME storage is used for instances that benefit from fast speeds, try to refrain from using it for endless crap.&lt;br /&gt;
&lt;br /&gt;
== To document ==&lt;br /&gt;
* second nic&lt;br /&gt;
* LACPs ( isn&#039;t [[Network]] enough? )&lt;br /&gt;
* photos (eh?)&lt;br /&gt;
&lt;br /&gt;
== Parts ==&lt;br /&gt;
&lt;br /&gt;
* case https://www.supermicro.com/en/products/chassis/4U/745/SC745BAC-R1K23B-SQ &lt;br /&gt;
* motherboard https://www.supermicro.com/en/products/motherboard/X10SRi-F &lt;br /&gt;
* CPU https://www.intel.com/content/www/us/en/products/sku/83352/intel-xeon-processor-e52620-v3-15m-cache-2-40-ghz/specifications.html&lt;br /&gt;
* memory 2x HMA84GR7MFR4N-TF 32GB ECC Dual Rank x4 PC4-17000P-R (DDR4-2133) Registered CAS-15   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Useful guides ===&lt;br /&gt;
Installing docker in a LXC and enabling overlay2 fs&lt;br /&gt;
* https://du.nkel.dev/blog/2021-03-25_proxmox_docker/&lt;br /&gt;
* https://gist.github.com/hostberg/86bfaa81e50cc0666f1745e1897c0a56&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12841</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12841"/>
		<updated>2022-10-28T11:51:22Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* What/where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made? ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/Tahtk3v/Nurdopen&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;br /&gt;
* /home/nurds/openClosedSign&lt;br /&gt;
* start via Portainer (see [[Erratic]])&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12840</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12840"/>
		<updated>2022-10-28T11:32:39Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* What/where */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made? ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/Tahtk3v/Nurdopen&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;br /&gt;
* /home/nurds/openClosedSign&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12839</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12839"/>
		<updated>2022-10-28T11:16:10Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made? ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/Tahtk3v/Nurdopen&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12838</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12838"/>
		<updated>2022-10-28T11:16:00Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made? ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/Tahtk3v/Nurdopen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What/where ==&lt;br /&gt;
&lt;br /&gt;
* docker instance on erratic (vm 100)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12837</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12837"/>
		<updated>2022-10-28T11:15:26Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Use Case */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use case == &lt;br /&gt;
&lt;br /&gt;
To make it easier for visitors to see that someone is in.&lt;br /&gt;
&lt;br /&gt;
== How it was made? ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/Tahtk3v/Nurdopen&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12836</id>
		<title>Open/closed sign</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Open/closed_sign&amp;diff=12836"/>
		<updated>2022-10-28T11:15:10Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* How did it get made? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Project&lt;br /&gt;
|Name=Open/Closed sign for the space&lt;br /&gt;
|Skills=1337 Skillz, coding,&lt;br /&gt;
|Status=Broken&lt;br /&gt;
|Niche=Infra&lt;br /&gt;
|Purpose=Electronics, fun, world domination&lt;br /&gt;
|Tool=No&lt;br /&gt;
|Location=Zaal 2&lt;br /&gt;
|Cost=IDK Ask Melan&lt;br /&gt;
|Category=Electronics&lt;br /&gt;
}}&lt;br /&gt;
A open and Closed sign for our space!&lt;br /&gt;
&lt;br /&gt;
== Use Case == &lt;br /&gt;
&lt;br /&gt;
To Make it easier for visitors to see that someone is in&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How it was made? ==&lt;br /&gt;
&lt;br /&gt;
Melan helped me out a lot and provided 99% of the code as i&#039;m a n00b at Python&lt;br /&gt;
&lt;br /&gt;
== Code ==&lt;br /&gt;
&lt;br /&gt;
https://github.com/Tahtk3v/Nurdopen&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12835</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12835"/>
		<updated>2022-10-27T16:45:12Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* nurdspace specific */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* create an alias for a nick (...the hostname of a nick):&lt;br /&gt;
** merge newnick oldnick&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;!merge new-nick old-nick&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
=== !what ===&lt;br /&gt;
&lt;br /&gt;
* runs under ghbot user (via systemd) on nurdservices. invokes dhcp-lease-list underneath (with some awk magic)&lt;br /&gt;
* has a -v switch for verbose mode&lt;br /&gt;
&lt;br /&gt;
=== spacesound ===&lt;br /&gt;
&lt;br /&gt;
* mpd_plugin.py&lt;br /&gt;
** !np / !mpd / !radio / !radiolink&lt;br /&gt;
** mpd_plugin.service&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Spacejam_session&amp;diff=12825</id>
		<title>Spacejam session</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Spacejam_session&amp;diff=12825"/>
		<updated>2022-10-18T17:20:45Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Event&lt;br /&gt;
|Name=Spacejam session&lt;br /&gt;
|Date=2022/11/11&lt;br /&gt;
|DateEnd=2022/11/13&lt;br /&gt;
|Location=Zaal 1 NURDspace CS&lt;br /&gt;
|Contact=Eis-T&lt;br /&gt;
|Attendees=The_Niz; Eis-T&lt;br /&gt;
}}&lt;br /&gt;
[[File:jamsession nurdspace.png|400px]]&lt;br /&gt;
&lt;br /&gt;
This weekend is all about making music together! Bring your synths and lets patch things up. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This is what [[HAIrk]] thinks the weekend-long jam session will be like.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== The Plan: ==&lt;br /&gt;
* evacuate [[zaal 1]] so we have space to put our gear.&lt;br /&gt;
* hook everything up to together&lt;br /&gt;
* push buttons and twist knobs&lt;br /&gt;
* ?&lt;br /&gt;
* Profit&lt;br /&gt;
* Idea (The_Niz): Have each person use their own output in addition to mixing it all. This way it&#039;ll be more interesting for visitors walking around the space. Off course we will still sync our systems.&lt;br /&gt;
&lt;br /&gt;
==More Specific:==&lt;br /&gt;
* You can just join whenever suits you during the weekend.&lt;br /&gt;
* There is the intention to capture the good bits, built tracks out of it and release it as &amp;quot;Masters of Harkcore vol.1&amp;quot;&lt;br /&gt;
* Bring your musical friends&lt;br /&gt;
* Acoustic instruments are also welcome, mics and recording gear is available&lt;br /&gt;
&lt;br /&gt;
==Who brings what:==&lt;br /&gt;
* Behringer 2600 ([[Eis-T]])&lt;br /&gt;
* the [[SynthesEis-Ter]] ([[Eis-T]])&lt;br /&gt;
* Koma FX Field Kit ([[Eis-T]])&lt;br /&gt;
* Roland MC-808 Groovebox ([[Eis-T]]) &lt;br /&gt;
* Laptop with an outdated Ableton Live ([[Eis-T]])&lt;br /&gt;
* Eurorack (semi-)modular stuff ([[User:Dennis|The_Niz]])&lt;br /&gt;
* 16 channel mackie mixing desk (Michiel)&lt;br /&gt;
&lt;br /&gt;
== Attendees ==&lt;br /&gt;
&lt;br /&gt;
* The_Niz&lt;br /&gt;
* Eis-T&lt;br /&gt;
* Michiel(?)&lt;br /&gt;
* realitygaps&lt;br /&gt;
* Flok (possibly) and Bertrik then possibly as well (he&#039;s not aware of that yet)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Dustsensor&amp;diff=12819</id>
		<title>Dustsensor</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Dustsensor&amp;diff=12819"/>
		<updated>2022-10-15T12:18:50Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Dustsensor.jpg|640px]]&lt;br /&gt;
&lt;br /&gt;
Hangs in the smokeroom.&lt;br /&gt;
&lt;br /&gt;
measures pm2.5 and pm10&lt;br /&gt;
&lt;br /&gt;
it might be needed to replace the sensor - flok has a new one at home&lt;br /&gt;
&lt;br /&gt;
values can be seen in home assistant&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Dustsensor&amp;diff=12818</id>
		<title>Dustsensor</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Dustsensor&amp;diff=12818"/>
		<updated>2022-10-15T12:18:32Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Dustsensor.jpg|640px]]&lt;br /&gt;
&lt;br /&gt;
Hangs in the smokeroom.&lt;br /&gt;
&lt;br /&gt;
measures pm2.5 and pm10&lt;br /&gt;
&lt;br /&gt;
it might be needed to replace the sensor - flok has a new one at home&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Dustsensor&amp;diff=12817</id>
		<title>Dustsensor</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Dustsensor&amp;diff=12817"/>
		<updated>2022-10-15T12:18:10Z</updated>

		<summary type="html">&lt;p&gt;Flok: Created page with &amp;quot;File:Dustsensor.jpg  Hangs in the smokeroom.  measures pm2.5 and pm10  it might be needed to replace the sensor - flok has a new one at home&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Dustsensor.jpg]]&lt;br /&gt;
&lt;br /&gt;
Hangs in the smokeroom.&lt;br /&gt;
&lt;br /&gt;
measures pm2.5 and pm10&lt;br /&gt;
&lt;br /&gt;
it might be needed to replace the sensor - flok has a new one at home&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=File:Dustsensor.jpg&amp;diff=12816</id>
		<title>File:Dustsensor.jpg</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=File:Dustsensor.jpg&amp;diff=12816"/>
		<updated>2022-10-15T12:17:23Z</updated>

		<summary type="html">&lt;p&gt;Flok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12813</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12813"/>
		<updated>2022-10-10T14:28:39Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* user management */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* create an alias for a nick (...the hostname of a nick):&lt;br /&gt;
** merge newnick oldnick&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;!merge new-nick old-nick&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
=== spacesound ===&lt;br /&gt;
&lt;br /&gt;
* mpd_plugin.py&lt;br /&gt;
** !np / !mpd / !radio / !radiolink&lt;br /&gt;
** mpd_plugin.service&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12812</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12812"/>
		<updated>2022-10-10T14:27:59Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Feature Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;!merge new-nick old-nick&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
=== spacesound ===&lt;br /&gt;
&lt;br /&gt;
* mpd_plugin.py&lt;br /&gt;
** !np / !mpd / !radio / !radiolink&lt;br /&gt;
** mpd_plugin.service&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12811</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12811"/>
		<updated>2022-10-10T07:05:44Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* spacesound */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
=== spacesound ===&lt;br /&gt;
&lt;br /&gt;
* mpd_plugin.py&lt;br /&gt;
** !np / !mpd / !radio / !radiolink&lt;br /&gt;
** mpd_plugin.service&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12810</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12810"/>
		<updated>2022-10-10T07:05:12Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* nurdspace specific */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
=== spacesound ===&lt;br /&gt;
&lt;br /&gt;
* mpd_plugin.py&lt;br /&gt;
** !np / !mpd / !radio / !radiolink&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12809</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12809"/>
		<updated>2022-10-10T07:03:43Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Feature Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12808</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12808"/>
		<updated>2022-10-09T17:36:56Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Feature Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* [[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=GHBot&amp;diff=12807</id>
		<title>GHBot</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=GHBot&amp;diff=12807"/>
		<updated>2022-10-09T17:31:36Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* Feature Requests */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== An IRC bot ==&lt;br /&gt;
* Design by [[r3boot]]&lt;br /&gt;
** https://github.com/r3boot/jaken  =&amp;gt; note: since the original design some enhancements have been done&lt;br /&gt;
&lt;br /&gt;
* Implemented by [[Flok]]&lt;br /&gt;
** github: https://github.com/folkertvanheusden/GHBot&lt;br /&gt;
&lt;br /&gt;
** code examples for plugins:&lt;br /&gt;
*** Python: https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-python-example&lt;br /&gt;
*** Arduino (on ESP8266/ESP32): https://github.com/folkertvanheusden/nurdspace-ircbot-plugin-esp8266-example&lt;br /&gt;
*** Home Assistant integration (in Python): https://github.com/NURDspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
=== design (in short; see Jaken (r3boot) for full) ===&lt;br /&gt;
&lt;br /&gt;
GHBot listens on a few MQTT topics. Plugins can send commands to GHBot via those.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/bot/register&lt;br /&gt;
** value: cmd=...|descr=...|agrp=...|athr=...|loc=...&lt;br /&gt;
*** cmd=...   defines (one of) the command(s) this plugin listens to  (required)&lt;br /&gt;
*** descr=...  short description of what the cmd does. this is returned by &amp;quot;!help cmd&amp;quot;  (required)&lt;br /&gt;
*** agrp=...   ACL group required for this command  (optional, default is access for everyone)&lt;br /&gt;
*** athr=...   author (optional)&lt;br /&gt;
*** loc=...  where it lives (optional), for when e.g. the plugin is running on an arduino somewhere hidden&lt;br /&gt;
** you should send this every 5 seconds or a command will disappear automatically&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc/&#039;&#039;&#039;channel&#039;&#039;&#039;/privmsg&lt;br /&gt;
** value: text to publish to &#039;&#039;&#039;channel&#039;&#039;&#039; - note that the &#039;#&#039; in the channel name must be omitted&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/to/irc-person/&#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
** value: text to send to the person &#039;&#039;&#039;nick&#039;&#039;&#039; in a PM&lt;br /&gt;
&lt;br /&gt;
GHBot also sends everything it receives via IRC to MQTT topics, for the plugins to be processed.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/command&lt;br /&gt;
** value: register  - asks all plugins to immediately register all the commands it knows (see above)&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/bot/parameter/prefix&lt;br /&gt;
** value: command-prefix (e.g. &#039;!&#039; or &#039;#&#039; etc) this command asks plugins to respond to commands prefixed by this prefix.&lt;br /&gt;
&lt;br /&gt;
* topic: GHBot/from/irc/   - please see r3boot&#039;s documentation&lt;br /&gt;
&lt;br /&gt;
=== user management ===&lt;br /&gt;
&lt;br /&gt;
* add a user:&lt;br /&gt;
** addacl user &#039;&#039;&#039;nick&#039;&#039;&#039; group &#039;&#039;&#039;groupname&#039;&#039;&#039;&lt;br /&gt;
*** nick is the nickname of the user, ghbot will lookup the full name etc of the user by itself&lt;br /&gt;
*** group is currently either members or sysops but you can create new groups easily (by either defining them in a plugin or using addacl group, see below)&lt;br /&gt;
&lt;br /&gt;
* create a new group:&lt;br /&gt;
** addadcl group &#039;&#039;&#039;groupname&#039;&#039;&#039; cmd &#039;&#039;&#039;command&#039;&#039;&#039;&lt;br /&gt;
*** groupname is the new group, command is the (existing) command that you want to put in the new group&lt;br /&gt;
&lt;br /&gt;
* delete a group:&lt;br /&gt;
** delacl &lt;br /&gt;
&lt;br /&gt;
* get a list of groups a user is in:&lt;br /&gt;
** listacls &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* connect a nick to a new hostname:&lt;br /&gt;
** meet &#039;&#039;&#039;nick&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== local(!) plugins (non-mqtt) ===&lt;br /&gt;
&lt;br /&gt;
* listlp - list the available plugins&lt;br /&gt;
* showlp x - list the commands in plugin &#039;x&#039;&lt;br /&gt;
* loadlp - load any new plugins (without restarting ghbot)&lt;br /&gt;
* reloadlp - reload an already loaded plugin&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== aliasses / defines ===&lt;br /&gt;
&lt;br /&gt;
* aliasses are for commands, defines are &amp;quot;new commands&amp;quot;&lt;br /&gt;
&lt;br /&gt;
** alias &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;old_command_name&#039;&#039;&#039;&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** define &#039;&#039;&#039;new_command_name&#039;&#039;&#039; &#039;&#039;&#039;command definition&#039;&#039;&#039;&lt;br /&gt;
*** escapes:&lt;br /&gt;
**** %q command parameter&lt;br /&gt;
**** %u user invoking the command&lt;br /&gt;
**** %m like &#039;/me&#039;&lt;br /&gt;
**** %n post as a notice&lt;br /&gt;
*** returns a number with which you can delete the alias&lt;br /&gt;
&lt;br /&gt;
** deldefine &#039;&#039;&#039;number&#039;&#039;&#039;&lt;br /&gt;
*** delete an alias or define&lt;br /&gt;
&lt;br /&gt;
== TO DO ==&lt;br /&gt;
&lt;br /&gt;
priority: [[ghbot priority]]&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;!allot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!badum - for terrible jokes&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!bclabel - Prints [[Bookcrossing]] labels @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!label - Prints labels with free text @ [[Labelprinter]] @ [[SlabPi]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!janee - response in the affirmative or negatory sense to inquiries&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!events - show upcoming nurdspace events&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!learn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!mpdtube - Sends search query or url to [[MPDTube]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot - shows OpenTherm data from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ot-set - Updates OpenTherm thermostat setpoint through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensors - Queries sensors from [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* !speak / !spreek / !dire / !sprech / !habla - Text to speach using espeak on &amp;lt;s&amp;gt;[[SlabPi]]&amp;lt;/s&amp;gt;Spacesound (different languages yay \o/) (Deligated to Melan)&lt;br /&gt;
* !statustoggle - (temp) manually switch the space from closed to open&lt;br /&gt;
* &amp;lt;s&amp;gt;!sth - temps and humidities of the different rooms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!ticker sends text to [[Led ticker]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle - toggles switches (Sonoff, epc, pdu) through [[Jarvis|Home assistant]]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!toggle-list - shows a list of IDs that !toggle can use&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!wau-temp - Read the external temperature from the WUR sensors&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wikipedia - customised from the basic version&lt;br /&gt;
* &amp;lt;s&amp;gt;!who - Checks which known devices are connected to the Wifi (if you want to be on here, see [[Jarvis#Enable_tracking_for_your_MAC_address]])&amp;lt;/s&amp;gt;&lt;br /&gt;
* !wol - Performs wake-on-lan actions for machines in the space&lt;br /&gt;
* &amp;lt;s&amp;gt;!power - Current power consumption&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!sensor - Read sensors from hass&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;topic&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;join to multiple channels&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;configurable via configuration file&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!qs !quote-search&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;!regen !sun !moon (met die laatste twee ook &#039;volgende X (volle maan/zonsopgang/zonsondergang) &#039; en &#039;huidige X (maanstand, zon elivatie (is al?) en, vorige x (volle maan/zonsopgang/ondergang)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;Make internal states accessible over mqtt (Plugins plugins loaded)&amp;lt;/s&amp;gt; -- see next item:&lt;br /&gt;
* &amp;lt;s&amp;gt;Have plugins being able to report author and location for easier keeping track (Melan: My idea is to make a plugin that can make a page that can output all commands + help etc to a markdown on request)&amp;lt;/s&amp;gt; -- finished altough the layout may be pimped a bit&lt;br /&gt;
* &amp;lt;s&amp;gt;!seen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;remove the silly http-implementation and/or add an http-api that allows to retrieve the plugin-state as a json-blob&lt;br /&gt;
** also post-to-channel api&amp;lt;/s&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Feature Requests ===&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] Make alias legible (like !moon 62 is aliased to .... !nowaytoknownow)&amp;lt;/s&amp;gt;&lt;br /&gt;
** !viewalias&lt;br /&gt;
* [[User:buZz|buZz]] Autodescribing help for plugins&lt;br /&gt;
* [[User:buZz|buZz]] give !at a offset , so &#039;!at +5 oven!&#039; works to set a timer in 5 minutes , maybe +1h for 1 hour (its never seconds)&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:buZz|buZz]] add highlight of nickname to reminder notification&amp;lt;/s&amp;gt; now does so!&lt;br /&gt;
* [[User:buZz|buZz]] give a error msg on unknown -anything- in PM , instead of silence (like on channel)&lt;br /&gt;
* [[User:buZz|buZz]] allow a group be a group member for ACL , so we can make a &#039;SD&#039; group, and make &#039;members&#039; a member of it&lt;br /&gt;
* [[User:buZz|buZz]] add !np -v or something else that can show the album of the current playing song&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van plugins die herschreven moeten worden naar de nieuwe plugin structuur&amp;lt;/s&amp;gt;&lt;br /&gt;
** zie hierboven&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] RSS feeds beperken tot nurdspace resources, of verplaatsen naar #nurds-feeds kanaal oid&amp;lt;/s&amp;gt;&lt;br /&gt;
** feeds verwijderd :-)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Plugin output prefixen met de naam v/d plugin zodat filtering voorspelbaar word.&amp;lt;/s&amp;gt;&lt;br /&gt;
** dit is iets wat de plugin zelf moet doen omdat de bot niet ziet wie de afzender is (die info zit niet in mqtt)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Overzicht van operaties die beheerders kunnen uitvoeren op de bot (ops documentatie)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] [[Parts|Partkeepr search]]&amp;lt;/s&amp;gt;&lt;br /&gt;
** done&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !btc in Eu ipv die nare dollah units&amp;lt;/s&amp;gt;&lt;br /&gt;
** ik heb geen conversie dingetje naar euro, suggesties welkom though&lt;br /&gt;
* &amp;lt;s&amp;gt;iets met dat je kunt configureren of iets een PRIVMSG of dat het een NOTICE is - hoewel kan een plugin dat niet al?&amp;lt;/s&amp;gt;&lt;br /&gt;
** to/irc/(channel)/notice&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Zarya|zarya]] please make !koffie &amp;lt;nick&amp;gt; give koffie to that nick and not the one typing !koffie unless no parm is given&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] !@ voor (youtube) URL titel spam&amp;lt;/s&amp;gt;&lt;br /&gt;
** gedaan&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:R3boot|r3boot]] Apply acceptable regex to incoming karma requests (eg: ^[a-zA-Z0-9_-]+{\+\+,--}$. This will prevent multikarma and calling the plugin multiple times.&amp;lt;/s&amp;gt;&lt;br /&gt;
** karma.py has been severly dumbed down and no longer performs multikarma etc.&lt;br /&gt;
* &amp;lt;s&amp;gt;[[User:Dennis|The_Niz]] Keep track of commands that were once available in order to create an errormsg when the plugin is down&amp;lt;/s&amp;gt;&lt;br /&gt;
** implemented in 5db0f18ca20b3471b3a71686f949822434e64647&lt;br /&gt;
* &amp;lt;s&amp;gt;!message (zie kiki: !boodschap)&amp;lt;/s&amp;gt;&lt;br /&gt;
** added&lt;br /&gt;
* stock quotes, see https://github.com/jlyheden/stockbot&lt;br /&gt;
* !karma-whyup !karma-whoup !karma-whodown !karma-whydown !karma-top10 !karma-bottom10 !karma-stats&lt;br /&gt;
&lt;br /&gt;
== nurdspace specific ==&lt;br /&gt;
&lt;br /&gt;
* Runs on container named [[harkbot]]&lt;br /&gt;
&lt;br /&gt;
* hass plugin: https://github.com/nurdspace/ghbot-hass&lt;br /&gt;
&lt;br /&gt;
* the following services exist that need to be restarted after a change to the specific plugin (or just kill -9 them as systemd will restart them)&lt;br /&gt;
** udp-listener.service&lt;br /&gt;
*** hass messages&lt;br /&gt;
** topic.service&lt;br /&gt;
*** irc topic&lt;br /&gt;
** semwikievents.service&lt;br /&gt;
*** events added to the nurdspace wiki (!events)&lt;br /&gt;
** erratic.service&lt;br /&gt;
*** stats of the server&lt;br /&gt;
** seen.service&lt;br /&gt;
*** !seen &amp;lt;user&amp;gt;&lt;br /&gt;
** geiger.service&lt;br /&gt;
*** geigercounter statistics&lt;br /&gt;
** zorgverzekering.service&lt;br /&gt;
*** zorgverzekering / test / quit / choose / secondopinion / spacehex / wau-temp / allot / rijnstreek / janee / regen / !@&lt;br /&gt;
** wacalc.service&lt;br /&gt;
*** wolfram alpha&lt;br /&gt;
** net-tools.service&lt;br /&gt;
*** br0ken&lt;br /&gt;
** minecraft.service&lt;br /&gt;
*** see [[Minecraft]]&lt;br /&gt;
** learn.service&lt;br /&gt;
*** word?&lt;br /&gt;
** label.service&lt;br /&gt;
*** label printer&lt;br /&gt;
** message.service&lt;br /&gt;
*** send messages to (offline) users&lt;br /&gt;
** karma.service&lt;br /&gt;
** at.service&lt;br /&gt;
*** schedule messages&lt;br /&gt;
** quotes.service&lt;br /&gt;
** mpd-plugin.service&lt;br /&gt;
*** music services&lt;br /&gt;
** deurbel.service / deurbel-to-sqlite3.service&lt;br /&gt;
*** doorbell notification&lt;br /&gt;
** rss.service&lt;br /&gt;
*** checks for wiki changes, executes !speld&lt;br /&gt;
** btc.service&lt;br /&gt;
*** bitcoin status&lt;br /&gt;
** mp-service.service / mp.service&lt;br /&gt;
*** !mp / !mpstats / !mpdtoday&lt;br /&gt;
** wanneer.service&lt;br /&gt;
*** predictor&lt;br /&gt;
** GHBot.service&lt;br /&gt;
*** the main irc-bot itself&lt;br /&gt;
** hass-ghbot.service&lt;br /&gt;
*** hass-services: !sth / !octoprint / !ot / !ot-set / !sensor / !sun / !power / !toggle / !toggle-list / !who / !mpdtube / !ticker&lt;br /&gt;
** regex.service&lt;br /&gt;
*** s/bla/bli/&lt;br /&gt;
** partkeepr.service&lt;br /&gt;
*** search in the nurdspace partkeepr database&lt;br /&gt;
** nlenergie&lt;br /&gt;
*** show stofradar.nl energie statistics&lt;br /&gt;
** duckduckgo.service&lt;br /&gt;
** summon.service&lt;br /&gt;
*** [[summon]] a user via e-mail/xmpp&lt;br /&gt;
**** send an e-mail to flok@nurdspace.nl if you would like it if people could !summon you as well. for that an e-mail address AND/OR an xmpp/jabber address is required&lt;br /&gt;
&lt;br /&gt;
* coding example: /home/ghbot/nurdspace-ircbot-plugin-python-example/template.py on the harkbot lxc&lt;br /&gt;
&lt;br /&gt;
== logo ==&lt;br /&gt;
&lt;br /&gt;
[[File:Ghbot.png|640px]]&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Measuring_netfrequency&amp;diff=12805</id>
		<title>Measuring netfrequency</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Measuring_netfrequency&amp;diff=12805"/>
		<updated>2022-10-07T15:19:08Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* result */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* arduino, on pin 3 a 1kHz clock signal&lt;br /&gt;
** the 1kHz clock signal is derived from a 10MHz OXCO via a PIC12F675 which divides it by 10k (see http://www.leapsecond.com/pic/src/pd04.asm by Tom van Baak)&lt;br /&gt;
* the signal to measure is connected to pin A0 of the arduino&lt;br /&gt;
** initially this is a sine wave from a rigol dg1022 (without external dso connected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== first attempt ===&lt;br /&gt;
&lt;br /&gt;
* when an interrupt comes in via pin 3, a uS timestamp is taken (&#039;t0&#039;)&lt;br /&gt;
* everytime the sign of the signal changes (via A0), then a timestamp is taken and the timestamp t0 is subtracted&lt;br /&gt;
* also pin 8 is inverted (output pin)&lt;br /&gt;
&lt;br /&gt;
==== result ====&lt;br /&gt;
&lt;br /&gt;
* it works somewhat but there&#039;s an enormous drift according to the arduino output (the timestamp difference goes all over the place)&lt;br /&gt;
** the scope (hantek DSO-6022BL) says yellow is a fine 50Hz and blue 25Hz (as expected)&lt;br /&gt;
** strange!&lt;br /&gt;
*** no, not strange: for measuring how long it takes for the sine to start moving up again, the micros() arduino call is used; this uses some way of measuring time that is not very accurate and thus the drift&lt;br /&gt;
&lt;br /&gt;
[[File:50hztest001.png|640px]]&lt;br /&gt;
&lt;br /&gt;
* yellow is incoming 50Hz signal (CH1)&lt;br /&gt;
* blue is the toggle-pin (pin 8)  (CH2)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;when an ADC clock divider of 16 is taken, then the FFT of the pulses look(!) cleaner (when they distort...) than divider 32 or 128&amp;lt;/strike&amp;gt; (not in the long run)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Measuring_netfrequency&amp;diff=12804</id>
		<title>Measuring netfrequency</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Measuring_netfrequency&amp;diff=12804"/>
		<updated>2022-10-07T15:01:54Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* result */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* arduino, on pin 3 a 1kHz clock signal&lt;br /&gt;
** the 1kHz clock signal is derived from a 10MHz OXCO via a PIC12F675 which divides it by 10k (see http://www.leapsecond.com/pic/src/pd04.asm by Tom van Baak)&lt;br /&gt;
* the signal to measure is connected to pin A0 of the arduino&lt;br /&gt;
** initially this is a sine wave from a rigol dg1022 (without external dso connected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== first attempt ===&lt;br /&gt;
&lt;br /&gt;
* when an interrupt comes in via pin 3, a uS timestamp is taken (&#039;t0&#039;)&lt;br /&gt;
* everytime the sign of the signal changes (via A0), then a timestamp is taken and the timestamp t0 is subtracted&lt;br /&gt;
* also pin 8 is inverted (output pin)&lt;br /&gt;
&lt;br /&gt;
==== result ====&lt;br /&gt;
&lt;br /&gt;
* it works somewhat but there&#039;s an enormous lapse according to the arduino output (the timestamp difference goes all over the place)&lt;br /&gt;
** the scope (hantek DSO-6022BL) says yellow is a fine 50Hz and blue 25Hz (as expected)&lt;br /&gt;
** strange!&lt;br /&gt;
&lt;br /&gt;
[[File:50hztest001.png|640px]]&lt;br /&gt;
&lt;br /&gt;
* yellow is incoming 50Hz signal (CH1)&lt;br /&gt;
* blue is the toggle-pin (pin 8)  (CH2)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;when an ADC clock divider of 16 is taken, then the FFT of the pulses look(!) cleaner (when they distort...) than divider 32 or 128&amp;lt;/strike&amp;gt; (not in the long run)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=File:50hztest001.png&amp;diff=12803</id>
		<title>File:50hztest001.png</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=File:50hztest001.png&amp;diff=12803"/>
		<updated>2022-10-07T15:00:49Z</updated>

		<summary type="html">&lt;p&gt;Flok: Flok uploaded a new version of &amp;amp;quot;File:50hztest001.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Measuring_netfrequency&amp;diff=12802</id>
		<title>Measuring netfrequency</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Measuring_netfrequency&amp;diff=12802"/>
		<updated>2022-10-07T14:59:06Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* result */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* arduino, on pin 3 a 1kHz clock signal&lt;br /&gt;
** the 1kHz clock signal is derived from a 10MHz OXCO via a PIC12F675 which divides it by 10k (see http://www.leapsecond.com/pic/src/pd04.asm by Tom van Baak)&lt;br /&gt;
* the signal to measure is connected to pin A0 of the arduino&lt;br /&gt;
** initially this is a sine wave from a rigol dg1022 (without external dso connected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== first attempt ===&lt;br /&gt;
&lt;br /&gt;
* when an interrupt comes in via pin 3, a uS timestamp is taken (&#039;t0&#039;)&lt;br /&gt;
* everytime the sign of the signal changes (via A0), then a timestamp is taken and the timestamp t0 is subtracted&lt;br /&gt;
* also pin 8 is inverted (output pin)&lt;br /&gt;
&lt;br /&gt;
==== result ====&lt;br /&gt;
&lt;br /&gt;
* it works somewhat but there&#039;s an enormous lapse according to the arduino output (the timestamp difference goes all over the place)&lt;br /&gt;
** the scope (hantek DSO-6022BL) says yellow is a fine 50Hz and blue 25Hz (as expected)&lt;br /&gt;
** strange!&lt;br /&gt;
&lt;br /&gt;
[[File:50hztest001.png|640px]]&lt;br /&gt;
&lt;br /&gt;
* yellow is incoming 50Hz signal&lt;br /&gt;
* blue is the toggle-pin (pin 8)&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;strike&amp;gt;when an ADC clock divider of 16 is taken, then the FFT of the pulses look(!) cleaner (when they distort...) than divider 32 or 128&amp;lt;/strike&amp;gt; (not in the long run)&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
	<entry>
		<id>https://nurdspace.nl/index.php?title=Measuring_netfrequency&amp;diff=12801</id>
		<title>Measuring netfrequency</title>
		<link rel="alternate" type="text/html" href="https://nurdspace.nl/index.php?title=Measuring_netfrequency&amp;diff=12801"/>
		<updated>2022-10-07T14:56:04Z</updated>

		<summary type="html">&lt;p&gt;Flok: /* first attempt */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* arduino, on pin 3 a 1kHz clock signal&lt;br /&gt;
** the 1kHz clock signal is derived from a 10MHz OXCO via a PIC12F675 which divides it by 10k (see http://www.leapsecond.com/pic/src/pd04.asm by Tom van Baak)&lt;br /&gt;
* the signal to measure is connected to pin A0 of the arduino&lt;br /&gt;
** initially this is a sine wave from a rigol dg1022 (without external dso connected)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== first attempt ===&lt;br /&gt;
&lt;br /&gt;
* when an interrupt comes in via pin 3, a uS timestamp is taken (&#039;t0&#039;)&lt;br /&gt;
* everytime the sign of the signal changes (via A0), then a timestamp is taken and the timestamp t0 is subtracted&lt;br /&gt;
* also pin 8 is inverted (output pin)&lt;br /&gt;
&lt;br /&gt;
==== result ====&lt;br /&gt;
&lt;br /&gt;
* it works somewhat but there&#039;s an enormous lapse according to the arduino output (the timestamp difference goes all over the place)&lt;br /&gt;
** the scope (hantek DSO-6022BL) says yellow is a fine 50Hz and blue 25Hz (as expected)&lt;br /&gt;
** strange!&lt;br /&gt;
&lt;br /&gt;
[[File:50hztest001.png|640px]]&lt;br /&gt;
&lt;br /&gt;
* yellow is incoming 50Hz signal&lt;br /&gt;
* blue is the toggle-pin (pin 8)&lt;br /&gt;
&lt;br /&gt;
* when an ADC clock divider of 16 is taken, then the FFT of the pulses look(!) cleaner (when they distort...) than divider 32 or 128&lt;/div&gt;</summary>
		<author><name>Flok</name></author>
	</entry>
</feed>