Compare commits
507 Commits
2be07bba08
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| d85389e665 | |||
| 8c4dd8d44f | |||
| 79bd072f70 | |||
| 17178ee493 | |||
| 1e63e8f2cd | |||
| 03b53782f9 | |||
| fd5cce9e1c | |||
| 9a9b0c046a | |||
| 98bd715fa1 | |||
| eb3a28c77a | |||
| ecc74e8397 | |||
| 72c97a3ef1 | |||
| 2ed8e482d3 | |||
| 7f0e2ebdec | |||
| 41f5146561 | |||
| 7d6087c965 | |||
| 81d3856431 | |||
| bf8a073bb4 | |||
| 61eef31a51 | |||
| 5326068279 | |||
| 3649e83613 | |||
| f372e90047 | |||
| ff48cd52fb | |||
| 64cd939888 | |||
| 38e1288751 | |||
| 32a6748d07 | |||
| 36675b8d8e | |||
| 2d522956ba | |||
| 99c818c6a4 | |||
| 3e1912d806 | |||
| f06c53bf78 | |||
| 0816ca9812 | |||
| 596e3cc464 | |||
| 252f074609 | |||
| e84b20aa27 | |||
| e38f88c2a0 | |||
| e3784dd5b7 | |||
| f3ce0b776e | |||
| 6b64eedbba | |||
| 0b484884cb | |||
| f471b84dd9 | |||
| 406c584f43 | |||
| c8de8778c8 | |||
| 6cc66fa0d2 | |||
| 9604e030dd | |||
| 183bbfb780 | |||
| 56213ebc03 | |||
| c52d5ad275 | |||
| 6ed58ac405 | |||
| d00dbf6ec8 | |||
| 5c36f245a2 | |||
| e345105a84 | |||
| 6a5cdcf16d | |||
| 0ec01319c0 | |||
| 1978ec3fd6 | |||
| c1f23ebbee | |||
| 890da2c1b3 | |||
| 07c82eb8e1 | |||
| feec25f53d | |||
| abe581c4ea | |||
| 9e2c90640a | |||
| be693528a7 | |||
| 7f8f5a2da3 | |||
| c35c1ea6d8 | |||
| f512538d1c | |||
| a11f21c47c | |||
| 07030ed2db | |||
| 08b60d6624 | |||
| b3dd72cabc | |||
| 28b83c5376 | |||
| 058639deb9 | |||
| 784d123a56 | |||
| 0e8ddb88e9 | |||
| 1a18961362 | |||
| 00c0b23494 | |||
| c9bd862714 | |||
| 9a553f212d | |||
| fb5fbd1b8f | |||
| c593afc45c | |||
| 129419c80f | |||
| 0f34d291d7 | |||
| 6eb6dc45e6 | |||
| 05a4d92ebc | |||
| 469e33ce8d | |||
| 9905da3348 | |||
| f778c0ac3f | |||
| cc40baf361 | |||
| 64448e968f | |||
| d375c4e727 | |||
| f24a981abc | |||
| 5daa1a8b99 | |||
| 4bd90d629d | |||
| f23d5ea867 | |||
| ef1eb74abf | |||
| b41b60600a | |||
| 30c91c76c1 | |||
| caf697a0dd | |||
| df951f2935 | |||
| c67f93701b | |||
| 13fb5ac142 | |||
| 83b9176d32 | |||
| a440821bee | |||
| 12129babf3 | |||
| 1f324f5436 | |||
| 471e7e4f71 | |||
| a20a4bbabb | |||
| 949b3d8394 | |||
| 4c9fe53a2b | |||
| 2004e44cdd | |||
| 0fa770e241 | |||
| 6875016aa2 | |||
| 1314ac8ffe | |||
| 10265791c7 | |||
| 6082e8e597 | |||
| fd17aadad8 | |||
| e38d2bb5bf | |||
| 40320f5e5e | |||
| f02ee1f01d | |||
| 3e739d1f11 | |||
| 8a40517522 | |||
| 13a68dce87 | |||
| c65c285d36 | |||
| a3a656480b | |||
| e9f57b4ead | |||
| d5aad5e81e | |||
| ce54ddabc5 | |||
| 49f82b6028 | |||
| a6360d67ea | |||
| 041f3c58ff | |||
| 81a200f854 | |||
| 1a4594ef26 | |||
| bbd115c1d2 | |||
| a9d3a9359c | |||
| abdf822d0e | |||
| 33b2cdf9eb | |||
| 0199c99e85 | |||
| 12cb5d1430 | |||
| f4dc9c9472 | |||
| bafb8a417a | |||
| 9aff5df23f | |||
| fe3d15ced0 | |||
| bae7f19995 | |||
| bacea4f1f2 | |||
| 9f9ab366ec | |||
| cfa3c97da8 | |||
| 00332dfdcd | |||
| c6ccc19db7 | |||
| a9ddbbbc03 | |||
| 7fb8c45450 | |||
| 3c52fce025 | |||
| d928c1e231 | |||
| 91a9d6cd33 | |||
| f6c651f1ae | |||
| 80b1d04715 | |||
| 310171243c | |||
| 70b21a7c40 | |||
| dfc9aefc6d | |||
| d8823fd71e | |||
| 4b5940a85e | |||
| 4daf92ea49 | |||
| 75265214a0 | |||
| c561702dcb | |||
| e11b591275 | |||
| 3ac7b09bd9 | |||
| 21c5ddd2c9 | |||
| 20869b0b3b | |||
| c5e9802f3f | |||
| 0125278fe2 | |||
| f179b7f4ef | |||
| c7847e1766 | |||
| 4d87269f5b | |||
| 7d54463e2e | |||
| 1136df09e6 | |||
| a0720bbc23 | |||
| a698b7cc43 | |||
| 59db29a027 | |||
| ee910a5613 | |||
| 7d9f62cd2c | |||
| 1ff58af20d | |||
| 467fa6d79b | |||
| 2be12a1d9e | |||
| 380ed2a700 | |||
| 66e0cac992 | |||
| 79ca7531a2 | |||
| 87716e14d1 | |||
| 259bdb5096 | |||
| e652eed0f9 | |||
| 1e6916a1bd | |||
| 0c4551d62e | |||
| 4e20881af7 | |||
| 78c2b8a856 | |||
| e61edbb9a8 | |||
| 308628fda0 | |||
| 378fa1cccf | |||
| a23823e833 | |||
| 62ee9db379 | |||
| 095ded0105 | |||
| 2235a06b45 | |||
| 57d8072443 | |||
| f6cfaacdff | |||
| c542bde570 | |||
| fd6976b774 | |||
| 35f7cb6b28 | |||
| 758771ceb5 | |||
| aea3b82567 | |||
| b258459e7e | |||
| 9c54fc7858 | |||
| b0eacd26ae | |||
| f1c388ce4f | |||
| 203bef54b4 | |||
| 9037f28129 | |||
| 67bbe1e7f0 | |||
| 2ce6131f9c | |||
| 3b53d6d530 | |||
| 88c8a8c910 | |||
| e02a89e3ac | |||
| 4eb70ad753 | |||
| c3b183f62c | |||
| 3c08914fce | |||
| a7e13b1fa7 | |||
| 9a2656a528 | |||
| 230c35ea7a | |||
| d74f4d470a | |||
| b7dca27b08 | |||
| 55002d44a5 | |||
| 1e3966b024 | |||
| 200d778033 | |||
| 46570a9ef1 | |||
| df5e888169 | |||
| 082b175859 | |||
| 1c617e00c7 | |||
| a851889357 | |||
| 958b1cf8d8 | |||
| 9c5799d974 | |||
| 23774c205c | |||
| 197febbd19 | |||
| e81a066d0a | |||
| 03146d726d | |||
| 04044c0dbf | |||
| 3fadc9db48 | |||
| f75396af37 | |||
| 81130e27e4 | |||
| 471b20d684 | |||
| 25dd6efdae | |||
| ce089e4c23 | |||
| abc2505c8a | |||
| cf73e1eac7 | |||
| c53973e6d4 | |||
| 3a71b81659 | |||
| d881570e68 | |||
| e367122b4c | |||
| 50cd3e7720 | |||
| c3aa6cd039 | |||
| 31145f28a2 | |||
| 0655c04edc | |||
| df89498468 | |||
| 35e75db83c | |||
| d43fd79904 | |||
| d26d538bf3 | |||
| 6104c51315 | |||
| 5e7584afc5 | |||
| 30346968a2 | |||
| e0a3976ba4 | |||
| f46ce328fc | |||
| ee7ccd84bf | |||
| 3d1bc3fc3b | |||
| 74e15af983 | |||
| a36e3c0598 | |||
| ff11d60b3c | |||
| e652665f10 | |||
| cb1c0783e3 | |||
| a9e416eb5d | |||
| 97ab4cb6e9 | |||
| 3de01cbd7d | |||
| faca78ad43 | |||
| 4be3dad41f | |||
| 4080a5e4ba | |||
| 9fb23bf9f6 | |||
| 1b3907a76c | |||
| b1e0835f80 | |||
| ffc8a7b2ec | |||
| baf3502da6 | |||
| c3423f05c0 | |||
| b9021b0c7c | |||
| e3040dfb39 | |||
| 0603532f1a | |||
| 7dafefa7df | |||
| e2558c4969 | |||
| d8094d7399 | |||
| 2b025c7e31 | |||
| 16a4d05d18 | |||
| 9b1704d286 | |||
| affd49b64d | |||
| dd6b371ed4 | |||
| d694b80e61 | |||
| f42dac1b67 | |||
| 3bf3d2b29f | |||
| f9014afc53 | |||
| 3e8831d1e5 | |||
| 02c300acf9 | |||
| d053fa00d7 | |||
| 3df590a091 | |||
| e464c70add | |||
| e34319af39 | |||
| d497851130 | |||
| 964c392a08 | |||
| dc7fe2cb81 | |||
| 5f311062af | |||
| 844f729aaa | |||
| e3d2e5ab80 | |||
| 7fc5f386bd | |||
| 887b6daf4e | |||
| 847b6ac976 | |||
| 6b6e0e5964 | |||
| c5be9b3bf6 | |||
| 4723efd76d | |||
| f446c9472c | |||
| 30f50fa51e | |||
| c0a5277c92 | |||
| c52b25ab66 | |||
| 75b3c89637 | |||
| 014fba5e8e | |||
| ad43b8ea5e | |||
| 2919ae9fc8 | |||
| fea3f35b7c | |||
| e2c285214f | |||
| 4aa400150f | |||
| e0e9452f52 | |||
| 1578330e03 | |||
| abe46ab2cc | |||
| 86309fcabf | |||
| b28ddddb32 | |||
| 1469e60431 | |||
| 89ddd8faa7 | |||
| 82af26a4ee | |||
| 8c2201842d | |||
| 1e536ee7b7 | |||
| e21054af0d | |||
| d43022bb97 | |||
| 878835541b | |||
| afd22fa37d | |||
| 2602266ef9 | |||
| 6644e43f71 | |||
| 7eafdcd7bc | |||
| 3c8c78d5ea | |||
| a94bffb828 | |||
| 0078a8ae6b | |||
| eaf2d10835 | |||
| bccd0784f5 | |||
| 7a6bd3dc95 | |||
| c202978f30 | |||
| c65140d806 | |||
| 5321590b65 | |||
| 64f08874a6 | |||
| 47057c13d9 | |||
| 113005956e | |||
| bf8e829b7c | |||
| ca0b6a4954 | |||
| 4c40efd558 | |||
| 6a96dc4c3d | |||
| 4836b7aac6 | |||
| 347dce150b | |||
| bbff0dbf3c | |||
| 9f823cc0d7 | |||
| 5ead30a10a | |||
| 274ba4c343 | |||
| 9cd2f785b3 | |||
| 0debca778c | |||
| b53d4efbf8 | |||
| ed7dd076ef | |||
| 7c81cf4cb5 | |||
| ab2728af93 | |||
| 92eb20f379 | |||
| 7c3fd4223f | |||
| 3f65ce2722 | |||
| 5234c85738 | |||
| 9a0596b82b | |||
| a76be10244 | |||
| bfa118b054 | |||
| aff40ed4df | |||
| 287b7724d6 | |||
| 8bd47ad43e | |||
| 10af4daec4 | |||
| 75c24f8e70 | |||
| 0834117b2c | |||
| 1fad2274c8 | |||
| 52edd162df | |||
| 68df97a7b2 | |||
| 949edba9f8 | |||
| 8a35dd29e2 | |||
| 19eb0c1d8d | |||
| 07d764986c | |||
| d68bc289a3 | |||
| 5c2531a788 | |||
| e60547d354 | |||
| 28097bac2a | |||
| d8d7d4bb9e | |||
| d6f67482a6 | |||
| e7a851561f | |||
| d8adeceb6c | |||
| 2e33762646 | |||
| 6ae88340ba | |||
| 93c5d606a3 | |||
| f577490146 | |||
| b5d24f2b29 | |||
| 16fbc850d4 | |||
| 49a8b57333 | |||
| f9fda430fe | |||
| 4b6f835aad | |||
| af3e1aa4c9 | |||
| 8df9710a6e | |||
| ce2b78b7c6 | |||
| 264ee06eef | |||
| 1285534f12 | |||
| 750ed0f81b | |||
| a253b240a8 | |||
| 4b66787196 | |||
| bab65f8e27 | |||
| 261e881c9d | |||
| 058205ef40 | |||
| 9f350d22e6 | |||
| d1e4d1013d | |||
| 7afaace194 | |||
| dc211e1a69 | |||
| 84cfdc4e9f | |||
| 28d66e0500 | |||
| 5a2e760b77 | |||
| e65fce988e | |||
| 433f3fc756 | |||
| 86de7a217e | |||
| 324ea34a3b | |||
| 4ba670c20d | |||
| e76e1a3aa6 | |||
| 1fcc3f9665 | |||
| 6e140e85e7 | |||
| bfc7b5ad0a | |||
| ad612fc959 | |||
| 3bc572f11f | |||
| 899f939139 | |||
| 706bdb43ab | |||
| ca92978b01 | |||
| c3dad5f4d8 | |||
| 44c22299ad | |||
| 73505e6193 | |||
| ac25d80af5 | |||
| 32ca831510 | |||
| f7782901e1 | |||
| e7db5c4b7f | |||
| 8b9fc6cfdf | |||
| bff5c2ce55 | |||
| 1c4cd65e55 | |||
| fc51391436 | |||
| a599a55494 | |||
| e4e76c706e | |||
| 2160c50849 | |||
| 5509a12775 | |||
| 3bf764380b | |||
| 81e56562c0 | |||
| 0fd1784ab3 | |||
| ead3c0538a | |||
| bb233b5b0f | |||
| 90e9c8e327 | |||
| 08b49ebff1 | |||
| e90601627b | |||
| 107dfc4867 | |||
| d707d22fd6 | |||
| 5e1838c566 | |||
| a9ed2d1395 | |||
| f6ccec3ef8 | |||
| 550d5527c6 | |||
| 894f7f6648 | |||
| 4b953b203c | |||
| 20bbb3dd04 | |||
| a2181cfbfb | |||
| ae54d96861 | |||
| dddb92e167 | |||
| 7c0b537fc6 | |||
| 169fcc9d8d | |||
| 6935d8f1e6 | |||
| 6e18b04bb1 | |||
| 9ae6041d83 | |||
| 68dbd34d8a | |||
| ae1c9f39cb | |||
| 4096b292e7 | |||
| 3512688600 | |||
| e5a6e894c0 | |||
| 76140045de | |||
| 882eca833d | |||
| 9e1a2af4de | |||
| 5345d505dc | |||
| 2146d4e6b9 | |||
| 02b5435073 | |||
| f749538847 | |||
| cb21016a8f | |||
| 84a7d9add7 | |||
| 8ae1cd0026 | |||
| 1190a989d8 | |||
| bbf3a21c9d | |||
| a8492d680b | |||
| f24f7fe9bc | |||
| f44effb506 | |||
| 4bdea49dfc | |||
| dcaf537569 | |||
| f55df8e205 | |||
| 95a5ec61a4 | |||
| 952234a4aa | |||
| a18075851e |
22
.drone.yml
22
.drone.yml
@@ -2,18 +2,40 @@
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: build
|
||||
|
||||
clone:
|
||||
depth: 0
|
||||
|
||||
steps:
|
||||
- name: clean-language-blocks
|
||||
image: python:3.11
|
||||
commands:
|
||||
- pip install -U pip
|
||||
- pip install pyyaml
|
||||
- python clean_language_blocks.py
|
||||
- mkdir -p docs/assets docs/overrides docs/stylesheets
|
||||
- cp -r docs_en/assets docs/assets || true
|
||||
- cp -r docs_en/overrides docs/overrides || true
|
||||
- cp -r docs_en/stylesheets docs/stylesheets || true
|
||||
|
||||
- name: build
|
||||
image: squidfunk/mkdocs-material:7.1.9
|
||||
volumes:
|
||||
- name: site
|
||||
path: /site
|
||||
- name: docs
|
||||
path: /docs
|
||||
commands:
|
||||
- pip install -U -r ./requirements.txt
|
||||
- mkdocs build
|
||||
- cp -r site/ /site
|
||||
- chmod -R 777 /site
|
||||
- cp -r docs /docs
|
||||
|
||||
volumes:
|
||||
- name: site
|
||||
host:
|
||||
path: /root/sa6anw
|
||||
- name: docs
|
||||
host:
|
||||
path: /root/sa6anw
|
||||
15
.pages
Normal file
15
.pages
Normal file
@@ -0,0 +1,15 @@
|
||||
title: SA6ANW
|
||||
nav:
|
||||
- Start: index.md
|
||||
- HF: hf.md
|
||||
- VHF/UHF DMR: vhfuhfdmr.md
|
||||
- Satellite: satellite.md
|
||||
- Portabel: portable.md
|
||||
- AREDN: aredn.md
|
||||
- MESHTASTIC: meshtastic.md
|
||||
- Midsomer Murders: midsomer.md
|
||||
- Services:
|
||||
- Home Lab: homelab.md
|
||||
- Caddy: caddy.md
|
||||
- sa6anw.se: sa6anwse.md
|
||||
- Smokeping: smokeping.md
|
||||
47
clean_language_blocks.py
Normal file
47
clean_language_blocks.py
Normal file
@@ -0,0 +1,47 @@
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
|
||||
SOURCE_DIR = "docs"
|
||||
ENGLISH_DIR = "docs/en"
|
||||
|
||||
# Rensa tidigare engelska mappar
|
||||
if os.path.exists(ENGLISH_DIR):
|
||||
shutil.rmtree(ENGLISH_DIR)
|
||||
shutil.copytree(SOURCE_DIR, ENGLISH_DIR)
|
||||
|
||||
# --- Inline-hantering ---
|
||||
def remove_other_language_inline(content, keep_lang):
|
||||
def replacer(match):
|
||||
lang, text = match.group(1), match.group(2)
|
||||
return text if lang == keep_lang else ""
|
||||
return re.sub(r"\{(sv|en):(.*?)}", replacer, content)
|
||||
|
||||
# --- Block-hantering ---
|
||||
def remove_other_language_blocks(content, keep_lang):
|
||||
content = re.sub(
|
||||
r":(sv|en)\n(.*?)\n:::",
|
||||
lambda m: m.group(2) if m.group(1) == keep_lang else "",
|
||||
content,
|
||||
flags=re.DOTALL
|
||||
)
|
||||
return content
|
||||
|
||||
# --- Kombinerad rengöring ---
|
||||
def clean_file(path, keep_lang):
|
||||
with open(path, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
content = remove_other_language_blocks(content, keep_lang)
|
||||
content = remove_other_language_inline(content, keep_lang)
|
||||
with open(path, "w", encoding="utf-8") as f:
|
||||
f.write(content.strip() + "\n")
|
||||
|
||||
# --- Rensa svenska filer ---
|
||||
for filename in os.listdir(SOURCE_DIR):
|
||||
if filename.endswith(".md"):
|
||||
clean_file(os.path.join(SOURCE_DIR, filename), keep_lang="sv")
|
||||
|
||||
# --- Rensa engelska filer ---
|
||||
for filename in os.listdir(ENGLISH_DIR):
|
||||
if filename.endswith(".md"):
|
||||
clean_file(os.path.join(ENGLISH_DIR, filename), keep_lang="en")
|
||||
18
docs/Projects.md
Normal file
18
docs/Projects.md
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
title: Projects
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
_______ _______ ______ _____ ________ ______ ________ ______
|
||||
|\ _____\ |\ _____\ /\ ____\ |\ ___\ |\ ______\ /\ ____\ |\ ______\ /\ ____\
|
||||
| $$$$$$$\ | $$$$$$$\ |\ $$$$$$\ \$$$$$ | $$$$$$$$ |\ $$$$$$\ \$$$$$$$$ |\ $$$$$$\
|
||||
| $$__/\$$ | $$__| $$ | $$ | $$ | $$ | $$__ | $$ \$$ | $$ | $$___\$$
|
||||
| $$ __\$$ | $$ \$$ | $$ | $$ __ | $$ | $$__\ | $$ | $$ \$$ ___\
|
||||
| $$$$$$$ | $$$$$$$\ | $$ | $$ |\_\ | $$ | $$$$$ | $$ __ | $$ _\$$$$$$\
|
||||
| $$ | $$ | $$ | $$__/\$$ | $$__| $$ | $$_____ | $$__/\ \ | $$ |\_\__| $$
|
||||
| $$ | $$ | $$ \$$__\ $$ \$$ __\$$ | $$ ____\ \$$__\ $$ | $$ \$$ __\$$
|
||||
\$$ \$$ \$$ \$$$$$$ \$$$$$$ \$$$$$$$$ \$$$$$$ \$$ \$$$$$$
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
108
docs/aredn.md
Normal file
108
docs/aredn.md
Normal file
@@ -0,0 +1,108 @@
|
||||
---
|
||||
title: AREDN
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
______ _______ ________ _______ __ __
|
||||
/\ ____\ |\ _____\ |\ ______\ |\ _____\ |\_\ |\_\
|
||||
|\ XXXXXX\ | XXXXXXX\ | XXXXXXXX | XXXXXXX\ | XX\ | XX
|
||||
| XX__| XX | XX__| XX | XX__ | XX | XX | XXX\| XX
|
||||
| XX __\XX | XX __\XX | XX _\ | XX | XX | XXXX\ XX
|
||||
| XXXXXXXX | XXXXXXX\ | XXXXX | XX | XX | XX\XX XX
|
||||
| XX | XX | XX | XX | XX_____ | XX__/\XX | XX \XXXX
|
||||
| XX | XX | XX | XX | XX ____\ | XX _\ XX | XX \XXX
|
||||
\XX \XX \XX \XX \XXXXXXXX \XXXXXXX \XX \XX
|
||||
|
||||
SA6ANW 20240104
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
**Amateur Radio Emergency Data Network**
|
||||
:sv
|
||||
AREDN handlar om att bygga en till sammhället parallell nätinfrastruktur. AREDN bygger på relativt billg utrustning tillverkad för att leverera Internet via WIFI till företag och hushåll aka. WISP. Dessa "antenner" består av en dator, radiodel och en antenn. Byter man firmware så har man helt plötsligt en amatörradiostation för 5GHz som kan överföra data. Överföringen funkar över långa avstånd så länge det är fri sikt mellan antennerna. Själv har jag kört 19Mbit över 12km med väldigt knappa och temporära lösningar. Lägger man lite mer tid på montering och riktning av antennerna kan man säkerligen nå högre hastigheter.
|
||||
|
||||
Jag tillämpar AREDN för att leverera internetuppkoppling till min DMR hotspot monterad på en lantbrukssilo i utkanten av byn ca 300m från mitt QTH. På silon har jag även en extra antenn för att kunna länka från en mobil node. Den är nu riktad mot Missveden där SK6MA brukar ha fielddays.
|
||||
|
||||
Systemet installerades sommaren 2022 så det är dags för en uppdatering. Minst firmware borde uppgraders men kanske även antennen på silon.<br> Aktuell version är 3.22.1.0
|
||||
:::
|
||||
|
||||
:en
|
||||
AREDN is about building a parallel network infrastructure. AREDN is based on relatively inexpensive equipment originally designed to deliver internet over Wi-Fi to homes and businesses — also known as WISP gear. These “antennas” consist of a computer, radio section, and antenna. By changing the firmware, you suddenly have an amateur radio station for 5 GHz capable of data transmission.
|
||||
|
||||
The system works over long distances as long as there’s a clear line of sight between antennas. I’ve personally achieved 19 Mbit over 12 km using very minimal and temporary setups. With better mounting and antenna alignment, even higher speeds are definitely possible.
|
||||
|
||||
I use AREDN to provide an internet connection to my DMR hotspot, which is mounted on a grain silo about 300 meters from my QTH on the edge of the village. On the silo, I also have an extra antenna aimed at Missveden, where SK6MA usually holds their field days — this allows linking from a mobile node.
|
||||
|
||||
The system was installed in the summer of 2022, so it’s due for an update. At the very least, the firmware should be upgraded, and possibly the antenna on the silo as well.<br> The current firmware version is 3.22.1.0.
|
||||
:::
|
||||
|
||||
{sv:**Systemskiss**}{en:**System Overview**}
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
\ | /
|
||||
\|/ Diamond X-50N
|
||||
|
|
||||
......:......
|
||||
: Pi-Star :
|
||||
SXTsq Lite5 : :...........: :
|
||||
: | :
|
||||
/ : \ | / : \
|
||||
+----|--o : o--|----+ | +----|--o : o--|----+
|
||||
| \ : / | | | \ : / |
|
||||
Outdoor | : | | | : | Top of mast
|
||||
- - - - - - -|- - - - - : | | | : - - - - -|- - - - - - -
|
||||
Indoor | : | | | : | Ground level
|
||||
......:...... : ..:...:...:.. : ......:......
|
||||
:hAP AC Lite: : :NanoSwitch : : : POE :
|
||||
:...........: : :...........: : :...........:
|
||||
| : | Top of silo : |
|
||||
| : - - - - - - -|- - - - - - - : ......:......
|
||||
___ | ___ : | Ground level : :Cell Phone :
|
||||
___/ \_/ \___ : ......:...... : :...........:
|
||||
/ \ / \ : : POE : :
|
||||
( Internet ) : :...........: :
|
||||
\___/ _ \___/ : :
|
||||
\___/ \___/ : :
|
||||
: :
|
||||
Home QTH : Silo site : Portable kit
|
||||
AREDN Setup SA6ANW 20240104
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
{sv:**Komponentbeskrivningar**}{en:**Component Descriptions**}
|
||||
|
||||
- **Home QTH**
|
||||
- **hAP AC Lite**<br>
|
||||
{sv:Denna lilla hemrouter från Mikrotik är den perfekta bryggan mellan AREDN och vanliga nätverk. Den har fem portar plus wifi. Den första porten är WAN som är kopplad till min firewall/router för att enheterna i AREDN-nätet ska komma åt Internet. Den kopplingen ger också möjligheten till VPN-tunlar in för andra radioamarörer eller mellan olika AREDN-nät. Port två till fyra är LAN. På dessa portar kan man koppla klienter till AREDN-nätet eller servrar för att leverera tjänster i Nätet. Själv kommer jag åt AREDN-nätet via WiFi. Den femte porten är DtD (Device to Device) och kan leverera Passive PoE. Det är via port fem jag kopplat in min utomhusantenn}{en:This small home router from MikroTik is the perfect bridge between AREDN and regular networks. It has five ports plus Wi-Fi. Port 1 is WAN, connected to my firewall/router to give devices on the AREDN network access to the internet. This connection also enables VPN tunnels for other radio amateurs or links between AREDN networks. Ports 2 to 4 are LAN. These can be used to connect clients to the AREDN network or servers to provide services within the mesh. I access the AREDN network myself via Wi-Fi. Port 5 is DtD (Device to Device) and can deliver Passive PoE. My outdoor antenna is connected via this port.}<br>
|
||||
[https://mikrotik.com/product/RB952Ui-5ac2nD](https://mikrotik.com/product/RB952Ui-5ac2nD)
|
||||
- **SXTsq Lite5**<br>
|
||||
{sv:Liten kompakt och billig utomhusenhet med integrerad antenn. Antennen har en gain på 16dBi och radiodelen har upp till 25dBm uteffekt. Den drivs via Passive PoE och drar max 6W.}{en:A small, compact, and affordable outdoor unit with an integrated antenna. The antenna has a gain of 16 dBi and the radio section outputs up to 25 dBm. It runs via Passive PoE and consumes a maximum of 6 W.}<br>
|
||||
[https://mikrotik.com/product/RBSXTsq5nD](https://mikrotik.com/product/RBSXTsq5nD)
|
||||
- **Silo Site**
|
||||
- **PoE injector**<br>
|
||||
{sv:Nere vid marken har jag en PoE injector och sen bara en utomhusklassad TP-kabel upp till toppen av silon. Den stora fördelen med detta är att jag kan koppla in en laptop eller liknande nere på marken för på så sätt komma åt prylarna i toppen av silon. Jag är inte jätte bekväm med att klättra upp i silon, går det undvika stannar jag gärna på marken.}{en:At the base of the silo, I have a PoE injector and a single outdoor-rated Ethernet cable running up to the top. The big advantage here is that I can connect a laptop or similar device at ground level to access the devices on the silo, avoiding the need to climb — something I prefer not to do if I can help it.}
|
||||
- **NanoSwitch**<br>
|
||||
{sv:4-potars Passive PoE switch från Ubiquiti för utomhusbruk. Denna sitter i botten av masten i toppen av silon. Via en lång kabel ner till marken strömförsörjs switchen och alla enheter.}{en:A 4-port Passive PoE switch from Ubiquiti, designed for outdoor use. It's mounted at the base of the mast on top of the silo. A long cable supplies power from the ground to the switch and all connected devices.}<br>
|
||||
[https://store.ui.com/us/en/products/n-sw](https://store.ui.com/us/en/products/n-sw)
|
||||
- **2st SXTsq Lite5**<br>
|
||||
{sv:En riktad mot Home QTH och den andra är för tillfllet riktad mot Missveden utan för Hjo eller ca: 110°. planen är att byta ut den senare mot en rundstrålande antenn istället för att slippa rikta om i framtiden.}{en:One antenna is aimed at my Home QTH, and the other is currently pointed toward Missveden, just outside Hjo, approximately 110°. The plan is to replace the latter with an omnidirectional antenna to avoid future realignments.}<br>
|
||||
[https://mikrotik.com/product/RBSXTsq5nD](https://mikrotik.com/product/RBSXTsq5nD)
|
||||
- **Pi-Star**<br>
|
||||
{sv:En hotspot för DMR. Det är ett egeenbygge i väderskyddad kopplingslåda. Den består av en Raspberry Pi 3B som strömförsörjs via Passive PoE och en MMDVM-hat för UHF.}{en:A DMR hotspot. It’s a DIY build enclosed in a weather-protected junction box. The setup includes a Raspberry Pi 3B powered via Passive PoE, and an MMDVM hat for UHF.} <!-- Följ länken för en detaljerad beskrivning av bygget--><br>
|
||||
[https://www.pistar.uk/](https://www.pistar.uk/)
|
||||
- **Diamond X50N**
|
||||
{sv:Antennen till Pi-Star. Den har en 7.2dB i gain på 70cm bandet. Med denna lösning har jag DMR täckning i hela byn. Jag ska försöka mig på att skapa en täckningskarta i framtiden. Jag bör dock byta kabeln då den är onödigt lång och av låg kvalitet, det är bara 10mW ut från en MMDVM-hat.}{en:The antenna for the Pi-Star. It has a gain of 7.2 dB on the 70 cm band. With this setup, I have DMR coverage across the entire village. I plan to create a coverage map in the future. I should probably replace the coax — it's unnecessarily long and of poor quality, which matters when you’re only putting out 10 mW from an MMDVM hat.}<br>
|
||||
[https://www.diamond-ant.co.jp/english/amateur/antenna/ante_2base/ante_base3.html](https://www.diamond-ant.co.jp/english/amateur/antenna/ante_2base/ante_base3.html)
|
||||
- **Portable kit**
|
||||
- **PoE adapter**
|
||||
{sv:En powerbank med DC 12v ut och den lilla adaptern man får med när man köper en integrerad antenn från Mikrotik är det som behövs för att strömförsörja antennen. Där ifrån en TP-kabel till en SXTsq Lite5.}{en:A power bank with 12 V DC output, combined with the small adapter included with MikroTik’s integrated antennas, is all that's needed to power the antenna. From there, a short Ethernet cable runs to an SXTsq Lite5.}<br>
|
||||
- **Mast**
|
||||
{sv:Ett enkelt 8m galsfibermetspö. Jag använder inte den översta sektione så jag får inte upp antennen mer än ca: 6m. jag har 3d-printat ett enkelt fäste för att fästa antennen.}{en:A simple 8-meter fiberglass fishing pole. I don’t use the top section, so the antenna reaches about 6 meters. I’ve 3D-printed a basic mount to attach the antenna securely.}<br>
|
||||
- **SXTsq Lite5**
|
||||
{sv:Åter igen den billiga integrerade enheten.}{en:Once again, the affordable integrated unit from MikroTik.}<br>
|
||||
[https://mikrotik.com/product/RBSXTsq5nD](https://mikrotik.com/product/RBSXTsq5nD)
|
||||
- **Cell phone**
|
||||
{sv:Med en USB C-hub med ethernet jack kan jag komma åt AREDN-nätet. Perfekt för att testa utkanten av täckningsområdet eller prova lämpliga platser för länknoder.}{en:With a USB-C hub that includes an Ethernet jack, I can access the AREDN network directly from my phone. This is perfect for testing coverage boundaries or scouting locations for link nodes.}
|
||||
|
||||
BIN
docs/assets/Felix_i_Jannes_mast.webm
Normal file
BIN
docs/assets/Felix_i_Jannes_mast.webm
Normal file
Binary file not shown.
BIN
docs/assets/Felix_i_Jannes_mast_2.webm
Normal file
BIN
docs/assets/Felix_i_Jannes_mast_2.webm
Normal file
Binary file not shown.
BIN
docs/assets/Midsomer_Murders_logo.png
Normal file
BIN
docs/assets/Midsomer_Murders_logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
BIN
docs/assets/drone.webm
Normal file
BIN
docs/assets/drone.webm
Normal file
Binary file not shown.
BIN
docs/assets/logo.png
Normal file
BIN
docs/assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.3 KiB |
19
docs/caddy.md
Normal file
19
docs/caddy.md
Normal file
@@ -0,0 +1,19 @@
|
||||
---
|
||||
title: Caddy
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
______ ______ _______ _______ __ __
|
||||
/\ ____\ /\_____\ |\ _____\ |\ _____\ |\_\ /\_\
|
||||
|\ XXXXXX\ |\ XXXXXX\ | XXXXXXX\ | XXXXXXX\ \XX\ / XX
|
||||
| XX \XX | XX__| XX | XX | XX | XX | XX \XX\/ XX
|
||||
| XX | XX XX | XX | XX | XX | XX \XX XX
|
||||
| XX __ | XXXXXXXX | XX | XX | XX | XX \XXXX
|
||||
| XX__/\_\ | XX | XX | XX__/\XX | XX__/\XX | XX
|
||||
\XX _\ XX | XX | XX | XX _\ XX | XX _\ XX | XX
|
||||
\XXXXXX \XX \XX \XXXXXXX \XXXXXXX \XX
|
||||
|
||||
SA6ANW 20240105
|
||||
</div></code></pre>
|
||||
</div>
|
||||
67
docs/cloudlog.md
Normal file
67
docs/cloudlog.md
Normal file
@@ -0,0 +1,67 @@
|
||||
---
|
||||
title: Cloudlog
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
______ __ ______ __ __ _______ __ ______ ______
|
||||
/\_____\ |\_\ /\_____\ |\_\ |\_\ |\______\ |\_\ /\_____\ /\_____\
|
||||
|\ XXXXXX\ | XX |\ XXXXXX\ | XX | XX | XXXXXXX\ | XX |\ XXXXXX\ |\ XXXXXX\
|
||||
| XX \XX | XX | XX | XX | XX | XX | XX | XX | XX | XX | XX | XX __\XX
|
||||
| XX | XX | XX | XX | XX | XX | XX | XX | XX | XX | XX | XX|\ __\
|
||||
| XX __ | XX | XX | XX | XX | XX | XX | XX | XX | XX | XX | XX \XXXX
|
||||
| XX__/\_\ | XX_____ | XX__/\XX | XX__/\XX | XX__/\XX | XX_____ | XX__/\XX | XX__| XX
|
||||
\XX _\/XX | XX ____\ \XX _\/XX \XX _\/XX | XX _\/XX | XX ____\ \XX _\/XX \XX __\XX
|
||||
\XXXXXX \XXXXXXXX \XXXXXX \XXXXXX \XXXXXXX \XXXXXXXX \XXXXXX \XXXXXX
|
||||
|
||||
SA6ANW 20250721
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#cloudlog-wrapper {
|
||||
max-width: 800px;
|
||||
border: 2px solid #888;
|
||||
border-radius: 8px;
|
||||
background-color: var(--md-default-bg-color);
|
||||
padding: 0;
|
||||
margin-bottom: 2rem;
|
||||
overflow: hidden;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#cloudlog {
|
||||
width: 100%;
|
||||
border: none;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
function setIframeHeight() {
|
||||
const iframe = document.getElementById("cloudlog");
|
||||
if (!iframe) return;
|
||||
|
||||
const windowWidth = window.innerWidth;
|
||||
iframe.style.height = windowWidth < 612 ? "2100px" : "1600px";
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const iframe = document.getElementById("cloudlog");
|
||||
if (iframe) {
|
||||
iframe.src = "https://cloudlog.sa6anw.se/visitor/alpha";
|
||||
}
|
||||
setIframeHeight(); // Sätt rätt höjd direkt
|
||||
});
|
||||
|
||||
window.addEventListener("resize", setIframeHeight); // Ändra höjd vid fönsterändring
|
||||
</script>
|
||||
|
||||
<div id="cloudlog-wrapper">
|
||||
<iframe
|
||||
id="cloudlog"
|
||||
width="100%"
|
||||
style="border: none;"
|
||||
scrolling="no"
|
||||
></iframe>
|
||||
</div>
|
||||
175
docs/hf.md
175
docs/hf.md
@@ -1,50 +1,141 @@
|
||||
---
|
||||
title: HF
|
||||
---
|
||||
\ | /
|
||||
\|/ Kelemen DP-804020
|
||||
|
|
||||
| RG213
|
||||
|
|
||||
............. ......:.......
|
||||
: Spyverter :-----------------: 1708B :
|
||||
:...........: :............:
|
||||
| |
|
||||
......:...... ......:....... .............
|
||||
: Airspy-R2 : : FT-950 :-----------------: Signalink :
|
||||
:...........: :............. :...........:
|
||||
Hårdvara | | |
|
||||
- - - -|- - - - - - - - - - - - - - -|- - - - - - - - - - - - - - - | - - - -
|
||||
Mjukvara | | |
|
||||
| ............. ......:....... ............. |
|
||||
+---: SDR++ :---+---: Flrig :---+---: JS8Call :---+
|
||||
:...........: | :............: | :...........: |
|
||||
............. | | ............. |
|
||||
: :---+ +---: FT8 :---+
|
||||
:...........: :...........:
|
||||
|
|
||||
......:......
|
||||
: Cloudlog :
|
||||
:...........:
|
||||
|
||||
|
||||
SA6ANW HF-setup 2024-01-03
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
__ __ __ __ ________
|
||||
|\_\ |\_\ |\_\ |\_\ |\ ______\
|
||||
| XX | XX \XX ______ | XX____ | XXXXXXXX ______ _____ ______ __ __ _____ _______ ______ __ __
|
||||
| XX__| XX |\_\ /\ ____\ | XX ___\ | XX__ /\ ____\ /\ ___\ /\ ____\ |\_\ |\_\ /\ ___\ |\ _____\ /\ ____\ |\_\ |\_\
|
||||
| XX __\XX | XX |\/XXXXXX\ | XXXXXXX\ | XX _\ |\/XXXXXX\ |\/XXXXX\ |\/XXXXXX\ | XX | XX |\/XXXXX\ | XXXXXXX\ |\/XXXXXX | XX | XX
|
||||
| XXXXXXXX | XX | XX | XX | XX | XX | XXXXX | XX \XX | XX _\XX | XX | XX | XX | XX | XX _\XX | XX | XX | XX | XX | XX
|
||||
| XX | XX | XX | XX__| XX | XX | XX | XX | XX | XXXXXXX | XX__| XX | XX__/\XX | XXXXXXX | XX | XX | XX____ | XX__/\XX
|
||||
| XX | XX | XX \XX __\XX | XX | XX | XX | XX \XX ___\ \XX __\XX \XX _\ XX \XX ___\ | XX | XX \XX ___\ \XX _\ XX
|
||||
\XX \XX \XX _\XXXXXXX \XX \XX \XX \XX \XXXXXX \XXXXXXX \XXXXXX \XXXXXX \XX \XX \XXXXXX _\XXXXXXX
|
||||
| _\__/\XX | XX | _\__/\XX
|
||||
\XX _\ XX | XX \XX _\ XX
|
||||
\XXXXXX \XX \XXXXXX
|
||||
|
||||
SA6ANW 20240104
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
{sv:**Systemskiss**}{en:**System Overview**}
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
\ | /
|
||||
\|/ Kelemen DP-804020
|
||||
|
|
||||
Outdoor | Outdoor
|
||||
- - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Indoor | Indoor
|
||||
............. ......:......
|
||||
: SpyVerter :-----------: 1708B :
|
||||
:...........: :...........:
|
||||
| |
|
||||
......:...... ......:...... .............
|
||||
: Airspy : : FT-950 :-----------------------: Signalink :
|
||||
:...........: :...........: :...........:
|
||||
Hardware | | | Hardware
|
||||
- - - - - - - - - | - - - - - - - - - - - | - - - - - - - - - - - - - - - - - | - - - - - - - - -
|
||||
Software | | | Software
|
||||
| ......:...... ............. |
|
||||
| : Flrig :-----+-----: JS8Call :-----+
|
||||
| :...........: | :...........: |
|
||||
| | |
|
||||
......:...... ............. | ............. |
|
||||
: SDR++ :-----------: CAT-Relay :-----+-----: WSJT-X :-----+
|
||||
:...........: :...........: | :...........:
|
||||
| |
|
||||
............. | ......:......
|
||||
: CL CatQt :-----+ :GridTracker:
|
||||
:...........: :...........:
|
||||
Local | | Local
|
||||
- - - - - - - - - - - - - - - - - - - - - | - - - - - - - - - - - | - - - - - - - - - - - - - - -
|
||||
Cloud | | Cloud
|
||||
......:...... |
|
||||
: Cloudlog :-----------------+
|
||||
:...........:
|
||||
HF-setup SA6ANW 20240504
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
{sv:**Komponentbeskrivningar**}{en:**Component Descriptions**}
|
||||
|
||||
- **Kelemen DP-804020**<br>
|
||||
{sv:Det är en 26m lång trappdipol för 80, 40 och 20M monterad som inverted-v med min mast som mitt punkt.}{en:A 26-meter long trap dipole for 80, 40, and 20 meters, mounted as an inverted-V with my mast as the center support.}<br>
|
||||
[https://www.wimo.com/en/antennas/hf-antennas/wire-antennas/kelemen](https://www.wimo.com/en/antennas/hf-antennas/wire-antennas/kelemen)<br>
|
||||
<!-- Antennen måste trimmas. Den ligger lite lågt. Vilka amatörradio band kan jag stämma av med min radio? -->
|
||||
|
||||
- **1708B**<br>
|
||||
{sv:MFJ-1708B-SDR, med denna kan man lyssna med både transceiver och SDR-mottagare. Vid sändning kopplas SDR-mottagaren bort automatiskt genom hf-detektering.}{en:MFJ-1708B-SDR — this device allows simultaneous reception with both a transceiver and an SDR receiver. When transmitting, the SDR is automatically disconnected via HF sensing.}<br>
|
||||
[https://mfjenterprises.com/products/mfj-1708b-sdr](https://mfjenterprises.com/products/mfj-1708b-sdr)<br>
|
||||
<!-- Testa att ersätta hf-detekteringen med PPT från radion. -->
|
||||
|
||||
- **SpyVerter R2**<br>
|
||||
{sv:Då SDR-mottagaren inte går lägre än 24MHz måste man konvertera upp signalen för att kunna lyssna på HF. Denna skiftar upp signalen med 120MHz och har ett frekvensomfång på 1-60MHz. Spänningsmatas via bias tee från SDR-mottagaren.}{en:Since the SDR receiver doesn't go below 24 MHz, the signal must be up-converted to monitor HF. This unit shifts the signal up by 120 MHz and covers a frequency range of 1–60 MHz. It’s powered via bias tee from the SDR.}<br>
|
||||
[https://airspy.com/spyverter-r2/](https://airspy.com/spyverter-r2/)<br>
|
||||
|
||||
- **Airspy R2**<br>
|
||||
{sv:SDR-mottagare med 12-bit ADC som kan visa knappt 10MHz på en gång. Valet av just denna mottagare beror på den öppna dokumentationen.}{en:SDR receiver with a 12-bit ADC capable of displaying nearly 10 MHz at once. This model was chosen for its open documentation.}<br>
|
||||
[https://airspy.com/airspy-r2/](https://airspy.com/airspy-r2/)<br>
|
||||
|
||||
- **FT-950**<br>
|
||||
{sv:En HF-rig från Yaesu. Det är en äldre radio utan vattenfall med många knappar och rattar. Den tillverkades från 2007 och är inte längre i produktion.}{en:An HF rig from Yaesu. It’s an older radio without a waterfall display, but with plenty of knobs and buttons. Manufactured starting in 2007 and now discontinued.}<br>
|
||||
[https://www.rigpix.com/yaesu/ft950.htm](https://www.rigpix.com/yaesu/ft950.htm)<br>
|
||||
|
||||
- **Signalink USB**<br>
|
||||
{sv:Ljudkortsinterface från Tigertronics för att kunna kommunicera med hjälp av dator. Det är en förutsättning för digitala moder som JS8 och FT8.}{en:Audio interface from Tigertronics used to enable computer-based communication. Essential for digital modes like JS8 and FT8.}<br>
|
||||
[https://tigertronics.com/](https://tigertronics.com/)<br>
|
||||
|
||||
- **Flrig**<br>
|
||||
{sv:Detta är programvaran som interagerar med FT-950. Alla andra mjukvaror använder sen Flrig för dubbelriktad kommunikation med tranceivern.}{en:This software interfaces with the FT-950. All other applications communicate with the transceiver through Flrig.}<br>
|
||||
[http://www.w1hkj.com/](http://www.w1hkj.com/)<br>
|
||||
|
||||
- **CAT-Relay**<br>
|
||||
{sv:Då både FT-950 och SDR++ är mottagare och förväntar de sig inte att syras av en annan radio. För att komma runt detta har N2IV utvecklat cat-relay. Här används en fork förädlad av WG1V.}{en:Since both the FT-950 and SDR++ are receivers, they don’t expect to be controlled by another radio. To solve this, N2IV developed CAT-Relay. This setup uses a fork maintained by WG1V.}<br>
|
||||
[https://github.com/cdhowe/cat-relay](https://github.com/cdhowe/cat-relay)<br>
|
||||
|
||||
- **SDR++**<br>
|
||||
{sv:Används som panadapter och kan visa hela det aktuella amatörradiobandet på en gång.}{en:Used as a panadapter to display the entire amateur radio band at once.}<br>
|
||||
[https://www.sdrpp.org/](https://www.sdrpp.org/)<br>
|
||||
|
||||
- **JS8Call eller WSJT-X**<br>
|
||||
{sv:Styr/styrs av radion via Flrig och använder Signalink som in och utgång för ljud.}{en:Controlled by or controls the radio via Flrig and uses Signalink for audio input/output.}<br>
|
||||
[https://js8call.com/](https://js8call.com/)<br>
|
||||
[https://wsjt.sourceforge.io/wsjtx.html](https://wsjt.sourceforge.io/wsjtx.html)<br>
|
||||
|
||||
- **GridTracker**<br>
|
||||
{sv:Hjälper till att visualisera trafik och genomförda QSO's. GridTrackersköter även loggning i Cloudlog när man använder WSJT-X}{en:Helps visualize traffic and completed QSOs. GridTracker also handles logging to Cloudlog when using WSJT-X.}<br>
|
||||
[https://gridtracker.org/](https://gridtracker.org/)<br>
|
||||
|
||||
- **CL CatQt**<br>
|
||||
{sv:Work in progerss. För att loggningsmjukvaran som körs på en server och används via web UI behövs denna för integration med radion.}{en:Work in progress. This is needed to integrate the radio with the logging software that runs on a server and is accessed via a web UI.}<br>
|
||||
|
||||
- **Cloudlog**<br>
|
||||
{sv:Work in progress. Up and running men inte integrerad mot radion}{en:Work in progress. It’s up and running, but not yet integrated with the radio.}<br>
|
||||
<br>
|
||||
|
||||
{sv:**Övrig utrustning**}{en:**Other Equipment**}
|
||||
|
||||
- {sv:**HF-stationer**}{en:**HF Radios**}<br>
|
||||
Xiegu X6200<br>
|
||||
Yaesu FT-100D {sv:SÅLD}{en:SOLD}<br>
|
||||
Yaesu FT-900 {sv:SÅLD}{en:SOLD}<br>
|
||||
|
||||
- **PSU**<br>
|
||||
Svebry 13.8V 30A<br>
|
||||
K-PO SPS-250-II 23-25A<br>
|
||||
|
||||
- {sv:**Antenner**}{en:Antennas}<br>
|
||||
Minibeam 10-15-20<br>
|
||||
3 element beam 10-15-20<br>
|
||||
|
||||
- **Tuner**<br>
|
||||
LDG Z-100<br>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
- Mast
|
||||
- Antenn
|
||||
- Kabel
|
||||
- RX/TX-Relä
|
||||
- SDR Mottagare
|
||||
- HF-Rig
|
||||
- Mjukvara
|
||||
- JS8Call
|
||||
- SDR++
|
||||
|
||||
34
docs/homelab.md
Normal file
34
docs/homelab.md
Normal file
@@ -0,0 +1,34 @@
|
||||
---
|
||||
title: Home Lab
|
||||
---
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
__ __ ______ __ __ ________ __ ______ _______
|
||||
|\_\ |\_\ /\ ____\ |\_\ /\_\ |\ ______\ |\_\ /\ ____\ |\ _____\
|
||||
| XX | XX | XXXXXX\ | XX\ / XX | XXXXXXXX | XX | XXXXXX\ | XXXXXXX\
|
||||
| XX__| XX | XX | XX | XXX\ / XXX | XX__ | XX | XX__| XX | XX__/\XX
|
||||
| XX __\XX | XX | XX | XXXX\ XXXX | XX _\ | XX | XX __\XX | XX _\ XX
|
||||
| XXXXXXXX | XX | XX | XX\XX XX XX | XXXXX | XX | XXXXXXXX | XXXXXXX\
|
||||
| XX | XX | XX__/\XX | XX \XXX| XX | XX_____ | XX_____ | XX | XX | XX__/\XX
|
||||
| XX | XX \XX _\ XX | XX \X | XX | XX ____\ | XX ____\ | XX | XX | XX _\ XX
|
||||
\XX \XX \XXXXXX \XX \XX \XXXXXXXX \XXXXXXXX \XX \XX \XXXXXXX
|
||||
|
||||
SA6ANW 20240105
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
- **[Nextcloud](https://cloud.sa6anw.se)**
|
||||
- **[Cloudlog](https://cloudlog.sa6anw.se)**
|
||||
- **[Drone](https://drone.sa6anw.se)**
|
||||
- **[Gitea](https://git.sa6anw.se)**
|
||||
- **[HedgeDoc](https://hedgedoc.sa6anw.se)**
|
||||
- **[VS Code](https://code.sa6anw.se)**
|
||||
- **[Smokeping](https://smokeping.sa6anw.se)**
|
||||
|
||||
:sv
|
||||
Dessa tjänster är i första hand för mig och en och annan privilegierad vän. Vill du också bli en privilegierad vän?
|
||||
:::
|
||||
|
||||
:en
|
||||
These services are primarily for myself, and maybe for some privileged friend. Would you like to become a privileged friend too?
|
||||
:::
|
||||
175
docs/index.md
175
docs/index.md
@@ -1,30 +1,167 @@
|
||||
---
|
||||
title: Start
|
||||
---
|
||||
# SA6ANW
|
||||
|
||||
_____/\\\\\\\\\\\_______/\\\\\\\\\_______________/\\\\\_____/\\\\\\\\\_____/\\\\\_____/\\\__/\\\______________/\\\___________
|
||||
___/\\\/////////\\\___/\\\\\\\\\\\\\_________/\\\\////____/\\\\\\\\\\\\\__\/\\\\\\___\/\\\_\/\\\_____________\/\\\___________
|
||||
__\//\\\______\///___/\\\/////////\\\_____/\\\///________/\\\/////////\\\_\/\\\/\\\__\/\\\_\/\\\_____________\/\\\___________
|
||||
___\////\\\_________\/\\\_______\/\\\___/\\\\\\\\\\\____\/\\\_______\/\\\_\/\\\//\\\_\/\\\_\//\\\____/\\\____/\\\____________
|
||||
______\////\\\______\/\\\\\\\\\\\\\\\__/\\\\///////\\\__\/\\\\\\\\\\\\\\\_\/\\\\//\\\\/\\\__\//\\\__/\\\\\__/\\\_____________
|
||||
_________\////\\\___\/\\\/////////\\\_\/\\\______\//\\\_\/\\\/////////\\\_\/\\\_\//\\\/\\\___\//\\\/\\\/\\\/\\\______________
|
||||
__/\\\______\//\\\__\/\\\_______\/\\\_\//\\\______/\\\__\/\\\_______\/\\\_\/\\\__\//\\\\\\____\//\\\\\\//\\\\\_______________
|
||||
_\///\\\\\\\\\\\/___\/\\\_______\/\\\__\///\\\\\\\\\/___\/\\\_______\/\\\_\/\\\___\//\\\\\_____\//\\\__\//\\\________________
|
||||
___\///////////_____\///________\///_____\/////////_____\///________\///__\///_____\/////_______\///____\///_________________
|
||||
<script>
|
||||
function scrollToContent() {
|
||||
const element = document.getElementById("main-content");
|
||||
const yOffset = -60; // scrolla 20px ovanför elementet
|
||||
const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset;
|
||||
|
||||
window.scrollTo({ top: y, behavior: 'smooth' });
|
||||
}
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
const button = document.getElementById('scrollButton');
|
||||
if (window.scrollY > 10) {
|
||||
button.style.opacity = '0';
|
||||
button.style.pointerEvents = 'none';
|
||||
} else {
|
||||
button.style.opacity = '1';
|
||||
button.style.pointerEvents = 'auto';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
window.addEventListener("scroll", () => {
|
||||
const content = document.getElementById("main-content");
|
||||
const header = document.querySelector(".md-header");
|
||||
const sidebar = document.querySelector(".md-sidebar");
|
||||
|
||||
const contentY = content.getBoundingClientRect().top;
|
||||
const windowHeight = window.innerHeight;
|
||||
|
||||
// Hur många pixlar innan "main-content" som menyn ska börja synas
|
||||
const fadeStart = windowHeight * 0.2;
|
||||
const fadeEnd = windowHeight * 0.8;
|
||||
|
||||
// Beräkna scrollbaserad opacitet (0 till 1)
|
||||
let opacity = 1 - (contentY - fadeStart) / (fadeEnd - fadeStart);
|
||||
opacity = Math.max(0, Math.min(1, opacity)); // begränsa mellan 0 och 1
|
||||
|
||||
// Tillämpa opacitet
|
||||
header.style.opacity = opacity;
|
||||
sidebar.style.opacity = opacity;
|
||||
|
||||
// Hantera klickbarhet så man inte klickar på osynlig meny
|
||||
if (opacity < 0.05) {
|
||||
header.style.pointerEvents = "none";
|
||||
sidebar.style.pointerEvents = "none";
|
||||
} else {
|
||||
header.style.pointerEvents = "auto";
|
||||
sidebar.style.pointerEvents = "auto";
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener("load", () => {
|
||||
// Initiera rätt opacitet direkt vid sidladdning
|
||||
window.dispatchEvent(new Event("scroll"));
|
||||
});
|
||||
</script>
|
||||
|
||||
<video autoplay loop muted playsinline
|
||||
style="position: absolute; top: 0; left: 0;
|
||||
height: 100vh; width: 100%;
|
||||
object-fit: cover;
|
||||
filter: blur(10px) brightness(0.7);
|
||||
/*transform: scale(1.2); /* lite zoom för att dölja kanter */
|
||||
z-index: -2;">
|
||||
<source src="https://sa6anw.se/assets/drone.webm" type="video/webm">
|
||||
</video>
|
||||
|
||||
|
||||
## Tjänster
|
||||
- **[Cloudlog](https://cloudlog.sa6anw.se)**
|
||||
- **[Drone](https://drone.sa6anw.se)**
|
||||
- **[Gitea](https://git.sa6anw.se)**
|
||||
- **[HedgeDoc](https://hedgedoc.sa6anw.se)**
|
||||
- **[Netmaker](https://dashboard.netmaker.sa6anw.se)**
|
||||
- **[vscode](https://code.sa6anw.se)**
|
||||
<video autoplay loop muted playsinline
|
||||
style="position: absolute; top: 0; left: 50%;
|
||||
transform: translate(-50%, -50px);
|
||||
height: 105vh;
|
||||
object-fit: cover; z-index: -1;">
|
||||
<source src="https://sa6anw.se/assets/drone.webm" type="video/webm">
|
||||
Din webbläsare stödjer inte video.
|
||||
</video>
|
||||
|
||||
Dessa tjänster är i första hand för mig och en och annan privilegierad vän. Vill du också bli en privilegierad vän?
|
||||
<button id="scrollButton" onclick="scrollToContent()"
|
||||
style="position: fixed; bottom: 70px; left: 50%; transform: translateX(-50%);
|
||||
padding: 12px 24px; font-size: 1.2rem;
|
||||
background-color: #ffffffcc; border: none; border-radius: 8px;
|
||||
cursor: pointer; z-index: 10;">
|
||||
↓
|
||||
</button>
|
||||
|
||||
## Övrig info
|
||||
<!-- Mellanrum -->
|
||||
<div style="height: 95vh;"></div>
|
||||
|
||||
<div id="main-content" class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
______ ______ ______ ______ __ __ __ __
|
||||
/\ ____\ /\ ____\ /\ ____\ /\ ____\ |\_\ |\_\ |\_\ _ |\_\
|
||||
|\ XXXXXX\ |\ XXXXXX\ |\ XXXXXX\ |\ XXXXXX\ | XX\ | XX | XX /\\ | XX
|
||||
| XX___\XX | XX__| XX | XX___\XX | XX__| XX | XXX\| XX | XX/ X\| XX
|
||||
\XX ___\ | XX __\XX | XX ___\ | XX __\XX | XXXX\ XX | XX XXX\ XX
|
||||
_\XXXXXX\ | XXXXXXXX | XXXXXXX\ | XXXXXXXX | XX\XX XX | XX XX\XX\XX
|
||||
|\_\__| XX | XX | XX | XX__/\XX | XX | XX | XX \XXXX | XXXX \XXXX
|
||||
\XX __\XX | XX | XX \XX _\ XX | XX | XX | XX \XXX | XXX \XXX
|
||||
\XXXXXX \XX \XX \XXXXXX \XX \XX \XX \XX \XX \XX
|
||||
|
||||
SA6ANW 20240105
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
:sv
|
||||
**Filmen**
|
||||
|
||||
Min mast med antenner i trädgården filmad 18:e april 2025. Saker i masten uppifrån och ner:
|
||||
:::
|
||||
|
||||
:en
|
||||
**The Video**
|
||||
|
||||
My mast with antennas in the garden, filmed on April 18, 2025. Items on the mast from top to bottom:
|
||||
:::
|
||||
|
||||
- **Diamond X-200N**<br>
|
||||
{sv:Mer info}{en:More info}: [https://sa6anw.se/vhfuhfdmr/](https://sa6anw.se/vhfuhfdmr/)
|
||||
<br>
|
||||
|
||||
- **Meshtastic nod**<br>
|
||||
{sv:Solcellsdriven, mer info}{en:Solar-powered, more info}: [https://sa6anw.se/meshtastic/](https://sa6anw.se/meshtastic/)
|
||||
<br>
|
||||
|
||||
- **Kelemen DP-804020**<br>
|
||||
{sv:Min HF-antenn, mer info}{en:My HF antenna, more info}: [https://sa6anw.se/hf/](https://sa6anw.se/hf/)
|
||||
<br><br>
|
||||
|
||||
**Logg**
|
||||
|
||||
- **20250718**<br>
|
||||
{sv:Fullständig engelsk översättning av hela sidan klar. Allt huvudmaterial finns nu tillgängligt både på svenska och engelska.}{en:Full English translation of the entire site completed. All main content is now available in both Swedish and English.}
|
||||
|
||||
- **20250717**<br>
|
||||
{sv:Namninsamling ang. amatörradio i Midsomer Murders.<br>}{en:Petition regarding amateur radio in Midsomer Murders.<br>}
|
||||
|
||||
- **20250418**<br>
|
||||
{sv:Film på första sidan och att alla ASCII-bilder skalar lite för att passa t.ex. mobiler bättre.<br>}{en:Video added to the front page, and all ASCII images now scale slightly to better fit, e.g., mobile screens.<br>}
|
||||
|
||||
- **20240417**<br>
|
||||
{sv:Utökat tjänsterna med smokeping<br>}{en:Added Smokeping to the services.<br>}
|
||||
|
||||
- **20240104**<br>
|
||||
{sv:Första publicering av HF. Sidan beskriver min setup för HF-trafik<br>}{en:First publication of the HF page. The page describes my HF traffic setup<br>}
|
||||
[https://sa6anw.se/hf.html](https://sa6anw.se/hf.html)<br>
|
||||
{sv:Första publicering av AREDN. Sidan beskriver mitt AREDN-nätverk<br>}{en:First publication of the AREDN page. The page describes my AREDN network<br>}
|
||||
[https://sa6anw.se/aredn.html](https://sa6anw.se/aredn.html)
|
||||
|
||||
:sv
|
||||
**Övrig info**<br>
|
||||
Det kan nog förekomma cookies på sa6anw.se och dess subdomäner men i så fall är det bara för att det måste finnas. Det finns i alla fall inga spårpixlar eller något annat dolt (såvitt jag vet) som medvetet kränker din rättigheter som internetmedborgare. Det jag har skrivit är fritt att kopiera eller dela vidare. Mycket av det som finns här har dock andra upphovspersoner och då gäller deras villkor. Det ska finnas källa på allt som inte är mitt men som alla vet har även solen sina fläckar.
|
||||
|
||||
Om något behöver fixas eller förbättras som en otydlig instruktion t.ex. är det bara att höra av sig!
|
||||
:::
|
||||
|
||||
:en
|
||||
**Other Info**<br>
|
||||
Cookies may be present on sa6anw.se and its subdomains, but only if necessary. There are no tracking pixels or other hidden elements (as far as I know) that intentionally violate your rights as a citizen of the internet.
|
||||
Everything I’ve written here is free to copy or share. However, much of the content comes from other creators, in which case their terms apply. Sources should be provided for anything not authored by me — but as everyone knows, even the sun has its spots.
|
||||
|
||||
If something needs to be fixed or improved — like an unclear instruction — don’t hesitate to get in touch!
|
||||
:::
|
||||
|
||||
69
docs/logbook.md
Normal file
69
docs/logbook.md
Normal file
@@ -0,0 +1,69 @@
|
||||
---
|
||||
title: Logbook
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
__ ______ ______ _______ ______ ______ __ __
|
||||
|\_\ /\ ____\ /\ ____\ |\ _____\ /\ ____\ /\ ____\ |\_\ /\_\
|
||||
| XX |\ XXXXXX\ |\ XXXXXX\ | XXXXXXX\ |\ XXXXXX\ |\ XXXXXX\ | XX / XX
|
||||
| XX | XX | XX | XX __\XX | XX__/ XX | XX | XX | XX | XX | XX/ XX
|
||||
| XX | XX | XX | XX|\ __\ | XX XX | XX | XX | XX | XX | XX XX
|
||||
| XX | XX | XX | XX \XXXX | XXXXXXX\ | XX | XX | XX | XX | XXXXX\
|
||||
| XX_____ | XX__/\XX | XX__| XX | XX__/\XX | XX__/\XX | XX__/\XX | XX \XX\
|
||||
| XX ____\ \XX _\ XX \XX __\XX | XX _\ XX \XX _\ XX \XX _\ XX | XX \XX\
|
||||
\XXXXXXXX \XXXXXX \XXXXXX \XXXXXXX \XXXXXX \XXXXXX \XX \XX
|
||||
|
||||
SA6ANW 20250722
|
||||
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
**WaveLog**
|
||||
|
||||
<style>
|
||||
#cloudlog-wrapper {
|
||||
border: 2px solid #888;
|
||||
border-radius: 8px;
|
||||
background-color: var(--md-default-bg-color);
|
||||
padding: 0;
|
||||
margin-bottom: 2rem;
|
||||
overflow: hidden;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#cloudlog {
|
||||
width: 100%;
|
||||
border: none;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
function setIframeHeight() {
|
||||
const iframe = document.getElementById("cloudlog");
|
||||
if (!iframe) return;
|
||||
|
||||
const windowWidth = window.innerWidth;
|
||||
iframe.style.height = windowWidth < 612 ? "2100px" : "1600px";
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const iframe = document.getElementById("cloudlog");
|
||||
if (iframe) {
|
||||
iframe.src = "https://wavelog.sa6anw.se/visitor/alpha";
|
||||
}
|
||||
setIframeHeight(); // Sätt rätt höjd direkt
|
||||
});
|
||||
|
||||
window.addEventListener("resize", setIframeHeight); // Ändra höjd vid fönsterändring
|
||||
</script>
|
||||
|
||||
<div id="cloudlog-wrapper">
|
||||
<iframe
|
||||
id="cloudlog"
|
||||
width="100%"
|
||||
style="border: none;"
|
||||
scrolling="no"
|
||||
></iframe>
|
||||
</div>
|
||||
170
docs/meshtastic.md
Normal file
170
docs/meshtastic.md
Normal file
@@ -0,0 +1,170 @@
|
||||
---
|
||||
title: Meshtastic
|
||||
---
|
||||
|
||||
<script>
|
||||
function scrollToContent() {
|
||||
const element = document.getElementById("main-content");
|
||||
const yOffset = -60; // scrolla 20px ovanför elementet
|
||||
const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset;
|
||||
|
||||
window.scrollTo({ top: y, behavior: 'smooth' });
|
||||
}
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
const button = document.getElementById('scrollButton');
|
||||
if (window.scrollY > 10) {
|
||||
button.style.opacity = '0';
|
||||
button.style.pointerEvents = 'none';
|
||||
} else {
|
||||
button.style.opacity = '1';
|
||||
button.style.pointerEvents = 'auto';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<script>
|
||||
window.addEventListener("scroll", () => {
|
||||
const content = document.getElementById("main-content");
|
||||
const header = document.querySelector(".md-header");
|
||||
const sidebar = document.querySelector(".md-sidebar");
|
||||
|
||||
const contentY = content.getBoundingClientRect().top;
|
||||
const windowHeight = window.innerHeight;
|
||||
|
||||
// Hur många pixlar innan "main-content" som menyn ska börja synas
|
||||
const fadeStart = windowHeight * 0.2;
|
||||
const fadeEnd = windowHeight * 0.8;
|
||||
|
||||
// Beräkna scrollbaserad opacitet (0 till 1)
|
||||
let opacity = 1 - (contentY - fadeStart) / (fadeEnd - fadeStart);
|
||||
opacity = Math.max(0, Math.min(1, opacity)); // begränsa mellan 0 och 1
|
||||
|
||||
// Tillämpa opacitet
|
||||
header.style.opacity = opacity;
|
||||
sidebar.style.opacity = opacity;
|
||||
|
||||
// Hantera klickbarhet så man inte klickar på osynlig meny
|
||||
if (opacity < 0.05) {
|
||||
header.style.pointerEvents = "none";
|
||||
sidebar.style.pointerEvents = "none";
|
||||
} else {
|
||||
header.style.pointerEvents = "auto";
|
||||
sidebar.style.pointerEvents = "auto";
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener("load", () => {
|
||||
// Initiera rätt opacitet direkt vid sidladdning
|
||||
window.dispatchEvent(new Event("scroll"));
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
<video autoplay loop muted playsinline
|
||||
style="position: absolute; top: 0; left: 0;
|
||||
height: 100vh; width: 100%;
|
||||
object-fit: cover;
|
||||
filter: blur(10px) brightness(0.7);
|
||||
/*transform: scale(1.2); /* lite zoom för att dölja kanter */
|
||||
z-index: -2;">
|
||||
<source src="https://sa6anw.se/assets/Felix_i_Jannes_mast_2.webm" type="video/webm">
|
||||
</video>
|
||||
|
||||
|
||||
<video autoplay loop muted playsinline
|
||||
style="position: absolute; top: 0; left: 50%;
|
||||
transform: translate(-50%, -50px);
|
||||
height: 105vh;
|
||||
object-fit: cover; z-index: -1;">
|
||||
<source src="https://sa6anw.se/assets/Felix_i_Jannes_mast_2.webm" type="video/webm">
|
||||
Din webbläsare stödjer inte video.
|
||||
</video>
|
||||
|
||||
<button id="scrollButton" onclick="scrollToContent()"
|
||||
style="position: fixed; bottom: 70px; left: 50%; transform: translateX(-50%);
|
||||
padding: 12px 24px; font-size: 1.2rem;
|
||||
background-color: #ffffffcc; border: none; border-radius: 8px;
|
||||
cursor: pointer; z-index: 10;">
|
||||
↓
|
||||
</button>
|
||||
|
||||
<!-- Mellanrum -->
|
||||
<div style="height: 95vh;"></div>
|
||||
|
||||
<div id="main-content" class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
__ __ ________ ______ __ __ ________ ______ ______ ________ ______ ______
|
||||
|\_\ /\_\ |\_______\ /\_____\ |\_\ |\_\ |\_______\ /\_____\ /\_____\ |\_______\ |\_____\ /\_____\
|
||||
| XX\ / XX | XXXXXXXX |\ XXXXXX\ | XX | XX \XXXXXXXX |\ XXXXXX\ |\ XXXXXX\ \XXXXXXXX \XXXXXX |\ XXXXXX\
|
||||
| XXX\ / XXX | XX__ | XX___\XX | XX__| XX | XX | XX__| XX | XX___\XX | XX | XX | XX \XX
|
||||
| XXXX\ XXXX | XX _\ \XX ___\ | XX __\XX | XX | XX __\XX \XX ___\ | XX | XX | XX
|
||||
| XX\XX XX XX | XXXXX _\XXXXXX\ | XXXXXXXX | XX | XXXXXXXX _\XXXXXX\ | XX | XX | XX __
|
||||
| XX \XXX| XX | XX_____ |\_\__| XX | XX | XX | XX | XX | XX |\_\__| XX | XX _| XX_ | XX__/\_\
|
||||
| XX \X | XX | XX ____\ \XX __\XX | XX | XX | XX | XX | XX \XX __\XX | XX |\_\XX_\ \XX _\/XX
|
||||
\XX \XX \XXXXXXXX \XXXXXX \XX \XX \XX \XX \XX \XXXXXX \XX \XXXXXX \XXXXXX
|
||||
|
||||
SA6ANW 20250419
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
:sv
|
||||
**Filmen**
|
||||
|
||||
SA6FAL, Felix monterar Solcellsdriven Meshtastic nod på Billingen. Noden hoppas jag ska kunna agera router/backbone för större delen av östra Skaraborg.
|
||||
<br><br>
|
||||
|
||||
**Meshtastic nod**
|
||||
|
||||
Min solcellsdrivna noder består av:
|
||||
:::
|
||||
|
||||
:en
|
||||
**The Video**
|
||||
|
||||
SA6FAL, Felix, installs a solar-powered Meshtastic node on Billingen. I hope this node will serve as a router/backbone for most of eastern Skaraborg.
|
||||
|
||||
**Meshtastic Node**
|
||||
|
||||
My solar-powered nodes consist of:
|
||||
:::
|
||||
|
||||
- **RAK WisMesh Starter Kit**<br>
|
||||
[pileupdx.com](https://pileupdx.com/product/rak-wisblock-meshtastic-starter-kit/)
|
||||
<!-- 505 -->
|
||||
<br>
|
||||
|
||||
- **Denver SOP-10100 Solcellsladdare 10 W**<br>
|
||||
[kjell.com](https://www.kjell.com/se/produkter/mobilt/ladda-koppla/mobilladdare/denver-sop-10100-solcellsladdare-10-w-p45155)
|
||||
<!-- 79 -->
|
||||
<br>
|
||||
|
||||
- **Alfa LoRa/HaLow 868MHz Antenna 5dBi N-Male**<br>
|
||||
[getic.com](https://www.getic.com/product/alfa-lora-halow-antenna-868mhz-5-dbi)
|
||||
<!-- 120 -->
|
||||
<br>
|
||||
|
||||
- **Vecys U.FL IPEX to N Type Female**<br>
|
||||
[Amazon.de](https://www.amazon.de/-/en/Coaxial-Pigtail-Wireless-Network-Repeater/dp/B0C8J131PD/ref=sr_1_fkmr0_1?crid=DRQL5RUP4S2K&dib=eyJ2IjoiMSJ9.5Hllyyg2IWxJeavT-t08-RPopBg2hwTUAzmSi7vJF4AhpxSnHIYhzL1iq8kMNGe0sk94Milkkb9PGf47BY8hiB6fLsyURNT-xAVAaCnneNo.MhBbKm2R_8WCKgxvnl4RIC-3CD_MRiR-edeEtKzu30A&dib_tag=se&keywords=ipx%2Bto%2Bn&qid=1746651363&sprefix=ipx%2Bto%2Bn%2Caps%2C108&sr=8-1-fkmr0&th=1)
|
||||
<!-- 55 -->
|
||||
<br>
|
||||
|
||||
- **3.7 V 2000 mAh Lithium Polymer Battery 1S**<br>
|
||||
[Amazon.de](https://www.amazon.de/-/en/Lithium-Rechargeable-Protective-Connector-Development/dp/B0F18HV7P6/ref=sr_1_4?crid=1TJR38FM13HZD&dib=eyJ2IjoiMSJ9.pa31evqfmcPANfix4h6H1fcM90icVspw9jtKK6gLZXM3l_g-QK2wXmeDZXkEGviMeXKdaw2mOhEv4AMj4B1L-4UjpHbhLtrFmwx7wNe5wIPa36B5XNzfcWF1kLp1CZ0LbqTGbyCp1FwBNKqKrZO3X25QiL7tjoPFAfjlXofPq0tIgaqsgatt3_TwiMrhWWFugTyU076i6g3vp2jVwAkLuWIZvVJ43Bi43PLMsB5VMb0.pKSYSW-6qdSy8_R3EEsw5ZaLDcI3wPoRp_ZQH3GGGyM&dib_tag=se&keywords=lipo%2B2000mah&qid=1746651495&sprefix=lipo%2B2000mah%2Caps%2C160&sr=8-4&th=1)
|
||||
<!-- 75 -->
|
||||
<br>
|
||||
|
||||
- **JST PH 2.0 Hona 10 cm**<br>
|
||||
[rcflight.se](https://rcflight.se/visaprodukt.aspx?id=12063&p=jst-ph-2-0-hona-med-10-cm-kabel)
|
||||
<!-- 15 -->
|
||||
<br>
|
||||
|
||||
- **Kopplingsdosa, 110 x 110 x 70 mm**<br>
|
||||
[biltema.se](https://www.biltema.se/bygg/elinstallationer/eldosor/kopplingsdosa-110-x-110-x-70-mm-2000047452)
|
||||
<!-- 45 -->
|
||||
<br>
|
||||
|
||||
- **Kabelförskruvning PG16, 10–14 mm**<br>
|
||||
[biltema.se](https://www.biltema.se/bygg/elinstallationer/monteringsdetaljer/kabelforskruvning-pg-ganga-2-st-2000021629)
|
||||
<!-- 18 -->
|
||||
<br><br>
|
||||
152
docs/midsomer.md
Normal file
152
docs/midsomer.md
Normal file
@@ -0,0 +1,152 @@
|
||||
---
|
||||
title: Midsomer Murders
|
||||
---
|
||||
|
||||

|
||||
|
||||
:sv
|
||||
**Midsomer Murders – men var är amatörradion?**<br>
|
||||
|
||||
Midsomer Murders är en av de mest älskade brittiska kriminalserierna – inte bara tack vare sina snillrika mordgåtor, utan för hur varje avsnitt placerar oss i en ny, udda och charmig subkultur mitt i den lantliga idyllen. Vi har fått följa historier vid allt från new age-mässor, konstnärskollektiv och IQ-sällskap till rugbyklubbar, riddarföreningar och preppers – alltid med värme, humor och ett stänk brittisk excentricitet.
|
||||
|
||||
Det är som att hela Midsomer är en karta över Storbritanniens (och mänsklighetens!) mest färgstarka intressegrupper. Men efter över 130 avsnitt har en värld ännu inte fått ta plats – amatörradions.
|
||||
|
||||
Och det är märkligt. Radioamatörer finns över hela Storbritannien, och vår subkultur är sprängfylld med teknisk kreativitet, gemenskap, internationella kontakter – och en och annan konflikt. Precis det material som ett klassiskt Midsomer-avsnitt byggs av.
|
||||
|
||||
Tänk dig:<br>
|
||||
- En manipulerad Astatic D-104 som blir strömförande vid sändning.<br>
|
||||
- Ett hemligt meddelande gömt bland QSL-kort.<br>
|
||||
- En misstänkt “elallergiker” som hatar all form av RF.<br>
|
||||
- En grannfejd som eskalerar på 80-metersbandet…<br>
|
||||
|
||||
**Visst hade det passat perfekt?**<br>
|
||||
Skriv under för amatörradio i Midsomer!
|
||||
|
||||
Jag vill samla in namn och ev. signal för att skicka en vänlig men tydlig vädjan till manusförfattarna bakom serien:
|
||||
Låt radioamatörerna få sitt avsnitt!
|
||||
|
||||
Oavsett om du är sändaramatör eller bara älskar serien – skriv gärna under och hjälp oss visa att detta är ett tema som många vill se!
|
||||
:::
|
||||
|
||||
:en
|
||||
**Midsomer Murders – but where is amateur radio?**<br>
|
||||
|
||||
Midsomer Murders is one of Britain's most beloved detective series – not just for its clever plots, but for the way each episode dives into a new, quirky subculture nestled in the peaceful countryside. We've seen episodes set among new age fairs, art collectives, IQ societies, rugby clubs, medieval reenactors, doomsday preppers – always with warmth, charm, and a distinctly British wink.
|
||||
|
||||
It’s as if Midsomer is a showcase of every eccentric hobby and group the UK has to offer. But after more than 130 episodes, one vibrant subculture has yet to appear: amateur radio.
|
||||
|
||||
And that’s surprising. Radio amateurs are found all over the UK – and the world. Our community is full of technical creativity, collaboration, international contacts, friendly rivalries – and yes, the occasional dramatic dispute. It's the perfect recipe for a classic Midsomer storyline.
|
||||
|
||||
Just imagine:<br>
|
||||
- A booby-trapped Astatic D-104 microphone that becomes live when transmitting.<br>
|
||||
- A vital clue hidden among stacks of QSL cards.<br>
|
||||
- A mysterious “electrosensitive” neighbour with a motive.<br>
|
||||
- A long-standing feud between operators bubbling over on the 80-meter band…<br>
|
||||
|
||||
**Surely, it's time for amateur radio to get its moment in the Midsomer sun?**<br>
|
||||
Sign the petition for ham radio in Midsomer!
|
||||
|
||||
We’re gathering names to kindly but firmly ask the show's writers:
|
||||
Let amateur radio have its episode!
|
||||
|
||||
Whether you're a licensed ham or just a loyal viewer, add your name and help us show there's real interest in this story idea.
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
<style>
|
||||
#namninsamling-form {
|
||||
border: 2px solid #888;
|
||||
padding: 1rem;
|
||||
border-radius: 8px;
|
||||
background-color: var(--md-default-bg-color);
|
||||
max-width: 400px;
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
#namninsamling-form input[type="text"],
|
||||
#namninsamling-form input[type="submit"] {
|
||||
display: block;
|
||||
width: 100%;
|
||||
margin: 0.5rem 0 1rem 0;
|
||||
padding: 0.5rem;
|
||||
font-size: 1rem;
|
||||
border: 1px solid #aaa;
|
||||
border-radius: 4px;
|
||||
background-color: var(--md-code-bg-color);
|
||||
color: var(--md-typeset-color);
|
||||
}
|
||||
|
||||
#namninsamling-form input[type="submit"] {
|
||||
background-color: var(--md-primary-fg-color);
|
||||
color: white;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: background 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
#namninsamling-form input[type="submit"]:hover {
|
||||
background-color: var(--md-primary-fg-color--dark);
|
||||
}
|
||||
</style>
|
||||
|
||||
<form id="namninsamling-form" action="https://sa6anw.se/submit" method="post">
|
||||
<label>Callsign</label><br>
|
||||
<input type="text" name="signal" id="signal"><br>
|
||||
<label>{sv:Förnamn}{en:First name}</label><br>
|
||||
<input type="text" name="fornamn" required><br>
|
||||
<label>{sv:Efternamn}{en:Surname}</label><br>
|
||||
<input type="text" name="efternamn" required><br><br>
|
||||
<input type="submit" value="{sv:Skicka}{en:Send}">
|
||||
</form>
|
||||
|
||||
|
||||
|
||||
<style>
|
||||
#namninsamling-lista-wrapper {
|
||||
max-width: 400px;
|
||||
border: 2px solid #888;
|
||||
border-radius: 8px;
|
||||
background-color: var(--md-default-bg-color);
|
||||
padding: 0;
|
||||
margin-bottom: 2rem;
|
||||
overflow: hidden;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#namninsamling-lista {
|
||||
width: 100%;
|
||||
height: 300px;
|
||||
border: none;
|
||||
display: block;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
document.addEventListener("DOMContentLoaded", () => {
|
||||
const iframe = document.getElementById("namninsamling-lista");
|
||||
if (iframe) {
|
||||
const timestamp = Date.now();
|
||||
iframe.src = `/data/namnlista.html?t=${timestamp}`;
|
||||
|
||||
iframe.onload = () => {
|
||||
try {
|
||||
const contentHeight = iframe.contentWindow.document.body.scrollHeight;
|
||||
iframe.style.height = contentHeight + "px";
|
||||
} catch (e) {
|
||||
console.warn("Kunde inte mäta höjden på iframen:", e);
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="namninsamling-lista-wrapper">
|
||||
<iframe
|
||||
id="namninsamling-lista"
|
||||
width="100%"
|
||||
style="border: none;"
|
||||
scrolling="no"
|
||||
></iframe>
|
||||
</div>
|
||||
|
||||
314
docs/netmaker.md
Normal file
314
docs/netmaker.md
Normal file
@@ -0,0 +1,314 @@
|
||||
---
|
||||
title: Netmaker
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
__ __ ________ ________ __ __ ______ __ __ ________ _______
|
||||
|\_\ |\_\ |\ ______\ |\ ______\ |\_\ /\_\ /\ ____\ |\_\ /\_\ |\ ______\ |\ _____\
|
||||
| XX\ | XX | XXXXXXXX \XXXXXXXX | XX\ / XX |\ XXXXXX\ | XX / XX | XXXXXXXX | XXXXXXX\
|
||||
| XXX\| XX | XX__ | XX | XXX\ / XXX | XX__| XX | XX/ XX | XX__ | XX__| XX
|
||||
| XXXX\ XX | XX _\ | XX | XXXX\ XXXX | XX __\XX | XX XX | XX _\ | XX __\XX
|
||||
| XX\XX XX | XXXXX | XX | XX\XX XX XX | XXXXXXXX | XXXXX\ | XXXXX | XXXXXXX\
|
||||
| XX \XXXX | XX_____ | XX | XX \XXX| XX | XX | XX | XX \XX\ | XX_____ | XX | XX
|
||||
| XX \XXX | XX ____\ | XX | XX \X | XX | XX | XX | XX \XX\ | XX ____\ | XX | XX
|
||||
\XX \XX \XXXXXXXX \XX \XX \XX \XX \XX \XX \XX \XXXXXXXX \XX \XX
|
||||
|
||||
SA6ANW 20240104
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
**Netmaker**<br>
|
||||
Wireguard VPN & Software Defined Networking
|
||||
|
||||
Med Netmaker Kan jag styra kommunikationen precis som jag vill. Det påminner om Tailscale men man har möjlighet att hosta det själv. Jag kör version 0.17.0.
|
||||
|
||||
För att köra netnetmaker
|
||||
Skapa en `docker-compose.yaml` med följande innehåll
|
||||
|
||||
version: "3.4"
|
||||
|
||||
services:
|
||||
netmaker:
|
||||
container_name: netmaker
|
||||
image: gravitl/netmaker:v0.17.0
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- NET_RAW
|
||||
- SYS_MODULE
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
- net.ipv4.conf.all.src_valid_mark=1
|
||||
- net.ipv6.conf.all.disable_ipv6=0
|
||||
- net.ipv6.conf.all.forwarding=1
|
||||
restart: always
|
||||
volumes:
|
||||
- dnsconfig:/root/config/dnsconfig
|
||||
- sqldata:/root/data
|
||||
- mosquitto_data:/etc/netmaker
|
||||
environment:
|
||||
SERVER_NAME: "broker.netmaker.sa6anw.se"
|
||||
SERVER_HOST: "81.170.219.67"
|
||||
SERVER_API_CONN_STRING: "api.netmaker.sa6anw.se:443"
|
||||
COREDNS_ADDR: "81.170.219.67"
|
||||
DNS_MODE: "on"
|
||||
SERVER_HTTP_HOST: "api.netmaker.sa6anw.se"
|
||||
API_PORT: "8081"
|
||||
CLIENT_MODE: "on"
|
||||
MASTER_KEY: "Masterkey"
|
||||
CORS_ALLOWED_ORIGIN: "*"
|
||||
DISPLAY_KEYS: "on"
|
||||
DATABASE: "sqlite"
|
||||
NODE_ID: "netmaker-server-1"
|
||||
MQ_HOST: "mq"
|
||||
MQ_PORT: "443"
|
||||
MQ_SERVER_PORT: "1883"
|
||||
HOST_NETWORK: "off"
|
||||
VERBOSITY: "1"
|
||||
MANAGE_IPTABLES: "on"
|
||||
PORT_FORWARD_SERVICES: "dns"
|
||||
MQ_ADMIN_PASSWORD: "AdminPassword"
|
||||
ports:
|
||||
- "51821-51830:51821-51830/udp"
|
||||
netmaker-ui:
|
||||
container_name: netmaker-ui
|
||||
image: gravitl/netmaker-ui:v0.17.0
|
||||
depends_on:
|
||||
- netmaker
|
||||
links:
|
||||
- "netmaker:api"
|
||||
restart: always
|
||||
environment:
|
||||
BACKEND_URL: "https://api.netmaker.sa6anw.se"
|
||||
caddy:
|
||||
image: caddy:2.6.2
|
||||
container_name: caddy
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./Caddyfile:/etc/caddy/Caddyfile
|
||||
- caddy_data:/data
|
||||
- caddy_conf:/config
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
coredns:
|
||||
container_name: coredns
|
||||
image: coredns/coredns
|
||||
command: -conf /root/dnsconfig/Corefile
|
||||
depends_on:
|
||||
- netmaker
|
||||
restart: always
|
||||
volumes:
|
||||
- dnsconfig:/root/dnsconfig
|
||||
mq:
|
||||
container_name: mq
|
||||
image: eclipse-mosquitto:2.0.15-openssl
|
||||
depends_on:
|
||||
- netmaker
|
||||
restart: unless-stopped
|
||||
command: ["/mosquitto/config/wait.sh"]
|
||||
environment:
|
||||
NETMAKER_SERVER_HOST: "https://api.netmaker.sa6anw.se"
|
||||
volumes:
|
||||
- ./mosquitto.conf:/mosquitto/config/mosquitto.conf
|
||||
- ./wait.sh:/mosquitto/config/wait.sh
|
||||
- mosquitto_data:/mosquitto/data
|
||||
- mosquitto_logs:/mosquitto/log
|
||||
volumes:
|
||||
caddy_data: {}
|
||||
caddy_conf: {}
|
||||
sqldata: {}
|
||||
dnsconfig: {}
|
||||
mosquitto_data: {}
|
||||
mosquitto_logs: {}
|
||||
|
||||
- Byt till din egen domän
|
||||
- Sätt lång MASTER_KEY och MQ_ADMIN_PASSWORD
|
||||
|
||||
Du behöver också filen `Caddyfile` i samma folder med följande innehåll
|
||||
|
||||
{
|
||||
# LetsEncrypt account
|
||||
email sa6anw@gmail.com
|
||||
}
|
||||
|
||||
# Dashboard
|
||||
https://dashboard.netmaker.sa6anw.se {
|
||||
# Apply basic security headers
|
||||
header {
|
||||
# Enable cross origin access to *.netmaker.sa6anw.se
|
||||
Access-Control-Allow-Origin *.netmaker.sa6anw.se
|
||||
# Enable HTTP Strict Transport Security (HSTS)
|
||||
Strict-Transport-Security "max-age=31536000;"
|
||||
# Enable cross-site filter (XSS) and tell browser to block detected attacks
|
||||
X-XSS-Protection "1; mode=block"
|
||||
# Disallow the site to be rendered within a frame on a foreign domain (clickjacking protection)
|
||||
X-Frame-Options "SAMEORIGIN"
|
||||
# Prevent search engines from indexing
|
||||
X-Robots-Tag "none"
|
||||
# Remove the server name
|
||||
-Server
|
||||
}
|
||||
|
||||
reverse_proxy http://netmaker-ui
|
||||
}
|
||||
|
||||
# API
|
||||
https://api.netmaker.sa6anw.se {
|
||||
reverse_proxy http://netmaker:8081
|
||||
}
|
||||
|
||||
# MQ
|
||||
wss://broker.netmaker.sa6anw.se {
|
||||
reverse_proxy ws://mq:8883
|
||||
}
|
||||
- Samma sak här, byt till din domän och mailadress.
|
||||
|
||||
Som näst sista filen du behöver är `wait.sh`
|
||||
|
||||
#!/bin/ash
|
||||
|
||||
wait_for_netmaker() {
|
||||
echo "SERVER: ${NETMAKER_SERVER_HOST}"
|
||||
until curl --output /dev/null --silent --fail --head \
|
||||
--location "${NETMAKER_SERVER_HOST}/api/server/health"; do
|
||||
echo "Waiting for netmaker server to startup"
|
||||
sleep 1
|
||||
done
|
||||
}
|
||||
|
||||
main(){
|
||||
# wait for netmaker to startup
|
||||
apk add curl
|
||||
wait_for_netmaker
|
||||
echo "Starting MQ..."
|
||||
# Run the main container command.
|
||||
/docker-entrypoint.sh
|
||||
/usr/sbin/mosquitto -c /mosquitto/config/mosquitto.conf
|
||||
|
||||
}
|
||||
|
||||
main "${@}"
|
||||
|
||||
Till sist `mosquitto.conf`
|
||||
|
||||
per_listener_settings false
|
||||
listener 8883
|
||||
protocol websockets
|
||||
allow_anonymous false
|
||||
|
||||
listener 1883
|
||||
protocol websockets
|
||||
allow_anonymous false
|
||||
|
||||
plugin /usr/lib/mosquitto_dynamic_security.so
|
||||
plugin_opt_config_file /mosquitto/data/dynamic-security.json
|
||||
|
||||
|
||||
Sen är det bara att köra `docker-compose up -d`
|
||||
|
||||
**Modifiering**<br>
|
||||
Jag har valt att bryta ut caddy så att jag kan köra fler tjänster med bara en publik IP.
|
||||
|
||||
Modifiera `docker-compose.yaml` på följande sätt
|
||||
|
||||
version: "3.4"
|
||||
|
||||
services:
|
||||
netmaker:
|
||||
container_name: netmaker
|
||||
image: gravitl/netmaker:v0.17.0
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- NET_RAW
|
||||
- SYS_MODULE
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
- net.ipv4.conf.all.src_valid_mark=1
|
||||
- net.ipv6.conf.all.disable_ipv6=0
|
||||
- net.ipv6.conf.all.forwarding=1
|
||||
restart: always
|
||||
volumes:
|
||||
- dnsconfig:/root/config/dnsconfig
|
||||
- sqldata:/root/data
|
||||
- mosquitto_data:/etc/netmaker
|
||||
environment:
|
||||
SERVER_NAME: "broker.netmaker.sa6anw.se"
|
||||
SERVER_HOST: "81.170.219.67"
|
||||
SERVER_API_CONN_STRING: "api.netmaker.sa6anw.se:443"
|
||||
COREDNS_ADDR: "81.170.219.67"
|
||||
DNS_MODE: "on"
|
||||
SERVER_HTTP_HOST: "api.netmaker.sa6anw.se"
|
||||
API_PORT: "8081"
|
||||
CLIENT_MODE: "on"
|
||||
MASTER_KEY: "MasterKey"
|
||||
CORS_ALLOWED_ORIGIN: "*"
|
||||
DISPLAY_KEYS: "on"
|
||||
DATABASE: "sqlite"
|
||||
NODE_ID: "netmaker-server-1"
|
||||
MQ_HOST: "mq"
|
||||
MQ_PORT: "443"
|
||||
MQ_SERVER_PORT: "1883"
|
||||
HOST_NETWORK: "off"
|
||||
VERBOSITY: "1"
|
||||
MANAGE_IPTABLES: "on"
|
||||
PORT_FORWARD_SERVICES: "dns"
|
||||
MQ_ADMIN_PASSWORD: "AdminPassword"
|
||||
ports:
|
||||
- "51821-51830:51821-51830/udp"
|
||||
+ - "8081:8081"
|
||||
netmaker-ui:
|
||||
container_name: netmaker-ui
|
||||
image: gravitl/netmaker-ui:v0.17.0
|
||||
depends_on:
|
||||
- netmaker
|
||||
links:
|
||||
- "netmaker:api"
|
||||
restart: always
|
||||
environment:
|
||||
BACKEND_URL: "https://api.netmaker.sa6anw.se"
|
||||
+ ports:
|
||||
+ - "8080:80"
|
||||
- caddy:
|
||||
- image: caddy:2.6.2
|
||||
- container_name: caddy
|
||||
- restart: unless-stopped
|
||||
- volumes:
|
||||
- - ./Caddyfile:/etc/caddy/Caddyfile
|
||||
- - caddy_data:/data
|
||||
- - caddy_conf:/config
|
||||
- ports:
|
||||
- - "80:80"
|
||||
- - "443:443"
|
||||
coredns:
|
||||
container_name: coredns
|
||||
image: coredns/coredns
|
||||
command: -conf /root/dnsconfig/Corefile
|
||||
depends_on:
|
||||
- netmaker
|
||||
restart: always
|
||||
volumes:
|
||||
- dnsconfig:/root/dnsconfig
|
||||
mq:
|
||||
container_name: mq
|
||||
image: eclipse-mosquitto:2.0.15-openssl
|
||||
depends_on:
|
||||
- netmaker
|
||||
restart: unless-stopped
|
||||
command: ["/mosquitto/config/wait.sh"]
|
||||
environment:
|
||||
NETMAKER_SERVER_HOST: "https://api.netmaker.sa6anw.se"
|
||||
volumes:
|
||||
- ./mosquitto.conf:/mosquitto/config/mosquitto.conf
|
||||
- ./wait.sh:/mosquitto/config/wait.sh
|
||||
- mosquitto_data:/mosquitto/data
|
||||
- mosquitto_logs:/mosquitto/log
|
||||
+ ports:
|
||||
+ - "8883:8883"
|
||||
volumes:
|
||||
caddy_data: {}
|
||||
caddy_conf: {}
|
||||
sqldata: {}
|
||||
dnsconfig: {}
|
||||
|
||||
Filen `Caddyfile` kan du ta bort
|
||||
4
docs/overrides/header__title.css
Normal file
4
docs/overrides/header__title.css
Normal file
@@ -0,0 +1,4 @@
|
||||
.md-nav--primary .md-nav__title {
|
||||
background: none !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
3
docs/overrides/hide-titles.css
Normal file
3
docs/overrides/hide-titles.css
Normal file
@@ -0,0 +1,3 @@
|
||||
.md-content h1:first-of-type {
|
||||
display: none;
|
||||
}
|
||||
26
docs/portable.md
Normal file
26
docs/portable.md
Normal file
@@ -0,0 +1,26 @@
|
||||
---
|
||||
title: Portable
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
_______ ______ _______ ________ ______ _______ __ ________
|
||||
|\ _____\ /\ ____\ |\ _____\ |\ ______\ /\ ____\ |\ _____\ |\_\ |\ ______\
|
||||
| XXXXXXX\ |\ XXXXXX\ | XXXXXXX\ \XXXXXXXX |\ XXXXXX\ | XXXXXXX\ | XX | XXXXXXXX
|
||||
| XX__/\XX | XX | XX | XX__/\XX | XX | XX__| XX | XX__/\XX | XX | XX__
|
||||
| XX _\ XX | XX | XX | XX _\ XX | XX | XX __\XX | XX _\ XX | XX | XX _\
|
||||
| XXXXXXX | XX | XX | XXXXXXX\ | XX | XXXXXXXX | XXXXXXX\ | XX | XXXXX
|
||||
| XX | XX__/\XX | XX | XX | XX | XX | XX | XX__/\XX | XX_____ | XX_____
|
||||
| XX \XX _\ XX | XX | XX | XX | XX | XX | XX _\ XX | XX ____\ | XX ____\
|
||||
\XX \XXXXXX \XX \XX \XX \XX \XX \XXXXXXX \XXXXXXXX \XXXXXXXX
|
||||
|
||||
SA6ANW 20240105
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
{sv:**Utrustning**}{en:**Equipment**}
|
||||
|
||||
- **Xiegu X6200**
|
||||
- **Buddipole Delux Kit**
|
||||
- **JPC-12 Vertical Antenna**
|
||||
- **LDG UnUn 1:49**
|
||||
29
docs/remote.md
Normal file
29
docs/remote.md
Normal file
@@ -0,0 +1,29 @@
|
||||
---
|
||||
title: WaveLog
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
|
||||
_______ ________ __ __ ______ ________ ________
|
||||
|\ _____\ |\ ______\ |\_\ /\_\ /\ ____\ |\ ______\ |\ ______\
|
||||
| XXXXXXX\ | XXXXXXXX | XX\ / XX |\ XXXXXX\ \XXXXXXXX | XXXXXXXX
|
||||
| XX__| XX | XX__ | XXX\ / XXX | XX | XX | XX | XX__
|
||||
| XX __\XX | XX _\ | XXXX\ XXXX | XX | XX | XX | XX _\
|
||||
| XXXXXXX\ | XXXXX | XX\XX XX XX | XX | XX | XX | XXXXX
|
||||
| XX | XX | XX_____ | XX \XXX| XX | XX__/\XX | XX | XX_____
|
||||
| XX | XX | XX ____\ | XX \X | XX \XX _\ XX | XX | XX ____\
|
||||
\XX \XX \XXXXXXXX \XX \XX \XXXXXX \XX \XXXXXXXX
|
||||
|
||||
SA6ANW 20250722
|
||||
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
:sv
|
||||
Än så länge bara paner och drömmar
|
||||
:::
|
||||
|
||||
:en
|
||||
So far, just planning and dreaming
|
||||
:::
|
||||
37
docs/sa6anwse.md
Normal file
37
docs/sa6anwse.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: sa6anw.se
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
______
|
||||
/\ ____\
|
||||
_______ ______ |\ XXXXXX\ ______ _______ __ __ __ _______ ______
|
||||
/\ _____\ |\ ____\ | XX___\XX |\ ____\ |\ _____\ |\_\ |\_\ |\_\ /\ _____\ /\ ____\
|
||||
|\ XXXXXXX \XXXXXX\ | XX ___\ \XXXXXX\ | XXXXXXX\ | XX | XX | XX |\ XXXXXXX |\ XXXXXX\
|
||||
\XX ___\ /\____ XX | XXXXXXX\ /\____ XX | XX | XX | XX | XX | XX \XX ___\ | XX __\XX
|
||||
_\XXXXXX\ |\ XXXXXXX | XX__/ XX |\ XXXXXXX | XX | XX | XX_/\XX_/\XX __ _\XXXXXX\ | XXXXXXXX
|
||||
|\ ____\XX \XX __\XX \XX __\XX \XX __\XX | XX | XX \XX_\ XX_\ XX |\_\ |\ ____\XX \XX ____\
|
||||
\XXXXXXX \XXXXXXX \XXXXXX \XXXXXXX \XX \XX \XXXXX\XXXX \XX \XXXXXXX \XXXXXXX
|
||||
|
||||
SA6ANW 20240105
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
:sv
|
||||
**Denna hemsida**
|
||||
|
||||
Den är gjord med MKDocs och temat Material. Jag skriver sidan med code-server som är vscode med web-ui. Jag comittar allt till min git där DroneCI bygger och publicerar sidan anutomatiskt.
|
||||
:::
|
||||
|
||||
:en
|
||||
**This Website**
|
||||
|
||||
It’s built with MkDocs and the Material theme. I write the site using code-server, which is VSCode with a web UI. I commit everything to my Git repository, where DroneCI automatically builds and publishes the site.
|
||||
:::
|
||||
|
||||
<!--
|
||||
Ascii-art-rubrikerna är skapade på [denna hemsidan](https://patorjk.com/software/taag/) fonten heter `Big Money-se`. Där efter modifierar jag den till det som finns på hemsidan. Jag ändrar teckenavstånd, lägger till mer detaljer och byter `$` mot `X`.
|
||||
|
||||
Alla ascii-art-skisser är gjorda för hand.
|
||||
-->
|
||||
27
docs/satellite.md
Normal file
27
docs/satellite.md
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: Satellite
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
______ ______ ________ ________ __ __ ______ ________ ________
|
||||
/\ ____\ /\ ____\ |\ ______\ |\ ______\ |\_\ |\_\ |\ ____\ |\ ______\ |\ ______\
|
||||
|\ XXXXXX\ |\ XXXXXX\ \XXXXXXXX | XXXXXXXX | XX | XX \XXXXXX \XXXXXXXX | XXXXXXXX
|
||||
| XX___\XX | XX__| XX | XX | XX__ | XX | XX | XX | XX | XX__
|
||||
\XX ___\ | XX __\XX | XX | XX _\ | XX | XX | XX | XX | XX _\
|
||||
_\XXXXXX\ | XXXXXXXX | XX | XXXXX | XX | XX | XX | XX | XXXXX
|
||||
|\_\__| XX | XX | XX | XX | XX_____ | XX_____ | XX_____ _| XX_ | XX | XX_____
|
||||
\XX __\XX | XX | XX | XX | XX ____\ | XX ____\ | XX ____\ |\_\XX_\ | XX | XX ____\
|
||||
\XXXXXX \XX \XX \XX \XXXXXXXX \XXXXXXXX \XXXXXXXX \XXXXXX \XX \XXXXXXXX
|
||||
|
||||
SA6ANW 20240105
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
:sv
|
||||
Det är inget jag sysslat med men jag är sugen. Jag har precis kommitöver en gammal rotor med elevation.
|
||||
:::
|
||||
|
||||
:en
|
||||
It’s not something I’ve done before, but I’m interested. I’ve just acquired an old rotor with elevation.
|
||||
:::
|
||||
63
docs/smokeping.md
Normal file
63
docs/smokeping.md
Normal file
@@ -0,0 +1,63 @@
|
||||
---
|
||||
title: Smokeping
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
______ __ __ ______ __ __ ________ _______ ______ __ __ ______
|
||||
/\ ____\ |\_\ /\_\ /\ ____\ |\_\ /\_\ |\ ______\ |\ _____\ |\ ____\ |\_\ |\_\ /\ ____\
|
||||
|\ XXXXXX\ | XX\ / XX |\ XXXXXX\ | XX / XX | XXXXXXXX | XXXXXXX\ \XXXXXX | XX\ | XX |\ XXXXXX\
|
||||
| XX___\XX | XXX\ / XXX | XX | XX | XX/ XX | XX__ | XX__/ XX | XX | XXX\| XX | XX __\XX
|
||||
\XX ___\ | XXXX\ XXXX | XX | XX | XX XX | XX _\ | XX _\ XX | XX | XXXX\ XX | XX|\ __\
|
||||
_\XXXXXX\ | XX\XX XX XX | XX | XX | XXXXX\ | XXXXX | XXXXXXX | XX | XX\XX XX | XX \XXXX
|
||||
|\_\__| XX | XX \XXX| XX | XX__/\XX | XX \XX\ | XX_____ | XX _| XX_ | XX \XXXX | XX__| XX
|
||||
\XX __\XX | XX \X | XX \XX _\ XX | XX \XX\ | XX ____\ | XX |\_\XX_\ | XX \XXX \XX __\XX
|
||||
\XXXXXX \XX \XX \XXXXXX \XX \XX \XXXXXXXX \XX \XXXXXX \XX \XX \XXXXXX
|
||||
|
||||
SA6ANW 20240105
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
**[smokeping.sa6anw.se](https://smokeping.sa6anw.se)**
|
||||
|
||||
:sv
|
||||
För att köra smokeping i ditt egna labb:
|
||||
|
||||
- Skapa en `docker-compose.yaml` med följande innehåll
|
||||
:::
|
||||
|
||||
:en
|
||||
To run Smokeping in your own lab:
|
||||
|
||||
- Create a `docker-compose.yaml` file with the following content:
|
||||
:::
|
||||
|
||||
```
|
||||
---
|
||||
services:
|
||||
smokeping:
|
||||
image: lscr.io/linuxserver/smokeping:latest
|
||||
container_name: smokeping
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=Etc/UTC
|
||||
- MASTER_URL=https://smokeping.sa6anw.se
|
||||
- CACHE_DIR=/tmp
|
||||
volumes:
|
||||
- ./config:/config
|
||||
- ./data:/data
|
||||
ports:
|
||||
- 8002:80
|
||||
restart: unless-stopped
|
||||
|
||||
```
|
||||
:sv
|
||||
- Byt till din domän.
|
||||
- Sen är det bara att köra `docker compose up -d`
|
||||
:::
|
||||
|
||||
:en
|
||||
- Replace the domain with your own.
|
||||
- Then simply run: `docker compose up -d`
|
||||
:::
|
||||
47
docs/stylesheets/extra.css
Normal file
47
docs/stylesheets/extra.css
Normal file
@@ -0,0 +1,47 @@
|
||||
.ascii-wrapper {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
padding: 1rem 0;
|
||||
}
|
||||
|
||||
.ascii-wrapper pre {
|
||||
width: 100%;
|
||||
font-size: clamp(0.3rem, 1.5cqw, 0.75rem);
|
||||
line-height: 1.2;
|
||||
margin: 0;
|
||||
white-space: pre;
|
||||
}
|
||||
|
||||
.md-grid {
|
||||
max-width: 65rem
|
||||
}
|
||||
|
||||
.md-sidebar {
|
||||
width: 8rem
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1219px) {
|
||||
.md-sidebar--secondary {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.md-header,
|
||||
.md-tabs {
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
#scrollButton {
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
|
||||
/*Stänger av autohide av header på mobiler*/
|
||||
.md-header {
|
||||
position: sticky !important;
|
||||
top: 0 !important;
|
||||
transform: none !important;
|
||||
}
|
||||
100
docs/vhfuhfdmr.md
Normal file
100
docs/vhfuhfdmr.md
Normal file
@@ -0,0 +1,100 @@
|
||||
---
|
||||
title: VHF/UHF DMR
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
__ __ __ __ ________ __ __ __ __ __ ________ _______ __ __ _______
|
||||
|\_\ |\_\ |\_\ |\_\ |\ _____ \ /\_\ |\_\ |\_\ |\_\ |\_\ |\ ______\ |\ _____\ |\_\ /\_\ |\ _____\
|
||||
| XX | XX | XX | XX | XXXXXXXX / XX | XX | XX | XX | XX | XXXXXXXX | XXXXXXX\ | XX\ / XX | XXXXXXX\
|
||||
| XX | XX | XX__| XX | XX__ / XX | XX | XX | XX__| XX | XX__ | XX | XX | XXX\ / XXX | XX__| XX
|
||||
\XX\ / \XX | XX __\XX | XX _\ / XX | XX | XX | XX __\XX | XX \ | XX | XX | XXXX\ XXXX | XX __\XX
|
||||
\XX\ XX | XXXXXXXX | XXXXX / XX | XX | XX | XXXXXXXX | XXXXX | XX | XX | XX\XX XX XX | XXXXXXX\
|
||||
\XX XX | XX | XX | XX / XX | XX__/\XX | XX | XX | XX | XX__/\XX | XX \XXX| XX | XX | XX
|
||||
\XXX | XX | XX | XX | XX \XX _\ XX | XX | XX | XX | XX _\ XX | XX \X | XX | XX | XX
|
||||
\X \XX \XX \XX \XX \XXXXXX \XX \XX \XX \XXXXXXX \XX \XX \XX \XX
|
||||
|
||||
SA6ANW 20240105
|
||||
</div></code></pre>
|
||||
</div>
|
||||
|
||||
:sv
|
||||
**Setup på mitt hemma QTH**<br>
|
||||
I mitt shack har jag kompletterat min HF-setup med VHF cch UHF FM förmåga:
|
||||
:::
|
||||
:en
|
||||
**Setup at My Home QTH**<br>
|
||||
In my shack, I’ve complemented my HF setup with VHF and UHF FM capability:
|
||||
:::
|
||||
|
||||
- **Icom IC-E2820**<br>
|
||||
{sv:En rejäl mobilstation med möjlighet att även köra D-Star. Radion har dubbla mottagare.}{en:A solid mobile rig with support for D-Star as well. The radio features dual receivers.}<br>
|
||||
[https://rigpix.com/icom/ice2820.htm](https://rigpix.com/icom/ice2820.htm)
|
||||
<br><br>
|
||||
|
||||
- **Diamond X200N**<br>
|
||||
{sv:Lagom kompromiss på 2.50m i toppen av min mast.}{en:A good compromise at 2.5 meters, mounted at the top of my mast.}<br>
|
||||
[https://www.diamond-ant.co.jp/english/amateur/antenna/ante_2base/ante_base3.html](https://www.diamond-ant.co.jp/english/amateur/antenna/ante_2base/ante_base3.html)
|
||||
<br><br>
|
||||
|
||||
:sv
|
||||
**Prylar jag brukar ta med mig**<br>
|
||||
Om jag ska iväg någonstans så tar jag ofta med mig en handaparat.<br>
|
||||
:::
|
||||
|
||||
:en
|
||||
**Gear I Usually Bring Along**<br>
|
||||
When heading out, I often take a handheld radio with me.<br>
|
||||
:::
|
||||
|
||||
- **Anytone AT-D878UVII Plus**<br>
|
||||
{sv:Det är oftast inte DMR möjligheten som gör att jag väljer denna. Det som är bra med denna radio är kodpluggen som SM0RUX Pontus Falk (SK) skapat, nu förvaltad av SM0RGM Stefan Helander. Den sänder också APRS position.}{en:It’s usually not the DMR capability that makes me choose this one. The big advantage is the codeplug created by SM0RUX Pontus Falk (SK), now maintained by SM0RGM Stefan Helander. It also transmits APRS position.}<br>
|
||||
[https://rigpix.com/anytone/atd878uviiplus.htm](https://rigpix.com/anytone/atd878uviiplus.htm)
|
||||
<br><br>
|
||||
|
||||
- **Baofeng UV-3R**<br>
|
||||
{sv:När man ska resa lätt.}{en:A small cute radio that I think will replace the UV-3R.}<br>
|
||||
[https://rigpix.com/baofeng/uv3r.htm](https://rigpix.com/baofeng/uv3r.htm)
|
||||
<br><br>
|
||||
|
||||
- **Baofeng UV-5R Mini**<br>
|
||||
{sv:Liten söt radio som jag tror kommer ersätta UV-3R.}{en:Perfect when you want to travel light.}<br>
|
||||
[https://rigpix.com/baofeng/uv5rmini.htm](https://rigpix.com/baofeng/uv5rmini.htm)
|
||||
<br><br>
|
||||
|
||||
- **VGC VR-N76**<br>
|
||||
{sv:Imponerande billig radio. Den har tre VFO'er en för digital kommunikation som t.ex. APRS och två för tal. Den andra kanalens ptt är också representerad med en egen knapp.}{en:Surprisingly affordable radio. It features three VFOs — one for digital communication like APRS and two for voice. The second voice channel even has its own PTT button.}<br><br>
|
||||
|
||||
:sv
|
||||
**DMR**<br>
|
||||
Anytone AT-D878UVII Plus är den radion jag har som klarar av DMR. Till den har jag två hotspots. Hotspot #1 är monterad i en lantbrukssilo ca. 300m öster om mitt QTH. Mätverksförbindelsen till silon är också amatörradio i form av en AREDN-förbindelse. Läs mer om [AREDN](https://sa6anw.se/aredn/). Hostpot #2 kan jag ta med mig i t.ex. husvagnen. Båda mina hostpots har MMDVM-hattar på Raspberry Pi och den i silon har en Diamond X50N för bättre täckning med den begränsade effekten. Har du vägarna förbi Värsås är den fri att använda på 433.900MHz CC6.
|
||||
:::
|
||||
|
||||
:en
|
||||
**DMR**<br>
|
||||
The Anytone AT-D878UVII Plus is the radio I use for DMR. I have two hotspots for it. Hotspot #1 is mounted in a grain silo about 300 meters east of my QTH. The connection to the silo is also amateur radio — an AREDN link. Read more about [AREDN](https://sa6anw.se/aredn/). Hotspot #2 is portable and often travels with me in, for example, the caravan. Both hotspots use MMDVM hats on Raspberry Pi boards. The silo unit uses a Diamond X50N antenna to improve coverage despite limited output power.
|
||||
If you’re passing through Värsås, feel free to use it — 433.900 MHz CC6.
|
||||
:::
|
||||
|
||||
<br><br>
|
||||
{sv:**Övrig trustning**}{en:**Other Equipment**}
|
||||
|
||||
- {sv:**Mobilstationer**}{en:**Mobile Radios**}<br>
|
||||
Yaesu FT-1500M<br>
|
||||
Yaesu FT-100D {sv:SÅLD}{en:SOLD}<br>
|
||||
<br>
|
||||
|
||||
- {sv:**Handaparater**}{en:**Handheld Radios**}<br>
|
||||
Kenwood TH-F7E<br>
|
||||
Baofeng K5 Plus<br>
|
||||
Baofeng GT-3<br>
|
||||
Baofeng BF-888S+<br>
|
||||
<br>
|
||||
|
||||
- {sv:**Antenner**}{en:**Antennas**}<br>
|
||||
Diamond X-30<br>
|
||||
Diamond X-50N<br>
|
||||
<br>
|
||||
|
||||
- {sv:**Övrigt**}{en:**Other**}<br>
|
||||
RPI + MMDVM {sv:som kör}{en:running} PI-Star
|
||||
20
docs/wavelog.md
Normal file
20
docs/wavelog.md
Normal file
@@ -0,0 +1,20 @@
|
||||
---
|
||||
title: WaveLog
|
||||
---
|
||||
|
||||
<div class="ascii-wrapper">
|
||||
<pre><code><div align="center">
|
||||
__ __ ______ __ __ ________ __ ______ ______
|
||||
|\_\ _ |\_\ /\ ____\ |\_\ |\_\ |\ ______\ |\_\ /\ ____\ /\ ____\
|
||||
| XX /\\ | XX |\ XXXXXX\ | XX | XX | XXXXXXXX | XX |\ XXXXXX\ |\ XXXXXX\
|
||||
| XX/ X\| XX | XX__| XX | XX | XX | XX__ | XX | XX | XX | XX __\XX
|
||||
| XX XXX\ XX | XX __\XX \XX\ / XX | XX _\ | XX | XX | XX | XX|\ __\
|
||||
| XX XX\XX\XX | XXXXXXXX \XX\ XX | XXXXX | XX | XX | XX | XX \XXXX
|
||||
| XXXX \XXXX | XX | XX \XX XX | XX_____ | XX_____ | XX__/\XX | XX__| XX
|
||||
| XXX \XXX | XX | XX \XXX | XX ____\ | XX ____\ \XX _\ XX \XX __\XX
|
||||
\XX \XX \XX \XX \X \XXXXXXXX \XXXXXXXX \XXXXXX \XXXXXX
|
||||
|
||||
SA6ANW 20250722
|
||||
|
||||
</div></code></pre>
|
||||
</div>
|
||||
24
extra.css
Normal file
24
extra.css
Normal file
@@ -0,0 +1,24 @@
|
||||
.ascii-wrapper {
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch; /* för smooth scroll på mobil */
|
||||
}
|
||||
|
||||
.ascii-wrapper pre {
|
||||
display: table; /* Gör att den bara tar så mycket plats som behövs */
|
||||
max-width: 50%; /* Begränsa till förälderns bredd */
|
||||
margin: 0 auto; /* Centrerar innehållet */
|
||||
}
|
||||
|
||||
.ascii-wrapper code {
|
||||
white-space: pre; /* Bevara mellanrum och radbrytningar */
|
||||
font-size: 1em; /* Behåll läsbar storlek */
|
||||
}
|
||||
|
||||
.page-meta {
|
||||
font-size: 0.8em;
|
||||
color: #888;
|
||||
margin-top: 2em;
|
||||
border-top: 1px solid #ccc;
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
24
extra_test.css
Normal file
24
extra_test.css
Normal file
@@ -0,0 +1,24 @@
|
||||
.ascii-wrapper {
|
||||
width: 100%;
|
||||
overflow-x: auto;
|
||||
-webkit-overflow-scrolling: touch; /* för smooth scroll på mobil */
|
||||
}
|
||||
|
||||
.ascii-wrapper pre {
|
||||
display: table; /* Gör att den bara tar så mycket plats som behövs */
|
||||
max-width: 50%; /* Begränsa till förälderns bredd */
|
||||
margin: 0 auto; /* Centrerar innehållet */
|
||||
}
|
||||
|
||||
.ascii-wrapper code {
|
||||
white-space: pre; /* Bevara mellanrum och radbrytningar */
|
||||
font-size: 1em; /* Behåll läsbar storlek */
|
||||
}
|
||||
|
||||
.page-meta {
|
||||
font-size: 0.8em;
|
||||
color: #888;
|
||||
margin-top: 2em;
|
||||
border-top: 1px solid #ccc;
|
||||
padding-top: 0.5em;
|
||||
}
|
||||
41
mkdocs.yml
41
mkdocs.yml
@@ -1,11 +1,29 @@
|
||||
site_name: SA6ANW
|
||||
|
||||
nav:
|
||||
- Start: index.md
|
||||
- HF: hf.md
|
||||
- VHF/UHF DMR: vhfuhfdmr.md
|
||||
- Portabel: portable.md
|
||||
- Remote: remote.md
|
||||
- Logbook: logbook.md
|
||||
- Satellite: satellite.md
|
||||
- AREDN: aredn.md
|
||||
- MESHTASTIC: meshtastic.md
|
||||
- Midsomer Murders: midsomer.md
|
||||
- Services:
|
||||
- Home Lab: homelab.md
|
||||
- Caddy: caddy.md
|
||||
- sa6anw.se: sa6anwse.md
|
||||
- Wavelog: wavelog.md
|
||||
- Smokeping: smokeping.md
|
||||
|
||||
theme:
|
||||
name: 'material'
|
||||
language: sv
|
||||
font:
|
||||
text: 'Ubuntu'
|
||||
code: 'Ubuntu Mono'
|
||||
logo: assets/svenman_logo.png
|
||||
logo: assets/logo.png
|
||||
palette:
|
||||
- media: "(prefers-color-scheme: dark)"
|
||||
scheme: slate
|
||||
@@ -21,5 +39,24 @@ theme:
|
||||
toggle:
|
||||
icon: material/weather-night
|
||||
name: Embrace the dark side
|
||||
|
||||
plugins:
|
||||
- search
|
||||
- open-in-new-tab
|
||||
- i18n:
|
||||
default_language: sv
|
||||
docs_structure: folder
|
||||
languages:
|
||||
- locale: sv
|
||||
name: Svenska
|
||||
default: true
|
||||
build: true
|
||||
- locale: en
|
||||
name: English
|
||||
build: true
|
||||
|
||||
extra_css:
|
||||
- stylesheets/extra.css
|
||||
- overrides/hide-titles.css
|
||||
- overrides/hide-toc.css
|
||||
- overrides/header__title.css
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
mkdocs==1.2.1
|
||||
mkdocs-material==7.1.9
|
||||
mkdocs-material-extensions==1.0.1
|
||||
mkdocs-minify-plugin==0.4.0
|
||||
mkdocs-git-revision-date-plugin==0.3.1
|
||||
pymdown-extensions==8.2
|
||||
mkdocs==1.6.1
|
||||
mkdocs-material==9.6.12
|
||||
mkdocs-open-in-new-tab==1.0.3
|
||||
mkdocs-git-revision-date-localized-plugin==1.2.0
|
||||
mkdocs-minify-plugin==0.7.1
|
||||
mkdocs-static-i18n>=1.2.0
|
||||
|
||||
64
split_lang.py
Normal file
64
split_lang.py
Normal file
@@ -0,0 +1,64 @@
|
||||
import os
|
||||
import re
|
||||
|
||||
SOURCE_DIR = "docs"
|
||||
OUTPUT_DIRS = {"sv": "docs_sv", "en": "docs_en"}
|
||||
|
||||
lang_block_re = re.compile(r":::\s*(sv|en)\n(.*?)\n:::", re.DOTALL | re.IGNORECASE)
|
||||
frontmatter_re = re.compile(r"(?s)^---\n(.*?)\n---\n")
|
||||
|
||||
def split_content_by_language(content):
|
||||
blocks = {"sv": "", "en": ""}
|
||||
neutral_parts = []
|
||||
|
||||
# Ta ut frontmatter först (t.ex. title)
|
||||
frontmatter_match = frontmatter_re.match(content)
|
||||
frontmatter = ""
|
||||
if frontmatter_match:
|
||||
frontmatter = f"---\n{frontmatter_match.group(1)}\n---\n"
|
||||
content = content[frontmatter_match.end():]
|
||||
|
||||
pos = 0
|
||||
matches = list(lang_block_re.finditer(content))
|
||||
|
||||
if not matches:
|
||||
# Inga språkblock alls → tolka som endast svenska
|
||||
blocks["sv"] = frontmatter + content
|
||||
blocks["en"] = ""
|
||||
return blocks
|
||||
|
||||
for match in matches:
|
||||
start, end = match.span()
|
||||
lang, text = match.groups()
|
||||
neutral = content[pos:start]
|
||||
neutral_parts.append(neutral)
|
||||
blocks[lang.lower()] += text.strip() + "\n\n"
|
||||
pos = end
|
||||
|
||||
tail = content[pos:]
|
||||
neutral_parts.append(tail)
|
||||
neutral = ''.join(neutral_parts)
|
||||
|
||||
# Montera ihop språkfiler: frontmatter + språktext + neutral
|
||||
for l in blocks:
|
||||
blocks[l] = frontmatter + blocks[l].strip() + "\n\n" + neutral.strip()
|
||||
|
||||
return blocks
|
||||
|
||||
for filename in os.listdir(SOURCE_DIR):
|
||||
if filename.endswith(".md"):
|
||||
filepath = os.path.join(SOURCE_DIR, filename)
|
||||
with open(filepath, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
blocks = split_content_by_language(content)
|
||||
|
||||
for lang, text in blocks.items():
|
||||
if text.strip():
|
||||
os.makedirs(OUTPUT_DIRS[lang], exist_ok=True)
|
||||
out_path = os.path.join(OUTPUT_DIRS[lang], filename)
|
||||
with open(out_path, "w", encoding="utf-8") as f:
|
||||
f.write(text.strip() + "\n")
|
||||
print(f"✔ Skrev {lang}/{filename}")
|
||||
else:
|
||||
print(f"⚠️ Skippade {lang}/{filename} (tom)")
|
||||
40
split_markdown.py
Normal file
40
split_markdown.py
Normal file
@@ -0,0 +1,40 @@
|
||||
import os
|
||||
import re
|
||||
|
||||
SOURCE_DIR = "docs"
|
||||
OUTPUT_DIRS = {
|
||||
"sv": "docs_sv",
|
||||
"en": "docs_en"
|
||||
}
|
||||
|
||||
lang_block_re = re.compile(r":::\s*(sv|en)\n(.*?)\n:::", re.DOTALL)
|
||||
|
||||
def split_content_by_language(content):
|
||||
blocks = {"sv": "", "en": ""}
|
||||
pos = 0
|
||||
for match in lang_block_re.finditer(content):
|
||||
start, end = match.span()
|
||||
lang, text = match.groups()
|
||||
neutral = content[pos:start]
|
||||
for l in blocks:
|
||||
blocks[l] += neutral
|
||||
blocks[lang] += text.strip() + "\n\n"
|
||||
pos = end
|
||||
tail = content[pos:]
|
||||
for l in blocks:
|
||||
blocks[l] += tail
|
||||
return blocks
|
||||
|
||||
for filename in os.listdir(SOURCE_DIR):
|
||||
if filename.endswith(".md"):
|
||||
filepath = os.path.join(SOURCE_DIR, filename)
|
||||
with open(filepath, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
blocks = split_content_by_language(content)
|
||||
|
||||
for lang, text in blocks.items():
|
||||
os.makedirs(OUTPUT_DIRS[lang], exist_ok=True)
|
||||
out_path = os.path.join(OUTPUT_DIRS[lang], filename)
|
||||
with open(out_path, "w", encoding="utf-8") as f:
|
||||
f.write(text.strip())
|
||||
Reference in New Issue
Block a user