├── .github └── workflows │ └── build-airrohr-firmware-flasher.yml ├── .gitignore ├── .idea └── .gitignore ├── .python-version ├── .travis.yml ├── LICENSE ├── Makefile ├── Pipfile ├── Pipfile.lock ├── README.md ├── airrohr-flasher.py ├── airrohr-flasher.spec ├── airrohrFlasher ├── __init__.py ├── consts.py ├── qtvariant.py ├── utils.py └── workers.py ├── assets ├── logo.icns ├── logo.ico └── logo.png ├── deploy ├── dmgbuild_settings.py ├── mkicns └── windows-build.bat ├── gui ├── __init__.py └── mainwindow.ui ├── i18n ├── Bulgarian.ts ├── Chinese.ts ├── Czech.ts ├── Danish.ts ├── Dutch.ts ├── Estonian.ts ├── Finnish.ts ├── French.ts ├── German.ts ├── Greek.ts ├── Hungarian.ts ├── Italian.ts ├── Japanese.ts ├── Latvian.ts ├── Lituanian.ts ├── Polish.ts ├── Portuguese.ts ├── Romanian.ts ├── Russian.ts ├── Slovak.ts ├── Slovenian.ts ├── Spanish.ts ├── Swedish.ts └── Ukrainian.ts ├── images ├── airrohr-flasher_flash_finished.png ├── airrohr-flasher_flash_progress.png ├── airrohr-flasher_select_firmware.png ├── modified_GUI.png └── modified_GUI2.png ├── requirements.txt └── spiffsGen └── spiffsgen.py /.github/workflows/build-airrohr-firmware-flasher.yml: -------------------------------------------------------------------------------- 1 | name: Build Airrohr Firmware Flasher CI 2 | 3 | on: [push, pull_request, fork] 4 | 5 | jobs: 6 | build: 7 | strategy: 8 | matrix: 9 | os: [ubuntu-20.04, ubuntu-22.04, macos-latest, windows-latest] 10 | python-version: ["3.9"] 11 | fail-fast: false 12 | runs-on: ${{ matrix.os }} 13 | steps: 14 | - run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event." 15 | - name: Install qt5 OS X Packages 16 | if: runner.os == 'macOS' 17 | run: brew install qt@5 18 | - name: Install qt5 Ubuntu Packages 19 | if: runner.os == 'Linux' 20 | run: sudo apt-get update -qq && sudo apt-get install -qq qtbase5-dev qtdeclarative5-dev libqt5webkit5-dev qttools5-dev-tools make 21 | - name: Install qt5 on Windows 22 | if: runner.os == 'Windows' 23 | uses: jurplel/install-qt-action@v3 24 | with: 25 | version: '5.15.2' 26 | setup-python: 'false' 27 | - uses: actions/checkout@v3 28 | - name: Set up Python ${{ matrix.python-version }} 29 | uses: actions/setup-python@v4 30 | with: 31 | python-version: ${{ matrix.python-version }} 32 | cache: 'pip' 33 | - name: Display Python version 34 | run: python -c "import sys; print(sys.version)" 35 | - name: Display python root dir 36 | run: echo $Python3_ROOT_DIR 37 | - name: Install dependencies 38 | run: make deps 39 | - name: Install Additional OS X build deps 40 | if: runner.os == 'macOS' 41 | run: pip install dmgbuild==1.6.1 42 | - name: Display Path 43 | run: echo $PATH 44 | - name: Display Pip packages 45 | run: pip freeze 46 | - name: Test for pyuic5 command 47 | if: runner.os == 'macOS' 48 | run: export PATH="/usr/local/opt/qt@5/bin:/Users/runner/.local/bin:$PATH" && pyuic5 --version 49 | - name: Test for lrelease command 50 | if: runner.os == 'macOS' 51 | run: export PATH="/usr/local/opt/qt@5/bin:/Users/runner/.local/bin:$PATH" && lrelease -version 52 | - name: Run build script (Linux or Windows) 53 | if: runner.os != 'macOS' 54 | run: make dist 55 | shell: bash 56 | - name: Run build script (OS X) 57 | if: runner.os == 'macOS' 58 | run: export PATH="/usr/local/opt/qt@5/bin:/Users/runner/.local/bin:$PATH" && make dmg 59 | shell: bash 60 | - name: Archive built binaries (Linux) 61 | if: runner.os == 'Linux' 62 | uses: actions/upload-artifact@v3 63 | with: 64 | name: airrohr-flasher-dist-${{ matrix.os }}-python${{ matrix.python-version }} 65 | path: dist/airrohr-flasher 66 | - name: Archive built binaries (OS X) 67 | if: runner.os == 'macOS' 68 | uses: actions/upload-artifact@v3 69 | with: 70 | name: airrohr-flasher-dist-${{ matrix.os }}-python${{ matrix.python-version }} 71 | path: dist/airrohr-flasher.dmg 72 | - name: Archive built binaries (Windows) 73 | if: runner.os == 'Windows' 74 | uses: actions/upload-artifact@v3 75 | with: 76 | name: airrohr-flasher-dist-${{ matrix.os }}-python${{ matrix.python-version }} 77 | path: dist/airrohr-flasher.exe 78 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .ropeproject 2 | *.py[oc] 3 | *.swp 4 | .idea/** 5 | _buildid.py 6 | .python-version 7 | build/ 8 | dist/ 9 | 10 | # Ignore compiled Qt assets 11 | *.qm 12 | gui/*.py 13 | !gui/__init__.py 14 | 15 | .DS_Store 16 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /workspace.xml 3 | -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | airrohr_dev 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | os: 2 | - linux 3 | 4 | language: 5 | - python 6 | 7 | python: 8 | - "3.6" 9 | 10 | sudo: true 11 | 12 | before_install: 13 | - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then 14 | sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa && 15 | sudo apt-get update -qq && 16 | sudo apt-get install -qq qtbase5-dev qtdeclarative5-dev libqt5webkit5-dev && 17 | sudo apt-get install qttools5-dev-tools make 18 | ; 19 | fi 20 | - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then 21 | curl -Lo "/tmp/python-3.6.9-macosx10.6.pkg" -C - "https://www.python.org/ftp/python/3.6.9/python-3.6.9-macosx10.6.pkg" && sudo installer -pkg "/tmp/python-3.6.9-macosx10.6.pkg" -target /Library/Frameworks/Python.framework/Versions/3.6 22 | export PATH="$HOME/Qt/5.11.1/clang_64/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:$PATH" 23 | ; 24 | fi 25 | 26 | script: 27 | - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then 28 | make deps dist 29 | ; 30 | fi 31 | - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then 32 | make deps dmg 33 | ; 34 | fi 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright 2018 Piotr "inf" Dobrowolski 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | UI_FILES = $(wildcard gui/*.ui) 2 | TS_FILES = $(wildcard i18n/*.ts) 3 | PY_FILES = $(wildcard *.py) $(wildcard gui/*.py) $(wildcard airrohrFlasher/*.py) 4 | 5 | UI_COMPILED = $(UI_FILES:.ui=.py) 6 | TS_COMPILED = $(TS_FILES:.ts=.qm) 7 | 8 | # python3.6 on Windows is only available as python.exe 9 | ifeq (, $(shell which python3)) 10 | PY ?= python 11 | else 12 | PY ?= python3 13 | endif 14 | 15 | %.py: %.ui 16 | pyuic5 $< -o $@ 17 | 18 | %.qm: %.ts 19 | lrelease $< 20 | 21 | all: $(UI_COMPILED) $(TS_COMPILED) 22 | 23 | clean: 24 | rm $(UI_COMPILED) 25 | rm $(TS_COMPILED) 26 | 27 | run: all 28 | $(PY) airrohr-flasher.py 29 | 30 | # Updates all translation files in i18n/ directory 31 | i18n-update: $(UI_COMPILED) 32 | @for f in $(TS_FILES) ; do \ 33 | pylupdate5 $(PY_FILES) -ts $$f -verbose; \ 34 | done 35 | 36 | deps: 37 | $(PY) -m pip install --user -U -r requirements.txt 38 | 39 | # Here go platform-specific buildsteps 40 | UNAME_S := $(shell uname -s) 41 | 42 | ifeq ($(UNAME_S),Darwin) 43 | PLATFORM_DEPS := assets/logo.icns 44 | assets/logo.icns: assets/logo.png 45 | deploy/mkicns $< 46 | endif 47 | 48 | dist: all $(PLATFORM_DEPS) 49 | $(PY) -m PyInstaller -y airrohr-flasher.spec 50 | 51 | dmg: dist 52 | dmgbuild -s deploy/dmgbuild_settings.py -D app=dist/Sensor.Community\ Airrohr\ Flasher.app "Sensor.Community Airrohr Flasher" dist/airrohr-flasher.dmg 53 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | 8 | [packages] 9 | altgraph = "==0.16.1" 10 | certifi = "==2018.8.24" 11 | chardet = "==3.0.4" 12 | ecdsa = "==0.13.3" 13 | esptool = "==2.5.0" 14 | future = "==0.16.0" 15 | idna = "==2.7" 16 | macholib = "==1.11" 17 | netifaces = "==0.10.7" 18 | pefile = "==2018.8.8" 19 | pyaes = "==1.6.1" 20 | pyserial = "==3.4" 21 | requests = "==2.20.0" 22 | urllib3 = "==1.24.2" 23 | zeroconf = "==0.20.0" 24 | PyInstaller = "==3.6" 25 | PyQt5 = "==5.11.2" 26 | PyQt5-sip = "==4.19.19" 27 | -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "c7a75222bbb8e9e07ae0674e86535dd49808a3fc9de4c3c5811c1614e57ce9ac" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": {}, 8 | "sources": [ 9 | { 10 | "name": "pypi", 11 | "url": "https://pypi.org/simple", 12 | "verify_ssl": true 13 | } 14 | ] 15 | }, 16 | "default": { 17 | "altgraph": { 18 | "hashes": [ 19 | "sha256:d6814989f242b2b43025cba7161fc1b8fb487a62cd49c49245d6fd01c18ac997", 20 | "sha256:ddf5320017147ba7b810198e0b6619bd7b5563aa034da388cea8546b877f9b0c" 21 | ], 22 | "index": "pypi", 23 | "version": "==0.16.1" 24 | }, 25 | "certifi": { 26 | "hashes": [ 27 | "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638", 28 | "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a" 29 | ], 30 | "index": "pypi", 31 | "version": "==2018.8.24" 32 | }, 33 | "chardet": { 34 | "hashes": [ 35 | "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", 36 | "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" 37 | ], 38 | "index": "pypi", 39 | "version": "==3.0.4" 40 | }, 41 | "ecdsa": { 42 | "hashes": [ 43 | "sha256:163c80b064a763ea733870feb96f9dd9b92216cfcacd374837af18e4e8ec3d4d", 44 | "sha256:9814e700890991abeceeb2242586024d4758c8fc18445b194a49bd62d85861db" 45 | ], 46 | "index": "pypi", 47 | "version": "==0.13.3" 48 | }, 49 | "esptool": { 50 | "hashes": [ 51 | "sha256:5ba5906c08dfe8bbff337635f92263dfc29d9bca3a8f6a143c48ef2c912dbf19" 52 | ], 53 | "index": "pypi", 54 | "version": "==2.5.0" 55 | }, 56 | "future": { 57 | "hashes": [ 58 | "sha256:e39ced1ab767b5936646cedba8bcce582398233d6a627067d4c6a454c90cfedb" 59 | ], 60 | "index": "pypi", 61 | "version": "==0.16.0" 62 | }, 63 | "idna": { 64 | "hashes": [ 65 | "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", 66 | "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" 67 | ], 68 | "index": "pypi", 69 | "version": "==2.7" 70 | }, 71 | "macholib": { 72 | "hashes": [ 73 | "sha256:ac02d29898cf66f27510d8f39e9112ae00590adb4a48ec57b25028d6962b1ae1", 74 | "sha256:c4180ffc6f909bf8db6cd81cff4b6f601d575568f4d5dee148c830e9851eb9db" 75 | ], 76 | "index": "pypi", 77 | "version": "==1.11" 78 | }, 79 | "netifaces": { 80 | "hashes": [ 81 | "sha256:0083ff8d89c559d0da0811c4930cf36e4945da0f03749e0f108678098d7d1607", 82 | "sha256:179f2463469fe69c829c96c7b332c7fd3f01652311e36ae11e409e5b34eb9dad", 83 | "sha256:19df6feff2af7a9179e42afdd01d79616d85b7ff4401b55ffce2df29d512a017", 84 | "sha256:1a4082a52f521ceeaf3d0ff25c61a06d46444f3578f487935652ecc93becf538", 85 | "sha256:1edeea7d739b1d716d15214039386e999f2e374aaeac0703092132b4e55ba461", 86 | "sha256:2acb23ca092cc53b2b1f374132bbef5dd843767f6b10d31024f958474a1dfe96", 87 | "sha256:38969c101f1e61c2a53af6a7b635f63e81085ae87413f1f5551a4d7057f5f773", 88 | "sha256:4817871b226082600b64578549b9932bb07c1a42e9311ddd7c9dad08ff1fb22f", 89 | "sha256:4bb6b02b7c485a595a9d75346df3a77fcaa12d2352437c49c2d73ed968572d72", 90 | "sha256:674498dad41dacd86ec82e9e1793f9d8716755085c3776f051a266b1634a0b60", 91 | "sha256:7ea8eb1e824f74c161396f0d6d76fa3943462ee9a4629c387c10399d2aee058c", 92 | "sha256:8a69dc2743dcbb9b87fa3453820852f0feabc17b03d3841619e8e63f5d3902d5", 93 | "sha256:9cf8cb2de7524c34808e6111dfb9f89e3b7c568e6953b3e02b8397447a6d8303", 94 | "sha256:a77263e046636a761a2c3eeb0a56b5f8fa64f865efec91a9be008a46412b4ddd", 95 | "sha256:aea569ce1a5a75b010758097199f84d9a3a109a696473c635bcf82f8a43cc551", 96 | "sha256:bd590fcb75421537d4149825e1e63cca225fd47dad861710c46bd1cb329d8cbd", 97 | "sha256:e1037cfad0e99a23fb4829f40302f3696395358950ba9f0315363a0e1eb04af6", 98 | "sha256:e6d52aee254f9cf6192b54c156c67d54dcf451bec6781580844af892e4bf36bb", 99 | "sha256:e76d38d9cff51ecf9fd5b8d0adf63f7b8875e1ac8548ccb52264939e308b771e" 100 | ], 101 | "index": "pypi", 102 | "version": "==0.10.7" 103 | }, 104 | "pefile": { 105 | "hashes": [ 106 | "sha256:4c5b7e2de0c8cb6c504592167acf83115cbbde01fe4a507c16a1422850e86cd6" 107 | ], 108 | "index": "pypi", 109 | "version": "==2018.8.8" 110 | }, 111 | "pyaes": { 112 | "hashes": [ 113 | "sha256:02c1b1405c38d3c370b085fb952dd8bea3fadcee6411ad99f312cc129c536d8f" 114 | ], 115 | "index": "pypi", 116 | "version": "==1.6.1" 117 | }, 118 | "pyinstaller": { 119 | "hashes": [ 120 | "sha256:3730fa80d088f8bb7084d32480eb87cbb4ddb64123363763cf8f2a1378c1c4b7" 121 | ], 122 | "index": "pypi", 123 | "version": "==3.6" 124 | }, 125 | "pyqt5": { 126 | "hashes": [ 127 | "sha256:700b8bb0357bf0ac312bce283449de733f5773dfc77083664be188c8e964c007", 128 | "sha256:76d52f3627fac8bfdbc4857ce52a615cd879abd79890cde347682ff9b4b245a2", 129 | "sha256:7d0f7c0aed9c3ef70d5856e99f30ebcfe25a58300158dd46ee544cbe1c5b53db", 130 | "sha256:d5dc2faf0aeacd0e8b69af1dc9f1276a64020193148356bb319bdfae22b78f88" 131 | ], 132 | "index": "pypi", 133 | "version": "==5.11.2" 134 | }, 135 | "pyqt5-sip": { 136 | "hashes": [ 137 | "sha256:304acf771b6033cb4bafc415939d227c91265d30664ed643b298d7e95f509f81", 138 | "sha256:39d2677f4de46ed4d7aa3b612f31c74c881975efe51c6a23fbb1d9382e4cc850", 139 | "sha256:54b99a3057e8f01b90d49cca9ca566b1ea23d8920038760f44e75b90c62b9d5f", 140 | "sha256:59f5332f86f3ccd3ac94674fe91eae6e8aca26da7c6588917cabd0fe22af106d", 141 | "sha256:72be07a21b0f379987c4ec59bc86834a9719a2f9cfb49606a4d4e34dae9aa549", 142 | "sha256:7b3b8c015e545fa30e42205fc1115b7c6afcb6acec790ce3f330a06323730523", 143 | "sha256:7fbb6389c20aff4c3257e89bb1787effffcaf05c32d937c00094ae45846bffd5", 144 | "sha256:828d9911acc483672a2bae1cc1bf79f591eb3338faad1f2c798aa2f45459a318", 145 | "sha256:a9460dac973deccc6ff2d90f18fd105cbaada147f84e5917ed79374dcb237758", 146 | "sha256:aade50f9a1b9d20f6aabe88e8999b10db57218f5c31950160f3f7957dd64e07c", 147 | "sha256:ac9e5b282d1f0771a8310ed974afe1961ec31e9ae787d052c0e504ea46ae323a", 148 | "sha256:ba41bd21b89c6713f7077b5f7d4a1c452989190aad5704e215560a266a1ecbab", 149 | "sha256:c309dbbd6c155e961bfd6893496afa5cd184cce6f7dffd87ea68ee048b6f97e1", 150 | "sha256:cfc21b1f80d4655ffa776c505a2576b4d148bbc52bb3e33fedbf6cfbdbc09d1b", 151 | "sha256:d7b26e0b6d81bf14c1239e6a891ac1303a7e882512d990ec330369c7269226d7", 152 | "sha256:f8b7a3e05235ce58a38bf317f71a5cb4ab45d3b34dc57421dd8cea48e0e4023e" 153 | ], 154 | "index": "pypi", 155 | "version": "==4.19.19" 156 | }, 157 | "pyserial": { 158 | "hashes": [ 159 | "sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627", 160 | "sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8" 161 | ], 162 | "index": "pypi", 163 | "version": "==3.4" 164 | }, 165 | "requests": { 166 | "hashes": [ 167 | "sha256:99dcfdaaeb17caf6e526f32b6a7b780461512ab3f1d992187801694cba42770c", 168 | "sha256:a84b8c9ab6239b578f22d1c21d51b696dcfe004032bb80ea832398d6909d7279" 169 | ], 170 | "index": "pypi", 171 | "version": "==2.20.0" 172 | }, 173 | "urllib3": { 174 | "hashes": [ 175 | "sha256:4c291ca23bbb55c76518905869ef34bdd5f0e46af7afe6861e8375643ffee1a0", 176 | "sha256:9a247273df709c4fedb38c711e44292304f73f39ab01beda9f6b9fc375669ac3" 177 | ], 178 | "index": "pypi", 179 | "version": "==1.24.2" 180 | }, 181 | "zeroconf": { 182 | "hashes": [ 183 | "sha256:6e3f1e7b5871e3d1410ac29b9fb85aafc1e2d661ed596b07a6f84559a475efcb", 184 | "sha256:c2879bbc1365f430f02cfbcca508c57f1237e5fa2526c0b060b8165827b2c59f" 185 | ], 186 | "index": "pypi", 187 | "version": "==0.20.0" 188 | } 189 | }, 190 | "develop": {} 191 | } 192 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sensor.Community flashing tool 2 | 3 | 4 | ## Modified flasher to burn the Wifi credentials at once. 5 | 6 | spiffsgen.py added and kindly modified by @DeeKey 7 | 8 | ![Modified GUI](images/modified_GUI2.png) 9 | 10 | config.json example: 11 | ```json 12 | { 13 | "SOFTWARE_VERSION":"NRZ-2020-133", 14 | "current_lang":"FR", 15 | "wlanssid":"Livebox-7E78", 16 | "wlanpwd":"i0c_YSNS", 17 | "www_username":"admin", 18 | "www_password":"", 19 | "fs_ssid":"airRohr-2509507", 20 | "fs_pwd":"", 21 | "www_basicauth_enabled":false, 22 | "dht_read":false, 23 | "htu21d_read":false, 24 | "ppd_read":false, 25 | "sds_read":false, 26 | "pms_read":true, 27 | "hpm_read":false, 28 | "npm_read":false, 29 | "sps30_read":false, 30 | "bmp_read":false, 31 | "bmx280_read":true, 32 | "sht3x_read":false, 33 | "ds18b20_read":false, 34 | "dnms_read":false, 35 | "dnms_correction":"0.0", 36 | "temp_correction":"0.0", 37 | "gps_read":false, 38 | "send2dusti":true, 39 | "ssl_dusti":false, 40 | "send2madavi":true, 41 | "ssl_madavi":false, 42 | "send2sensemap":false, 43 | "send2fsapp":false, 44 | "send2aircms":false, 45 | "send2csv":false, 46 | "auto_update":true, 47 | "use_beta":false, 48 | "has_display":false, 49 | "has_sh1106":false, 50 | "has_flipped_display":false, 51 | "has_lcd1602":false, 52 | "has_lcd1602_27":true, 53 | "has_lcd2004":false, 54 | "has_lcd2004_27":false, 55 | "display_wifi_info":true, 56 | "display_device_info":true, 57 | "debug":3, 58 | "sending_intervall_ms":145000, 59 | "time_for_wifi_config":600000, 60 | "senseboxid":"", 61 | "send2custom":false, 62 | "host_custom":"192.168.234.1", 63 | "url_custom":"/data.php", 64 | "port_custom":80, 65 | "user_custom":"", 66 | "pwd_custom":"", 67 | "ssl_custom":false, 68 | "send2influx":false, 69 | "host_influx":"influx.server", 70 | "url_influx":"/write?db=sensorcommunity", 71 | "port_influx":8086, 72 | "user_influx":"", 73 | "pwd_influx":"", 74 | "measurement_name_influx":"feinstaub", 75 | "ssl_influx":false 76 | } 77 | ``` 78 | ## Binary builds and downloads 79 | 80 | Our main target is having working prebuilt binaries for users to simply download and run, to avoid all the setup below. 81 | See [releases](https://github.com/opendata-stuttgart/airrohr-firmware-flasher/releases) to download the software for your system. 82 | 83 | Note: you need drivers for the USB2serial chipset: 84 | 85 | * Drivers for NodeMCU v3 (CH340) 86 | 87 | * [Windows](http://www.wch.cn/downloads/file/5.html) (Windows 10 should be able to automatically download these; [2018/09/04 v3.4 mirror](https://d.inf.re/luftdaten/CH341SER.ZIP)) 88 | * [MacOS](http://www.wch.cn/downloads/file/178.html) ([2018/09/04 v1.4 mirror](https://d.inf.re/luftdaten/CH341SER_MAC.ZIP)) 89 | 90 | * Drivers for NodeMCU v2 ([CP2102](https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers)) 91 | 92 | * [Windows 10](https://www.silabs.com/documents/public/software/CP210x_Universal_Windows_Driver.zip), [Windows 7/8/8.1](https://www.silabs.com/documents/public/software/CP210x_Windows_Drivers.zip) (Windows 10 should be able to automatically download these) 93 | * [MacOS](https://www.silabs.com/documents/public/software/Mac_OSX_VCP_Driver.zip) 94 | 95 | On Linux you should not need drivers, as they are usually already there, but you need to check that you as user have the permission to use the serial devices (otherwise you likely see an error like *serial.serialutil.SerialException: [Errno 13] could not open port /dev/ttyUSB0: [Errno 13] Permission denied: '/dev/ttyUSB0'*). 96 | 97 | * Debian/Ubuntu: add your user to the group `dialout` with `sudo usermod -a -G dialout ${USER}` (you may need to restart the desktop to apply your new group settings). 98 | 99 | ## Using the software 100 | 101 | Linux users: Please check that the downloaded file is executable. Otherwise set the executable bit with `chmod u+x ` 102 | 103 | To flash a device: 104 | 105 | 1. connect the ESP8266 with a USB cable to your computer (micro-USB) 106 | 2. launch the downloaded software 107 | 3. check/select the serial device 108 | 4. select the firmware (`latest_.bin` should be fine for any setup) 109 | 5. press button *Upload* 110 | 6. wait for a few seconds to finish the flashing procedure 111 | 7. take a note of the **Sensor ID** written in the Window status bar at the bottom - you will need it to register the sensor 112 | 113 | If you want to delete/reset all settings on the device (e.g. the Wifi credentials) you can use the `Erase Flash` button (exists in software version 0.2.2 and above). 114 | 115 | ### Screenshots 116 | 117 | ![Select the firmware](images/airrohr-flasher_select_firmware.png) 118 | 119 | ![The upload button starts the flashing procedure](images/airrohr-flasher_flash_progress.png "The upload button starts the flashing procedure") 120 | 121 | ![Flashing is finished, take a note of the sensor ID (here: 1596171)](images/airrohr-flasher_flash_finished.png "Flashing is finished, take a note of the sensor ID (here: 1596171)") 122 | 123 | 124 | ### Further steps 125 | 126 | Now your device is flashed, you may now 127 | 128 | 1. connect the sensors to it, 129 | 2. configure the WiFi (connect your computer/smartphone to the AP `feinstaubsensor-` and open up http://192.168.4.1/ in a browser) and 130 | 3. finally register the sensor at https://devices.sensor.community/ with your *Sensor ID* 131 | 132 | 133 | 134 | ## Building the software 135 | 136 | ### Linux 137 | 138 | Currently Linux builds require *Python 3.6* (but 3.7 and 3.9 seems to work fine as 139 | well), GNU make and Qt Linguist tools. Following packages should suffice on 140 | Ubuntu (tested on Ubuntu 18.04 and Ubuntu 20.04): 141 | 142 | sudo apt install qttools5-dev-tools pyqt5-dev-tools qt5-default python3-pip python3.6 make 143 | 144 | On Fedora (tested on Fedora 31): 145 | 146 | sudo dnf install qt5-qttools-devel python3-devel make 147 | sudo ln -s /usr/bin/lrelease-qt5 /usr/bin/lrelease 148 | 149 | If you want to build in a python virtualenv (recommended) you should create one with 150 | 151 | pip install virtualenvwrapper 152 | mkvirtualenv -p "$(which python3)" airrohr-firmware-flasher 153 | # deactivate # to leave the virtualenv later 154 | # workon airrohr-firmware-flasher to re-enter virtualenv 155 | 156 | Then, to install python dependencies and build the binary use: 157 | 158 | make deps dist 159 | 160 | The built binary will be `dist/airrohr-flasher`. 161 | 162 | ### Windows 163 | 164 | Currently Windows builds require *Python 3.6* installed system-wide and added to 165 | `%PATH%`. 166 | 167 | To install python and cygwin dependencies and build everything use 168 | `deploy\windows-build.bat` batch script. 169 | 170 | ### MacOS 171 | Currently MacOS builds require *Python 3.6*, `dmgbuild` tool (`pip3 install 172 | dmgbuild`) and Qt SDK installed (just the "Qt > 173 | 5... > macOS" part in installer) with following added to $PATH (check version part): 174 | 175 | export PATH="$HOME/Qt/5.11.1/clang_64/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:$PATH" 176 | 177 | Then just install dependencies and build everything using: 178 | 179 | make deps dmg 180 | 181 | ### Binary build debugging 182 | 183 | In case an error occurs in early stages of application startup, user will be 184 | presented with a "Failed to execute script airrohr-flasher.exe" message. In order 185 | to see actual source of that error, `console` flag in `airrohr-flasher.spec` can 186 | be switched to `True`. In Windows this will make application output a proper 187 | stack trace to `cmd` popup. 188 | 189 | ## Development 190 | 191 | Both build & runtime requirements are defined in `requirements.txt` file. In 192 | order to install these use the following command: 193 | 194 | pip install -r requirements.txt 195 | 196 | To manage dynamic UI and translation binaries generation we use a very simple 197 | GNU make-based build system. 198 | 199 | To simply build everything needed to run `airrohr-flasher.py` run: 200 | 201 | make 202 | 203 | To build and run use: 204 | 205 | make run 206 | 207 | To remove all build artifacts use: 208 | 209 | make clean 210 | 211 | All requirements are set up using wildcards, so, in theory, `Makefile` shouldn't 212 | need much changes in near future. 213 | 214 | ## Translations 215 | 216 | All translation files are located in the `i18n` folder. The files have to be named 217 | with the language name accourding to https://doc.qt.io/qt-5/qlocale.html#Language-enum (part after `QLocale::`). 218 | 219 | The translations can be done with the following tool: 220 | https://github.com/thurask/Qt-Linguist/releases (Windows binaries, sources available) 221 | 222 | Manual translation can be done by editing the .ts file. 223 | 224 | ### If english texts are added or changed 225 | 226 | In order to rebuild `*.ts` files use: 227 | 228 | make i18n-update 229 | -------------------------------------------------------------------------------- /airrohr-flasher.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python -*- 2 | 3 | block_cipher = None 4 | 5 | import subprocess 6 | import datetime 7 | 8 | commit = 'devel' 9 | 10 | try: 11 | commit = subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).strip().decode('utf-8') 12 | except Exception as exc: 13 | print("Can't extract git head, will use a dummy commit ID.") 14 | print(exc) 15 | 16 | builddate = datetime.datetime.now().strftime('%Y%m%d') 17 | 18 | with open('airrohrFlasher/_buildid.py', 'w') as fd: 19 | fd.write('''# This file is autogenerated in airrohr-flasher.spec file 20 | commit = "{commit}" 21 | builddate = "{builddate}"'''.format(commit=commit, builddate=builddate)) 22 | 23 | a = Analysis(['airrohr-flasher.py'], 24 | pathex=['.'], 25 | binaries=[], 26 | datas=[('assets/', './assets'), ('i18n/*.qm', './i18n')], 27 | hiddenimports=['PyQt5.sip'], 28 | hookspath=[], 29 | runtime_hooks=[], 30 | excludes=[], 31 | win_no_prefer_redirects=False, 32 | win_private_assemblies=False, 33 | cipher=block_cipher) 34 | pyz = PYZ(a.pure, a.zipped_data, 35 | cipher=block_cipher) 36 | exe = EXE(pyz, 37 | a.scripts, 38 | a.binaries, 39 | a.zipfiles, 40 | a.datas, 41 | name='airrohr-flasher', 42 | debug=False, 43 | strip=False, 44 | upx=True, 45 | runtime_tmpdir=None, 46 | console=False, 47 | icon='assets/logo.ico') 48 | 49 | # This is used on MacOS only 50 | app = BUNDLE(exe, 51 | name='Sensor.Community Airrohr Flasher.app', 52 | icon='assets/logo.icns', 53 | bundle_identifier=None) 54 | -------------------------------------------------------------------------------- /airrohrFlasher/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '0.3.5' 2 | -------------------------------------------------------------------------------- /airrohrFlasher/consts.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from .qtvariant import QtCore 4 | 5 | 6 | # Firmware update repository 7 | UPDATE_REPOSITORY = 'https://firmware.sensor.community/airrohr/update/' 8 | 9 | # URI prefixes (protocol parts, essentially) to be downloaded using requests 10 | ALLOWED_PROTO = ('http://', 'https://') 11 | 12 | # vid/pid pairs of known NodeMCU/ESP8266 development boards 13 | PREFERED_PORTS = [ 14 | # CH341 15 | (0x1A86, 0x7523), 16 | 17 | # CP2102 18 | (0x10c4, 0xea60), 19 | ] 20 | 21 | ROLE_DEVICE = QtCore.Qt.UserRole + 1 22 | 23 | if sys.platform.startswith('darwin'): 24 | DRIVERS_URL = 'http://www.wch.cn/downloads/CH341SER_MAC_ZIP.html' 25 | elif sys.platform.startswith(('cygwin', 'win32')): 26 | DRIVERS_URL = 'http://www.wch.cn/downloads/CH341SER_ZIP.html' 27 | else: 28 | DRIVERS_URL = None 29 | -------------------------------------------------------------------------------- /airrohrFlasher/qtvariant.py: -------------------------------------------------------------------------------- 1 | """PyQt5 & PySide2 compatiblity layer stub. This will be updated when PySide2 2 | gets mature enough""" 3 | 4 | from PyQt5 import QtGui, QtCore, QtWidgets 5 | 6 | # Replace nonsense prefixes 7 | QtCore.Signal = QtCore.pyqtSignal 8 | QtCore.Slot = QtCore.pyqtSlot 9 | -------------------------------------------------------------------------------- /airrohrFlasher/utils.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import re 3 | import logging 4 | 5 | from .qtvariant import QtCore 6 | 7 | 8 | file_index_re = re.compile(r'([^<]*)') 9 | 10 | 11 | def indexof(path): 12 | """Returns list of filenames parsed off "Index of" page""" 13 | resp = requests.get(path) 14 | return [a for a, b in file_index_re.findall(resp.text) if a == b] 15 | 16 | 17 | class QuickThread(QtCore.QThread): 18 | error = QtCore.Signal([str]) 19 | 20 | """Provides similar API to threading.Thread but with additional error 21 | reporting based on Qt Signals""" 22 | def __init__(self, parent=None, target=None, args=None, kwargs=None, 23 | error=None): 24 | super(QuickThread, self).__init__(parent) 25 | self.target = target or self.target 26 | self.args = args or [] 27 | self.kwargs = kwargs or {} 28 | self.error = error or self.error 29 | 30 | def run(self): 31 | try: 32 | self.target(*self.args, **self.kwargs) 33 | except Exception as exc: 34 | if self.error: 35 | self.error.emit(str(exc)) 36 | # raise here causes windows builds to just die. ¯\_(ツ)_/¯ 37 | logging.exception('Unhandled exception') 38 | 39 | @classmethod 40 | def wrap(cls, func): 41 | """Decorator that wraps function in a QThread. Calling resulting 42 | function starts and creates QThread, with parent set to [self]""" 43 | def wrapped(*args, **kwargs): 44 | th = cls(parent=args[0], target=func, args=args, kwargs=kwargs, 45 | error=kwargs.pop('error', None)) 46 | func._th = th 47 | th.start() 48 | 49 | return th 50 | 51 | wrapped.running = lambda: (hasattr(func, '_th') and 52 | func._th.isRunning()) 53 | return wrapped 54 | 55 | def target(self): 56 | pass 57 | -------------------------------------------------------------------------------- /airrohrFlasher/workers.py: -------------------------------------------------------------------------------- 1 | import time 2 | import socket 3 | 4 | import serial 5 | import serial.tools.list_ports 6 | import zeroconf 7 | 8 | from .qtvariant import QtCore 9 | from .utils import indexof, QuickThread 10 | from .consts import UPDATE_REPOSITORY 11 | 12 | 13 | class PortDetectThread(QuickThread): 14 | interval = 1.0 15 | portsUpdate = QtCore.Signal([list]) 16 | 17 | def target(self): 18 | """Checks list of available ports and emits signal when necessary""" 19 | 20 | ports = None 21 | while True: 22 | new_ports = serial.tools.list_ports.comports() 23 | 24 | if ports is None or [p.name for p in ports] != [p.name for p in new_ports]: 25 | self.portsUpdate.emit(new_ports) 26 | 27 | time.sleep(self.interval) 28 | 29 | ports = new_ports 30 | 31 | 32 | class FirmwareListThread(QuickThread): 33 | listLoaded = QtCore.Signal([list]) 34 | 35 | def target(self): 36 | """Downloads list of available firmware updates in separate thread.""" 37 | self.listLoaded.emit(list(indexof(UPDATE_REPOSITORY))) 38 | 39 | 40 | class ZeroconfDiscoveryThread(QuickThread): 41 | deviceDiscovered = QtCore.Signal(str, str, object) 42 | browser = None 43 | 44 | def target(self): 45 | """This thread scans for Bonjour/mDNS devices and emits 46 | deviceDiscovered signal with its name, address and info object""" 47 | self.zc = zeroconf.Zeroconf() 48 | self.browser = zeroconf.ServiceBrowser( 49 | self.zc, "_http._tcp.local.", handlers=[self.on_state_change]) 50 | while True: 51 | time.sleep(0.5) 52 | 53 | def on_state_change(self, zeroconf, service_type, name, state_change): 54 | info = zeroconf.get_service_info(service_type, name) 55 | if info: 56 | for addr in info.parsed_addresses(): 57 | self.deviceDiscovered.emit(name, addr, info) 58 | 59 | def stop(self): 60 | if self.browser: 61 | self.browser.cancel() 62 | -------------------------------------------------------------------------------- /assets/logo.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/assets/logo.icns -------------------------------------------------------------------------------- /assets/logo.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/assets/logo.ico -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/assets/logo.png -------------------------------------------------------------------------------- /deploy/dmgbuild_settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | import os.path 5 | import sys 6 | 7 | # Before Python 3.4, use biplist; afterwards, use plistlib 8 | # Fix based on this issue of dmgbuild, 9 | # see https://github.com/dmgbuild/dmgbuild/issues/35 10 | # for additional details. 11 | if sys.version_info < (3, 4): 12 | import biplist 13 | 14 | def read_plist(path): 15 | return biplist.readPlist(path) 16 | else: 17 | import plistlib 18 | 19 | def read_plist(path): 20 | with open(path, 'rb') as f: 21 | return plistlib.load(f) 22 | 23 | # 24 | # Example settings file for dmgbuild 25 | # 26 | 27 | # Use like this: dmgbuild -s settings.py "Test Volume" test.dmg 28 | 29 | # You can actually use this file for your own application (not just TextEdit) 30 | # by doing e.g. 31 | # 32 | # dmgbuild -s settings.py -D app=/path/to/My.app "My Application" MyApp.dmg 33 | 34 | # .. Useful stuff .............................................................. 35 | 36 | application = defines.get('app', '/Applications/TextEdit.app') 37 | appname = os.path.basename(application) 38 | 39 | def icon_from_app(app_path): 40 | plist_path = os.path.join(app_path, 'Contents', 'Info.plist') 41 | plist = read_plist(plist_path) 42 | icon_name = plist['CFBundleIconFile'] 43 | icon_root,icon_ext = os.path.splitext(icon_name) 44 | if not icon_ext: 45 | icon_ext = '.icns' 46 | icon_name = icon_root + icon_ext 47 | return os.path.join(app_path, 'Contents', 'Resources', icon_name) 48 | 49 | # .. Basics .................................................................... 50 | 51 | # Uncomment to override the output filename 52 | # filename = 'test.dmg' 53 | 54 | # Uncomment to override the output volume name 55 | # volume_name = 'Test' 56 | 57 | # Volume format (see hdiutil create -help) 58 | format = defines.get('format', 'UDBZ') 59 | 60 | # Volume size (must be large enough for your files) 61 | size = defines.get('size', '100M') 62 | 63 | # Files to include 64 | files = [ application ] 65 | 66 | # Symlinks to create 67 | symlinks = { 'Applications': '/Applications' } 68 | 69 | # Volume icon 70 | # 71 | # You can either define icon, in which case that icon file will be copied to the 72 | # image, *or* you can define badge_icon, in which case the icon file you specify 73 | # will be used to badge the system's Removable Disk icon 74 | # 75 | #icon = '/path/to/icon.icns' 76 | badge_icon = icon_from_app(application) 77 | 78 | # Where to put the icons 79 | icon_locations = { 80 | appname: (140, 120), 81 | 'Applications': (500, 120) 82 | } 83 | 84 | # .. Window configuration ...................................................... 85 | 86 | # Background 87 | # 88 | # This is a STRING containing any of the following: 89 | # 90 | # #3344ff - web-style RGB color 91 | # #34f - web-style RGB color, short form (#34f == #3344ff) 92 | # rgb(1,0,0) - RGB color, each value is between 0 and 1 93 | # hsl(120,1,.5) - HSL (hue saturation lightness) color 94 | # hwb(300,0,0) - HWB (hue whiteness blackness) color 95 | # cmyk(0,1,0,0) - CMYK color 96 | # goldenrod - X11/SVG named color 97 | # builtin-arrow - A simple built-in background with a blue arrow 98 | # /foo/bar/baz.png - The path to an image file 99 | # 100 | # The hue component in hsl() and hwb() may include a unit; it defaults to 101 | # degrees ('deg'), but also supports radians ('rad') and gradians ('grad' 102 | # or 'gon'). 103 | # 104 | # Other color components may be expressed either in the range 0 to 1, or 105 | # as percentages (e.g. 60% is equivalent to 0.6). 106 | background = 'builtin-arrow' 107 | 108 | show_status_bar = False 109 | show_tab_view = False 110 | show_toolbar = False 111 | show_pathbar = False 112 | show_sidebar = False 113 | sidebar_width = 180 114 | 115 | # Window position in ((x, y), (w, h)) format 116 | window_rect = ((100, 100), (640, 280)) 117 | 118 | # Select the default view; must be one of 119 | # 120 | # 'icon-view' 121 | # 'list-view' 122 | # 'column-view' 123 | # 'coverflow' 124 | # 125 | default_view = 'icon-view' 126 | 127 | # General view configuration 128 | show_icon_preview = False 129 | 130 | # Set these to True to force inclusion of icon/list view settings (otherwise 131 | # we only include settings for the default view) 132 | include_icon_view_settings = 'auto' 133 | include_list_view_settings = 'auto' 134 | 135 | # .. Icon view configuration ................................................... 136 | 137 | arrange_by = None 138 | grid_offset = (0, 0) 139 | grid_spacing = 100 140 | scroll_position = (0, 0) 141 | label_pos = 'bottom' # or 'right' 142 | text_size = 16 143 | icon_size = 128 144 | 145 | # .. List view configuration ................................................... 146 | 147 | # Column names are as follows: 148 | # 149 | # name 150 | # date-modified 151 | # date-created 152 | # date-added 153 | # date-last-opened 154 | # size 155 | # kind 156 | # label 157 | # version 158 | # comments 159 | # 160 | list_icon_size = 16 161 | list_text_size = 12 162 | list_scroll_position = (0, 0) 163 | list_sort_by = 'name' 164 | list_use_relative_dates = True 165 | list_calculate_all_sizes = False, 166 | list_columns = ('name', 'date-modified', 'size', 'kind', 'date-added') 167 | list_column_widths = { 168 | 'name': 300, 169 | 'date-modified': 181, 170 | 'date-created': 181, 171 | 'date-added': 181, 172 | 'date-last-opened': 181, 173 | 'size': 97, 174 | 'kind': 115, 175 | 'label': 100, 176 | 'version': 75, 177 | 'comments': 300, 178 | } 179 | list_column_sort_directions = { 180 | 'name': 'ascending', 181 | 'date-modified': 'descending', 182 | 'date-created': 'descending', 183 | 'date-added': 'descending', 184 | 'date-last-opened': 'descending', 185 | 'size': 'descending', 186 | 'kind': 'ascending', 187 | 'label': 'ascending', 188 | 'version': 'ascending', 189 | 'comments': 'ascending', 190 | } 191 | -------------------------------------------------------------------------------- /deploy/mkicns: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | # Builds .icns file from a single .png file 4 | # 5 | 6 | set -e 7 | 8 | filename="${1%.*}" 9 | mkdir "$filename".iconset 10 | for i in 16 32 128 256 ; do 11 | n=$(( i * 2 )) 12 | sips -z $i $i "$1" --out "$filename".iconset/icon_${i}x${i}.png 13 | sips -z $n $n "$1" --out "$filename".iconset/icon_${i}x${i}@2x.png 14 | [[ $n -eq 512 ]] && \ 15 | sips -z $n $n "$1" --out "$filename".iconset/icon_${n}x${n}.png 16 | (( i++ )) 17 | done 18 | cp "$1" "$filename".iconset/icon_512x512@2x.png 19 | iconutil -c icns "$filename".iconset 20 | rm -r "$filename".iconset 21 | -------------------------------------------------------------------------------- /deploy/windows-build.bat: -------------------------------------------------------------------------------- 1 | cd %~dp0\.. 2 | 3 | if not exist build mkdir build 4 | 5 | rem Download python installer 6 | if not exist build\python-installer.exe powershell -Command "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; (new-object System.Net.WebClient).DownloadFile('https://www.python.org/ftp/python/3.6.7/python-3.6.7-amd64.exe', 'build\python-installer.exe')" 7 | if not exist %LocalAppData%\Programs\Python\Python36 build\python-installer.exe InstallAllUsers=0 Include_launcher=0 Include_test=0 /passive 8 | 9 | rem PATH is only reloaded on reboot/login, so we need to force it here 10 | set PATH=%LocalAppData%\Programs\Python\Python36\;%LocalAppData%\Programs\Python\Python36\Scripts\;%LocalAppData%\Roaming\Python\Python36\;%LocalAppData%\Roaming\Python\Python36\Scripts\;%PATH% 11 | copy %LocalAppData%\Programs\Python\Python36\python.exe %LocalAppData%\Programs\Python\Python36\python3.exe 12 | 13 | rem Download cygwin installer 14 | if not exist build\cygwin-x86.exe powershell -Command "(new-object System.Net.WebClient).DownloadFile('https://cygwin.com/setup-x86.exe', 'build\cygwin-x86.exe')" 15 | 16 | rem Install required Cygwin packages 17 | if not exist build\cygwin build\cygwin-x86.exe --site http://cygwin.mirror.constant.com ^ 18 | --no-shortcuts ^ 19 | --no-desktop ^ 20 | --quiet-mode ^ 21 | --root "%cd%\build\cygwin" ^ 22 | --arch x86 ^ 23 | --local-package-dir "%cd%\build\cygwin-packages" ^ 24 | --verbose ^ 25 | --prune-install ^ 26 | --no-admin ^ 27 | --packages qt5-linguist-tools,make 28 | 29 | build\cygwin\bin\bash.exe --login -i -c "ln -s `which lrelease-qt5` /usr/bin/lrelease; cd \"%cd%\" && make deps dist" 30 | -------------------------------------------------------------------------------- /gui/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/gui/__init__.py -------------------------------------------------------------------------------- /i18n/Chinese.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | 正在加载固件列表... 9 | 10 | 11 | 12 | No boards found 13 | 没有发现板块 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | 您是否安装了&lt;a href="{drivers_url}"&gt;驱动程序&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | 其他... 24 | 25 | 26 | 27 | No device selected. 28 | 没有选择设备。 29 | 30 | 31 | 32 | No version selected. 33 | 没有选择版本。 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | 无效的版本文件不存在 39 | 40 | 41 | 42 | Work in progess... 43 | 进展中的工作... 44 | 45 | 46 | 47 | Downloading... 48 | 49 | 50 | 51 | 52 | Connecting... 53 | 连接... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | 已连接。芯片类型。{chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | 擦除完毕! 64 | 65 | 66 | 67 | Erasing in progress... 68 | 擦除中... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | 写入0x{地址:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | 在{时间:.2f}秒内完成。传感器ID:{sensor_id}。 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | 传感器.社区 - Airrohr Flasher (v{version}) 84 | 85 | 86 | 87 | Firmware version: 88 | 固件版本。 89 | 90 | 91 | 92 | Upload 93 | 上传 94 | 95 | 96 | 97 | Erase Flash 98 | 擦除闪存 99 | 100 | 101 | 102 | Expert mode 103 | 专家模式 104 | 105 | 106 | 107 | Board: 108 | 董事会: 109 | 110 | 111 | 112 | Baudrate: 113 | 波特率。 114 | 115 | 116 | 117 | Flashing 118 | 閃爍 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | 双击打开配置页面。 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | 本地网络中检测到的传感器。 129 | 130 | 131 | 132 | Refresh 133 | 刷新 134 | 135 | 136 | 137 | Discovery 138 | 发现 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | 在传感器出现问题的情况下,串行监视器可以用来查看传感器通过USB电缆发送的日志。 144 | 145 | 146 | 147 | Connect 148 | 连接 149 | 150 | 151 | 152 | Serial Monitor 153 | 串行监控 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Build {build_id}。 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;由&lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | 关于我们 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Czech.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Načítání seznamu firmwaru... 9 | 10 | 11 | 12 | No boards found 13 | Nebyly nalezeny žádné desky 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Nainstalovali jste &lt;a href="{drivers_url}"&gt;ovladače&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Ostatní... 24 | 25 | 26 | 27 | No device selected. 28 | Není vybráno žádné zařízení. 29 | 30 | 31 | 32 | No version selected. 33 | Není vybrána žádná verze. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Neplatná verze souboru neexistuje 39 | 40 | 41 | 42 | Work in progess... 43 | Práce probíhají... 44 | 45 | 46 | 47 | Downloading... 48 | Stahování... 49 | 50 | 51 | 52 | Connecting... 53 | Připojení... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Připojeno. Typ čipu: Typ čipu: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Vymazání dokončeno! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Probíhá mazání... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Zápis na 0x{adresa:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Dokončeno za {čas:.2f} sekund. ID senzoru: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{verze}) 84 | 85 | 86 | 87 | Firmware version: 88 | Verze firmwaru: 89 | 90 | 91 | 92 | Upload 93 | Nahrát 94 | 95 | 96 | 97 | Erase Flash 98 | Vymazání paměti Flash 99 | 100 | 101 | 102 | Expert mode 103 | Expertní režim 104 | 105 | 106 | 107 | Board: 108 | Představenstvo: 109 | 110 | 111 | 112 | Baudrate: 113 | Přenosová rychlost: 114 | 115 | 116 | 117 | Flashing 118 | Blikání 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Dvojitým kliknutím otevřete konfigurační stránku. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Senzory detekované v místní síti: 129 | 130 | 131 | 132 | Refresh 133 | Obnovit 134 | 135 | 136 | 137 | Discovery 138 | Discovery 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | V případě problémů se snímačem lze k prohlížení protokolů odesílaných snímačem přes kabel USB použít nástroj Serial Monitor. 144 | 145 | 146 | 147 | Connect 148 | Připojení 149 | 150 | 151 | 152 | Serial Monitor 153 | Sériový monitor 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Stavba {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Vyvinuto &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | O stránkách 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Danish.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Indlæser firmwareliste... 9 | 10 | 11 | 12 | No boards found 13 | Ingen brædder fundet 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Har du installeret &lt;a href="{drivers_url}"&gt;driverne&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Andre... 24 | 25 | 26 | 27 | No device selected. 28 | Der er ikke valgt nogen enhed. 29 | 30 | 31 | 32 | No version selected. 33 | Der er ikke valgt nogen version. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Der findes ikke en ugyldig versionsfil 39 | 40 | 41 | 42 | Work in progess... 43 | Arbejdet er i gang... 44 | 45 | 46 | 47 | Downloading... 48 | Downloading... 49 | 50 | 51 | 52 | Connecting... 53 | Tilslutning... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Tilsluttet. Chip type: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Sletning afsluttet! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Sletning i gang... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Skriver på 0x{adresse:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Færdig om {time:.2f} sekunder. Sensor-ID: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{{version}) 84 | 85 | 86 | 87 | Firmware version: 88 | Firmware-version: 89 | 90 | 91 | 92 | Upload 93 | Overfør 94 | 95 | 96 | 97 | Erase Flash 98 | Slet Flash 99 | 100 | 101 | 102 | Expert mode 103 | Eksperttilstand 104 | 105 | 106 | 107 | Board: 108 | Bestyrelsen: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudrate: 114 | 115 | 116 | 117 | Flashing 118 | Blinkende 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Dobbeltklik for at åbne konfigurationssiden. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Sensorer fundet i det lokale netværk: 129 | 130 | 131 | 132 | Refresh 133 | Opdater 134 | 135 | 136 | 137 | Discovery 138 | Opdagelse 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | I tilfælde af problemer med sensoren kan Serial Monitor bruges til at gennemgå de logfiler, der sendes af sensoren via USB-kabel. 144 | 145 | 146 | 147 | Connect 148 | Forbind 149 | 150 | 151 | 152 | Serial Monitor 153 | Seriel skærm 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Byg {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Udviklet af &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | Om 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Dutch.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Laadt firmware lijst... 9 | 10 | 11 | 12 | No boards found 13 | Geen borden gevonden 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Hebt u &lt;a href="{drivers_url}"&gt;de drivers&lt;a&gt; geïnstalleerd? 19 | 20 | 21 | 22 | Others... 23 | Anderen... 24 | 25 | 26 | 27 | No device selected. 28 | Geen apparaat geselecteerd. 29 | 30 | 31 | 32 | No version selected. 33 | Geen versie geselecteerd. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Ongeldig versiebestand bestaat niet 39 | 40 | 41 | 42 | Work in progess... 43 | Werk in uitvoering... 44 | 45 | 46 | 47 | Downloading... 48 | Het downloaden... 49 | 50 | 51 | 52 | Connecting... 53 | Aansluiten... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Aangesloten. Chip type: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Wissen voltooid! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Wissen bezig... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Schrijven naar 0x{adres:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Voltooid in {tijd:.2f} seconden. Sensor ID: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{versie}) 84 | 85 | 86 | 87 | Firmware version: 88 | Firmware versie: 89 | 90 | 91 | 92 | Upload 93 | Upload 94 | 95 | 96 | 97 | Erase Flash 98 | Flash wissen 99 | 100 | 101 | 102 | Expert mode 103 | Expert mode 104 | 105 | 106 | 107 | Board: 108 | Bestuur: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudrate: 114 | 115 | 116 | 117 | Flashing 118 | Knipperend 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Dubbelklik om de configuratiepagina te openen. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Sensoren gedetecteerd in lokaal netwerk: 129 | 130 | 131 | 132 | Refresh 133 | Vernieuwen 134 | 135 | 136 | 137 | Discovery 138 | Ontdekking 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | In geval van problemen met de sensor kunnen met Serial Monitor logbestanden worden bekeken die door de sensor via de USB-kabel worden verzonden. 144 | 145 | 146 | 147 | Connect 148 | Connect 149 | 150 | 151 | 152 | Serial Monitor 153 | Seriële Monitor 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Build {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Ontwikkeld door &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | Over 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Estonian.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Firmware nimekirja laadimine... 9 | 10 | 11 | 12 | No boards found 13 | Laudu ei leitud 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Kas olete paigaldanud &lt;a href="{drivers_url}"&gt;draiverid&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Teised... 24 | 25 | 26 | 27 | No device selected. 28 | Seadet ei ole valitud. 29 | 30 | 31 | 32 | No version selected. 33 | Ühtegi versiooni ei ole valitud. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Väärat versiooni faili ei ole olemas 39 | 40 | 41 | 42 | Work in progess... 43 | Käimasolev töö... 44 | 45 | 46 | 47 | Downloading... 48 | Allalaadimine... 49 | 50 | 51 | 52 | Connecting... 53 | Ühendamine... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Ühendatud. Kiibi tüüp: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Kustutamine lõpetatud! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Kustutamine käimas... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Kirjutamine aadressil 0x{aadress:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Valmis {time:.2f} sekundiga. Anduri ID: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{versioon}) 84 | 85 | 86 | 87 | Firmware version: 88 | Püsivara versioon: 89 | 90 | 91 | 92 | Upload 93 | Laadige üles 94 | 95 | 96 | 97 | Erase Flash 98 | Flashi kustutamine 99 | 100 | 101 | 102 | Expert mode 103 | Ekspertrežiim 104 | 105 | 106 | 107 | Board: 108 | Juhatus: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudrate: 114 | 115 | 116 | 117 | Flashing 118 | Vilkuv 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Konfigureerimislehe avamiseks tehke topeltklõps. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Kohalikus võrgus tuvastatud andurid: 129 | 130 | 131 | 132 | Refresh 133 | Värskenda 134 | 135 | 136 | 137 | Discovery 138 | Discovery 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | Anduriga seotud probleemide korral saab Serial Monitor'i abil vaadata anduri poolt USB-kaabli kaudu saadetud logisid. 144 | 145 | 146 | 147 | Connect 148 | Ühendage 149 | 150 | 151 | 152 | Serial Monitor 153 | Seeriamonitor 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Build {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Kasutaja &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | kohta 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Finnish.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Firmware-luettelon lataaminen... 9 | 10 | 11 | 12 | No boards found 13 | Lautoja ei löytynyt 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Oletko asentanut &lt;a href="{drivers_url}"&gt;ajurit&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Muut... 24 | 25 | 26 | 27 | No device selected. 28 | Laitetta ei ole valittu. 29 | 30 | 31 | 32 | No version selected. 33 | Ei valittua versiota. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Virheellistä versiotiedostoa ei ole olemassa 39 | 40 | 41 | 42 | Work in progess... 43 | Työ käynnissä... 44 | 45 | 46 | 47 | Downloading... 48 | Lataaminen... 49 | 50 | 51 | 52 | Connecting... 53 | Yhdistäminen... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Yhdistetty. Sirutyyppi: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Pyyhkiminen valmis! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Pyyhkiminen käynnissä... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Kirjoittaminen osoitteessa 0x{osoite:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Valmis {time:.2f} sekunnissa. Anturin tunnus: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{version}) 84 | 85 | 86 | 87 | Firmware version: 88 | Firmware-versio: 89 | 90 | 91 | 92 | Upload 93 | Lataa 94 | 95 | 96 | 97 | Erase Flash 98 | Poista Flash 99 | 100 | 101 | 102 | Expert mode 103 | Asiantuntijatila 104 | 105 | 106 | 107 | Board: 108 | Hallitus: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudinopeus: 114 | 115 | 116 | 117 | Flashing 118 | Vilkkuva 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Avaa määrityssivu kaksoisnapsauttamalla sitä. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Paikallisverkossa havaitut anturit: 129 | 130 | 131 | 132 | Refresh 133 | Päivitä 134 | 135 | 136 | 137 | Discovery 138 | Discovery 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | Jos anturissa on ongelmia, Serial Monitorilla voidaan tarkastella anturin USB-kaapelin kautta lähettämiä lokitietoja. 144 | 145 | 146 | 147 | Connect 148 | Yhdistä 149 | 150 | 151 | 152 | Serial Monitor 153 | Sarjamonitori 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Build {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Kehittänyt &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | Tietoja 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Italian.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Caricamento della lista dei firmware... 9 | 10 | 11 | 12 | No boards found 13 | Nessuna scheda trovata 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Hai installato &lt;a href="{drivers_url}"&gt;i driver&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Altri... 24 | 25 | 26 | 27 | No device selected. 28 | Nessun dispositivo selezionato. 29 | 30 | 31 | 32 | No version selected. 33 | Nessuna versione selezionata. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Il file della versione non valida non esiste 39 | 40 | 41 | 42 | Work in progess... 43 | Lavoro in corso... 44 | 45 | 46 | 47 | Downloading... 48 | Scaricare... 49 | 50 | 51 | 52 | Connecting... 53 | Collegamento... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Collegato. Tipo di chip: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Cancellazione completata! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Cancellazione in corso... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Scrittura a 0x{address:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Finito in {time:.2f} secondi. ID del sensore: {sensore_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{version}) 84 | 85 | 86 | 87 | Firmware version: 88 | Versione del firmware: 89 | 90 | 91 | 92 | Upload 93 | Carica 94 | 95 | 96 | 97 | Erase Flash 98 | Cancellare il flash 99 | 100 | 101 | 102 | Expert mode 103 | Modalità esperto 104 | 105 | 106 | 107 | Board: 108 | Consiglio: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudrate: 114 | 115 | 116 | 117 | Flashing 118 | Lampeggiante 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Doppio clic per aprire la pagina di configurazione. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Sensori rilevati nella rete locale: 129 | 130 | 131 | 132 | Refresh 133 | Aggiorna 134 | 135 | 136 | 137 | Discovery 138 | Scoperta 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | In caso di problemi del sensore, Serial Monitor può essere utilizzato per rivedere i log inviati dal sensore tramite il cavo USB. 144 | 145 | 146 | 147 | Connect 148 | Collegare 149 | 150 | 151 | 152 | Serial Monitor 153 | Monitor seriale 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Costruisci {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Sviluppato da &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | Informazioni su 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Japanese.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | ファームウェアリストの読み込み... 9 | 10 | 11 | 12 | No boards found 13 | ボードが見つからない 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | &lt;a href="{drivers_url}"&gt;ドライバ&lt;a&gt;はインストールされていますか? 19 | 20 | 21 | 22 | Others... 23 | その他... 24 | 25 | 26 | 27 | No device selected. 28 | デバイスが選択されていません。 29 | 30 | 31 | 32 | No version selected. 33 | バージョンが選択されていません。 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | 無効なバージョンのファイルが存在しない 39 | 40 | 41 | 42 | Work in progess... 43 | 作業は進行中ですが...。 44 | 45 | 46 | 47 | Downloading... 48 | ダウンロード中... 49 | 50 | 51 | 52 | Connecting... 53 | コネクティング... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | 接続されています。チップタイプ。チップタイプ: {chip_type}. 59 | 60 | 61 | 62 | Erasing complete! 63 | 消去が完了しました。 64 | 65 | 66 | 67 | Erasing in progress... 68 | 消去作業中...。 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | 0x{address:08x}での書き込み... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | {time:.2f}秒で終了しました。センサーID: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{version}) 84 | 85 | 86 | 87 | Firmware version: 88 | ファームウェアのバージョン。 89 | 90 | 91 | 92 | Upload 93 | アップロード 94 | 95 | 96 | 97 | Erase Flash 98 | フラッシュの消去 99 | 100 | 101 | 102 | Expert mode 103 | エキスパートモード 104 | 105 | 106 | 107 | Board: 108 | ボードです。 109 | 110 | 111 | 112 | Baudrate: 113 | ボーレートです。 114 | 115 | 116 | 117 | Flashing 118 | 点滅 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | ダブルクリックすると設定画面が表示されます。 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | ローカルネットワークで検出されたセンサー 129 | 130 | 131 | 132 | Refresh 133 | リフレッシュ 134 | 135 | 136 | 137 | Discovery 138 | ディスカバリー 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | センサーに問題がある場合は、シリアルモニターを使って、USBケーブル経由でセンサーから送られてくるログを確認することができます。 144 | 145 | 146 | 147 | Connect 148 | コネクト 149 | 150 | 151 | 152 | Serial Monitor 153 | シリアルモニタ 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Build {build_id}。 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;開発したのは、&lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | について 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Latvian.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Programmatūras saraksta ielādēšana... 9 | 10 | 11 | 12 | No boards found 13 | Nav atrasti dēļi 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Vai esat instalējis &lt;a href="{drivers_url}"&gt;rīkotājus&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Citi... 24 | 25 | 26 | 27 | No device selected. 28 | Nav atlasīta neviena ierīce. 29 | 30 | 31 | 32 | No version selected. 33 | Nav atlasīta neviena versija. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Nederīgas versijas fails neeksistē 39 | 40 | 41 | 42 | Work in progess... 43 | Progresējošais darbs... 44 | 45 | 46 | 47 | Downloading... 48 | Lejupielāde... 49 | 50 | 51 | 52 | Connecting... 53 | Savienošana... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Savienots. Mikroshēmas tips: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Dzēšana pabeigta! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Notiek dzēšana... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Rakstīšana 0x{adrese:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Pabeigts pēc {time:.2f} sekundēm. Sensora ID: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{versija}) 84 | 85 | 86 | 87 | Firmware version: 88 | Programmatūras versija: 89 | 90 | 91 | 92 | Upload 93 | Augšupielādēt 94 | 95 | 96 | 97 | Erase Flash 98 | Izdzēst zibatmiņu 99 | 100 | 101 | 102 | Expert mode 103 | Eksperta režīms 104 | 105 | 106 | 107 | Board: 108 | Valde: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudrate: 114 | 115 | 116 | 117 | Flashing 118 | Mirgojošs 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Divreiz noklikšķiniet, lai atvērtu konfigurācijas lapu. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Vietējā tīklā konstatēti sensori: 129 | 130 | 131 | 132 | Refresh 133 | Atsvaidzināt 134 | 135 | 136 | 137 | Discovery 138 | Discovery 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | Ja rodas problēmas ar sensoru, var izmantot funkciju Serial Monitor, lai pārskatītu sensora pa USB kabeli nosūtītos žurnālus. 144 | 145 | 146 | 147 | Connect 148 | Savienot 149 | 150 | 151 | 152 | Serial Monitor 153 | Sērijas monitors 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Build {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Izstrādāts &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | Par 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Lituanian.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Įkeliamas programinės įrangos sąrašas... 9 | 10 | 11 | 12 | No boards found 13 | Lentų nerasta 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Ar įdiegėte &lt;a href="{drivers_url}"&gt;variklius&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Kiti... 24 | 25 | 26 | 27 | No device selected. 28 | Įrenginys nepasirinktas. 29 | 30 | 31 | 32 | No version selected. 33 | Versija nepasirinkta. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Negaliojančios versijos failas neegzistuoja 39 | 40 | 41 | 42 | Work in progess... 43 | Vykdomas darbas... 44 | 45 | 46 | 47 | Downloading... 48 | Atsisiuntimas... 49 | 50 | 51 | 52 | Connecting... 53 | Prijungimas... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Prijungtas. Mikroschemos tipas: Tipas: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Trinimas baigtas! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Vyksta trynimas... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Rašymas adresu 0x{adresas:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Baigta per {laikas:.2f} sekundžių. Jutiklio ID: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - "Airrohr Flasher" (v{versija}) 84 | 85 | 86 | 87 | Firmware version: 88 | Programinės įrangos versija: 89 | 90 | 91 | 92 | Upload 93 | Įkelti 94 | 95 | 96 | 97 | Erase Flash 98 | Ištrinti "Flash 99 | 100 | 101 | 102 | Expert mode 103 | Eksperto režimas 104 | 105 | 106 | 107 | Board: 108 | Valdyba: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudrate: 114 | 115 | 116 | 117 | Flashing 118 | Mirksintis 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Dukart spustelėkite , kad atidarytumėte konfigūracijos puslapį. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Vietiniame tinkle aptikti jutikliai: 129 | 130 | 131 | 132 | Refresh 133 | Atnaujinti 134 | 135 | 136 | 137 | Discovery 138 | Atradimas 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | Jei kyla problemų su jutikliu, naudojant "Serial Monitor" galima peržiūrėti jutiklio per USB kabelį siunčiamus žurnalus. 144 | 145 | 146 | 147 | Connect 148 | Prisijungti 149 | 150 | 151 | 152 | Serial Monitor 153 | Serijinis monitorius 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Sukurti {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Sukurta &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | Apie 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Portuguese.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Carregar a lista de firmware... 9 | 10 | 11 | 12 | No boards found 13 | Não foram encontradas tábuas 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Já instalou &lt;a href="{drivers_url}"&gt;the drivers&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Outros... 24 | 25 | 26 | 27 | No device selected. 28 | Nenhum dispositivo seleccionado. 29 | 30 | 31 | 32 | No version selected. 33 | Nenhuma versão seleccionada. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | O ficheiro da versão inválida não existe 39 | 40 | 41 | 42 | Work in progess... 43 | Trabalho em progresso... 44 | 45 | 46 | 47 | Downloading... 48 | Descarregar... 49 | 50 | 51 | 52 | Connecting... 53 | Ligando... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Ligado. Tipo de chip: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Apagamento completo! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Apagamento em curso... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Escrever em 0x{address:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Terminado em {tempo:.2f} segundos. Identificação do sensor: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{versão}) 84 | 85 | 86 | 87 | Firmware version: 88 | Versão Firmware: 89 | 90 | 91 | 92 | Upload 93 | Carregar 94 | 95 | 96 | 97 | Erase Flash 98 | Apagar Flash 99 | 100 | 101 | 102 | Expert mode 103 | Modo especialista 104 | 105 | 106 | 107 | Board: 108 | Conselho de Administração: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudrate: 114 | 115 | 116 | 117 | Flashing 118 | Flashing 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Faça duplo clique para abrir a página de configuração. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Sensores detectados na rede local: 129 | 130 | 131 | 132 | Refresh 133 | Actualizar 134 | 135 | 136 | 137 | Discovery 138 | Descoberta 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | Em caso de problemas de sensores, o Serial Monitor pode ser utilizado para rever os registos enviados pelo sensor através do cabo USB. 144 | 145 | 146 | 147 | Connect 148 | Ligar 149 | 150 | 151 | 152 | Serial Monitor 153 | Monitor em série 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&gt;br&gt;Build {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;href="https:/inf.re"&gt;&lt;span style=" text-decoration: sublinhado; cor: 164 | 165 | 166 | 167 | About 168 | Sobre 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Slovenian.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Nalaganje seznama vdelane programske opreme... 9 | 10 | 11 | 12 | No boards found 13 | Ni najdenih plošč 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Ali ste namestili &lt;a href="{drivers_url}"&gt; gonilnike&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Drugo... 24 | 25 | 26 | 27 | No device selected. 28 | Ni izbrana nobena naprava. 29 | 30 | 31 | 32 | No version selected. 33 | Različica ni izbrana. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Neveljavna različica Datoteka ne obstaja 39 | 40 | 41 | 42 | Work in progess... 43 | Delo v teku... 44 | 45 | 46 | 47 | Downloading... 48 | Prenašanje... 49 | 50 | 51 | 52 | Connecting... 53 | Povezovanje... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Povezano. Vrsta čipa: Tip čipa: {chip_type} 59 | 60 | 61 | 62 | Erasing complete! 63 | Brisanje končano! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Brisanje v teku... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Pisanje na 0x{naslov:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Končano v {čas:.2f} sekundah. ID senzorja: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{različica}) 84 | 85 | 86 | 87 | Firmware version: 88 | Različica vdelane programske opreme: 89 | 90 | 91 | 92 | Upload 93 | Naložite 94 | 95 | 96 | 97 | Erase Flash 98 | Izbriši bliskavico 99 | 100 | 101 | 102 | Expert mode 103 | Strokovni način 104 | 105 | 106 | 107 | Board: 108 | Upravni odbor: 109 | 110 | 111 | 112 | Baudrate: 113 | Hitrost prenosa: 114 | 115 | 116 | 117 | Flashing 118 | Utripanje 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Z dvoklikom odprite stran z nastavitvami. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Zaznani senzorji v lokalnem omrežju: 129 | 130 | 131 | 132 | Refresh 133 | Osvežitev 134 | 135 | 136 | 137 | Discovery 138 | Odkritje 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | V primeru težav s senzorjem lahko s programom Serial Monitor pregledujete dnevnike, ki jih senzor pošilja prek kabla USB. 144 | 145 | 146 | 147 | Connect 148 | Povežite 149 | 150 | 151 | 152 | Serial Monitor 153 | Serijski monitor 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Senzor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Build {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Razvil &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | O 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /i18n/Swedish.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | MainWindow 5 | 6 | 7 | Loading firmware list... 8 | Läser in listan över fasta programvaror... 9 | 10 | 11 | 12 | No boards found 13 | Inga brädor hittades 14 | 15 | 16 | 17 | Have you installed <a href="{drivers_url}">the drivers</a>? 18 | Har du installerat &lt;a href="{drivers_url}"&gt;drivrutinerna&lt;a&gt;? 19 | 20 | 21 | 22 | Others... 23 | Andra... 24 | 25 | 26 | 27 | No device selected. 28 | Ingen enhet har valts. 29 | 30 | 31 | 32 | No version selected. 33 | Ingen version har valts. 34 | 35 | 36 | 37 | Invalid version / file does not exist 38 | Filen finns inte i en ogiltig version 39 | 40 | 41 | 42 | Work in progess... 43 | Arbete pågår... 44 | 45 | 46 | 47 | Downloading... 48 | Nedladdning... 49 | 50 | 51 | 52 | Connecting... 53 | Anslutning... 54 | 55 | 56 | 57 | Connected. Chip type: {chip_type} 58 | Ansluten. Typ av chip: {chip_typ} 59 | 60 | 61 | 62 | Erasing complete! 63 | Radering slutförd! 64 | 65 | 66 | 67 | Erasing in progress... 68 | Radering pågår... 69 | 70 | 71 | 72 | Writing at 0x{address:08x}... 73 | Skriver på 0x{adress:08x}... 74 | 75 | 76 | 77 | Finished in {time:.2f} seconds. Sensor ID: {sensor_id} 78 | Slutförs på {time:.2f} sekunder. Sensor-ID: {sensor_id} 79 | 80 | 81 | 82 | Sensor.Community - Airrohr Flasher (v{version}) 83 | Sensor.Community - Airrohr Flasher (v{{version}) 84 | 85 | 86 | 87 | Firmware version: 88 | Version av den fasta programvaran: 89 | 90 | 91 | 92 | Upload 93 | Ladda upp 94 | 95 | 96 | 97 | Erase Flash 98 | Radera Flash 99 | 100 | 101 | 102 | Expert mode 103 | Expertläge 104 | 105 | 106 | 107 | Board: 108 | Styrelsen: 109 | 110 | 111 | 112 | Baudrate: 113 | Baudrate: 114 | 115 | 116 | 117 | Flashing 118 | Blinkande 119 | 120 | 121 | 122 | Double-click to open configuration page. 123 | Dubbelklicka för att öppna konfigurationssidan. 124 | 125 | 126 | 127 | Sensors detected in local network: 128 | Sensorer som upptäcks i det lokala nätverket: 129 | 130 | 131 | 132 | Refresh 133 | Uppdatera 134 | 135 | 136 | 137 | Discovery 138 | Upptäckt 139 | 140 | 141 | 142 | In case of sensor issues, Serial Monitor can be used to review logs sent by the sensor over USB cable. 143 | Vid problem med sensorn kan Serial Monitor användas för att granska loggar som skickas av sensorn via USB-kabeln. 144 | 145 | 146 | 147 | Connect 148 | Anslut 149 | 150 | 151 | 152 | Serial Monitor 153 | Seriell övervakning 154 | 155 | 156 | 157 | <b>Sensor.Community Airrohr Flasher</b><br/>Build {build_id} 158 | &lt;b&gt;Sensor.Community Airrohr Flasher&lt;b&gt;&lt;br&gt;Bygg {build_id} 159 | 160 | 161 | 162 | <html><head/><body><p>Developed by <a href="https://inf.re/"><span style=" text-decoration: underline; color:#0000ff;">Piotr Dobrowolski</span></a>.</p><p>This software is released under the terms of MIT license. No warranty is provided.</p><p>For newest release see: <a href="https://d.inf.re/luftdaten/"><span style=" text-decoration: underline; color:#0000ff;">https://d.inf.re/luftdaten/</span></a></p></body></html> 163 | &lt;html&gt;&lt;head&gt;&lt;body&gt;&lt;p&gt;Utvecklad av &lt;a href="https:/inf.re"&gt;&lt;span style=" text-decoration: underline; color: 164 | 165 | 166 | 167 | About 168 | Om 169 | 170 | 171 | 172 | Invalid sensor name. 173 | 174 | 175 | 176 | 177 | Invalid language. 178 | 179 | 180 | 181 | 182 | No SSID typed. 183 | 184 | 185 | 186 | 187 | 2 times the same sensor. 188 | 189 | 190 | 191 | 192 | Created invalid json. 193 | 194 | 195 | 196 | 197 | Created valid json. 198 | 199 | 200 | 201 | 202 | Opening temporary json directory. 203 | 204 | 205 | 206 | 207 | Write json in temporay json directory. 208 | 209 | 210 | 211 | 212 | Make SPIFFS bin 213 | 214 | 215 | 216 | 217 | spiffs.bin done! 218 | 219 | 220 | 221 | 222 | No password typed. 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | Progress: 233 | 234 | 235 | 236 | 237 | Custom name: 238 | 239 | 240 | 241 | 242 | WiFi SSID: 243 | 244 | 245 | 246 | 247 | WiFi password: 248 | 249 | 250 | 251 | 252 | Sensor 1: 253 | 254 | 255 | 256 | 257 | Sensor 2: 258 | 259 | 260 | 261 | 262 | Language: 263 | 264 | 265 | 266 | 267 | Save configuration 268 | 269 | 270 | 271 | 272 | Configure 273 | 274 | 275 | 276 | 277 | This will completely erase the flash memory (firmware and configuration). After that you will need to reflash the firmware and reconfigure the device. 278 | 279 | 280 | 281 | 282 | Erase flash 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /images/airrohr-flasher_flash_finished.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/images/airrohr-flasher_flash_finished.png -------------------------------------------------------------------------------- /images/airrohr-flasher_flash_progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/images/airrohr-flasher_flash_progress.png -------------------------------------------------------------------------------- /images/airrohr-flasher_select_firmware.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/images/airrohr-flasher_select_firmware.png -------------------------------------------------------------------------------- /images/modified_GUI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/images/modified_GUI.png -------------------------------------------------------------------------------- /images/modified_GUI2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendata-stuttgart/airrohr-firmware-flasher/654bf12767565ec188229e562258e93861a0d795/images/modified_GUI2.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | -i https://pypi.org/simple/ 2 | altgraph==0.16.1 3 | certifi==2018.8.24 4 | chardet==3.0.4 5 | ecdsa==0.13.3 6 | esptool==2.5.0 7 | future==0.16.0 8 | idna==2.7 9 | macholib==1.16 10 | netifaces==0.10.7 11 | pefile==2018.8.8 12 | pyaes==1.6.1 13 | pyinstaller==4.10 14 | pyqt5-sip==12.9.1 15 | pyqt5==5.15.2 16 | pyserial==3.4 17 | requests==2.20.0 18 | urllib3==1.24.2 19 | zeroconf==0.30.0 20 | --------------------------------------------------------------------------------