├── STL ├── Readme.md ├── AirBox-kryt.stl ├── AirBox-čelo.stl ├── AirBox-spona.stl ├── AirBox-zakladna.stl ├── AirBox-vrtací šablona.stl └── AirBox-Radiační štít a držák.stl ├── Obrázky ├── README.md ├── Finále.jpg ├── Základna.jpg ├── Komponenty.jpg ├── Sešroubováno.jpg ├── Čelo-senzory.jpg ├── Usazení SPS30.jpg ├── Před zakrytováním.jpg ├── Umístění BME280.jpg └── Vyvrtaná krabička.jpg ├── Schéma ├── README.md └── Schematic_Airbox.pdf ├── YAML ├── README.md ├── secrets.yaml ├── automations.yaml ├── rest_command.yaml └── airbox.yaml └── README.md /STL/Readme.md: -------------------------------------------------------------------------------- 1 | 3D tištěné díly 2 | -------------------------------------------------------------------------------- /Obrázky/README.md: -------------------------------------------------------------------------------- 1 | Fotografie z výroby 2 | -------------------------------------------------------------------------------- /Schéma/README.md: -------------------------------------------------------------------------------- 1 | Schéma zapojení AirBox 2 | -------------------------------------------------------------------------------- /YAML/README.md: -------------------------------------------------------------------------------- 1 | Home Assistant configuration files 2 | -------------------------------------------------------------------------------- /Obrázky/Finále.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Finále.jpg -------------------------------------------------------------------------------- /STL/AirBox-kryt.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/STL/AirBox-kryt.stl -------------------------------------------------------------------------------- /STL/AirBox-čelo.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/STL/AirBox-čelo.stl -------------------------------------------------------------------------------- /Obrázky/Základna.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Základna.jpg -------------------------------------------------------------------------------- /STL/AirBox-spona.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/STL/AirBox-spona.stl -------------------------------------------------------------------------------- /Obrázky/Komponenty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Komponenty.jpg -------------------------------------------------------------------------------- /Obrázky/Sešroubováno.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Sešroubováno.jpg -------------------------------------------------------------------------------- /Obrázky/Čelo-senzory.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Čelo-senzory.jpg -------------------------------------------------------------------------------- /STL/AirBox-zakladna.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/STL/AirBox-zakladna.stl -------------------------------------------------------------------------------- /Obrázky/Usazení SPS30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Usazení SPS30.jpg -------------------------------------------------------------------------------- /Obrázky/Před zakrytováním.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Před zakrytováním.jpg -------------------------------------------------------------------------------- /Obrázky/Umístění BME280.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Umístění BME280.jpg -------------------------------------------------------------------------------- /Obrázky/Vyvrtaná krabička.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Obrázky/Vyvrtaná krabička.jpg -------------------------------------------------------------------------------- /STL/AirBox-vrtací šablona.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/STL/AirBox-vrtací šablona.stl -------------------------------------------------------------------------------- /Schéma/Schematic_Airbox.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/Schéma/Schematic_Airbox.pdf -------------------------------------------------------------------------------- /STL/AirBox-Radiační štít a držák.stl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zdenekchobot/airbox/HEAD/STL/AirBox-Radiační štít a držák.stl -------------------------------------------------------------------------------- /YAML/secrets.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Use this file to store secrets like usernames and passwords. 3 | # Learn more at https://www.home-assistant.io/docs/configuration/secrets/ 4 | luftdaten_x_sensor: esp8266-xxxxxxxx ## adjust according to your sensor 5 | 6 | 7 | -------------------------------------------------------------------------------- /YAML/automations.yaml: -------------------------------------------------------------------------------- 1 | - id: '1672350685488' 2 | alias: Sensor.Community 3 | description: '' 4 | trigger: 5 | - platform: time_pattern 6 | seconds: '5' 7 | hours: '*' 8 | minutes: /2 9 | condition: 10 | - condition: not 11 | conditions: 12 | - condition: template 13 | value_template: '{{ states(''sensor.airbox_pm_2_5um'') in [''unknown'',''unavailable''] 14 | }}' 15 | - condition: template 16 | value_template: '{{ states(''sensor.airbox_pm_10um'') in [''unknown'',''unavailable''] 17 | }}' 18 | - condition: template 19 | value_template: '{{ states(''sensor.airbox_bme280_humidity'') in [''unknown'',''unavailable''] 20 | }}' 21 | - condition: template 22 | value_template: '{{ states(''sensor.airbox_bme280_pressure'') in[''unknown'',''unavailable''] 23 | }}' 24 | - condition: template 25 | value_template: '{{ states(''sensor.airbox_bme280_temperature'') in [''unknown'',''unavailable''] 26 | }}' 27 | action: 28 | - service: rest_command.send_luftdaten_pm 29 | data: {} 30 | - service: rest_command.send_madavi 31 | data: {} 32 | - service: rest_command.send_luftdaten_tph 33 | data: {} 34 | mode: single 35 | -------------------------------------------------------------------------------- /YAML/rest_command.yaml: -------------------------------------------------------------------------------- 1 | ## add line 'rest_command: !include rest_command.yaml' to configuration.yaml !! 2 | 3 | send_luftdaten_pm: 4 | url: http://api.sensor.community/v1/push-sensor-data/ 5 | method: POST 6 | content_type: "application/json" 7 | timeout: 30 8 | headers: 9 | X-Pin: 1 ## This tells Luftdaten that it is SPS30 data 10 | X-Sensor: !secret luftdaten_x_sensor 11 | payload: >- 12 | { 13 | "software_version": "HomeAssistant", 14 | "sensordatavalues":[ 15 | {"value_type":"P0","value":"{{ states('sensor.airbox_pm_1um') }}"}, 16 | {"value_type":"P2","value":"{{ states('sensor.airbox_pm_2_5um') }}"}, 17 | {"value_type":"P4","value":"{{ states('sensor.airbox_pm_4um') }}"}, 18 | {"value_type":"P1","value":"{{ states('sensor.airbox_pm_10um') }}"} 19 | ] 20 | } 21 | 22 | send_luftdaten_tph: 23 | url: http://api.sensor.community/v1/push-sensor-data/ 24 | method: POST 25 | content_type: "application/json" 26 | timeout: 30 27 | headers: 28 | X-Pin: 11 ## This tells Luftdaten that it is BME280 data 29 | X-Sensor: !secret luftdaten_x_sensor 30 | payload: >- 31 | { 32 | "software_version": "HomeAssistant", 33 | "sensordatavalues":[ 34 | {"value_type":"temperature","value":"{{ states('sensor.airbox_bme280_temperature') }}"}, 35 | {"value_type":"pressure","value":"{{ ((states('sensor.airbox_bme280_pressure') | float(default=0)) * 100) | round }}"}, 36 | {"value_type":"humidity","value":"{{ states('sensor.airbox_bme280_humidity') }}"} 37 | ] 38 | } 39 | # Push to Madavi. This is related to Luftdaten and stores data for use in Grafana. 40 | send_madavi: 41 | url: http://api-rrd.madavi.de/data.php 42 | method: POST 43 | content_type: "application/json" 44 | headers: 45 | X-Pin: 0 46 | X-Sensor: !secret luftdaten_x_sensor 47 | payload: >- 48 | { 49 | "software_version": "HomeAssistant", 50 | "sensordatavalues":[ 51 | {"value_type":"SPS30_P0","value":"{{ states('sensor.airbox_pm_1um') }}"}, 52 | {"value_type":"SPS30_P2","value":"{{ states('sensor.airbox_pm_2_5um') }}"}, 53 | {"value_type":"SPS30_P4","value":"{{ states('sensor.airbox_pm_4um') }}"}, 54 | {"value_type":"SPS30_P1","value":"{{ states('sensor.airbox_pm_10um') }}"}, 55 | {"value_type":"BME280_temperature","value":"{{ states('sensor.airbox_bme280_temperature') }}"}, 56 | {"value_type":"BME280_pressure","value":"{{ ((states('sensor.airbox_bme280_pressure') | float(default=0)) * 100) | round }}"}, 57 | {"value_type":"BME280_humidity","value":"{{ states('sensor.airbox_bme280_humidity') }}"} 58 | ] 59 | } 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AirBox 2 | Senzor pro měření stavu ovzduší. Pomocí dvou pokročilých senzorů měří koncentraci pevných částic PM (senzor Sensirion SPS30) a teplotu, realtivní vlkosti a tlak vzduch (senzor Bosch BME280). Jedná se variantou odvozenou ze senzorů doporučených komunitním projektem [sensor.community](https://sensor.community/cz/). Airbox používá stejné zapojení jako komunitní senzory a je tak plně kompatibilní s jejich firmware. 3 | ## Hardware 4 | Elektronika senzoru využívá běžný modul WeMos D1 Mini s WiFi mikrokontrolerem ESP8266. Ten tvoří srdce senzoru - po sběrnici i2c komunikuje s SPS30 a BME280 a získaná data odesílá prostřednictvním internetu ke zpracování a publikaci komunitním webům, popřípadě i jinam podle vaší volby. Kvůli umístění ve venkovním prostředí je elektronika umístněna v běžné vodotěsné elektrikářské krabičce. Jednotlivé elektronické komponenty jsou upevněny na jednoduché 3D vytištěné konstrukci, která také zajišťuje vhodné proudění vzduchu. [Schéma zapojení](/Schéma/Schematic_Airbox.pdf) je jednoduché. 5 | ### Seznam komponent 6 | - krabička [SCAME SCABOX 120x80x50mm IP56](https://www.elfetex.cz/10-078-693-scame-krabice-scabox-120x80x50mm-ip56) 7 | - 2x [nerez sítko ke zpětné klapce DN15 - 1/2"](https://www.obchod-vtp.cz/nerez-sitko-ke-zpetne-klapce-dn15-1-2) 8 | - [WeMos D1 Mini ESP8266 WiFi](https://dratek.cz/arduino/121932-wemos-d1-mini-esp8266-wifi-modul-v2.0.html), originál či klon 9 | - senzor kvality ovzduší [Sensirion SPS30](https://www.soselectronic.cz/products/sensirion/sps30-2-304234) 10 | - senzor teploty, vlhkosti a tlaku [BME280](https://dratek.cz/arduino/1361-bme280-modul-mereni-teploty-vlhkosti-a-barometrickeho-tlaku-precizni.html) 11 | - [3D tištěné díly](/STL) 12 | - gumová průchodka napájecího kablíku, např. [FIX-GR-98](https://www.tme.eu/cz/details/fix-gr-98/pruchodky/fix-fasten/) 13 | - propojovací vodiče, napájecí kablík 14 | - samosmršťovací bužírka 15 | - kousek pěnové gumy pro fixaci a utěsnění SPS30 (samolepící je výhodou) 16 | - samořezné šroubky 17 | ### Sestavení 18 | Představu o sestavení senzoru poskytují [fotografie](/Obrázky) z výroby "prototypu". Poněkud nestandardní je upevnění modulu Wemos. Přiložené standardní "hřebínky" jsou **delšímí** piny nasunuty se strany ESP8266 a zapájeny. Na delší piny jsou připájeny propojovací vodče. Kratší piny jsou zasunuty do základny a dostatečně upevňují modul. Pokud potřebujete modul více fixovat, přilepte na ESP8266 oboustranně lepící (teplovodivou) pásku. Po zasunutí pinů do základny druhá strany pásky přilne k základně. 19 | ## Software 20 | Jako zákadní software, resp. firmware lze použít standardní, neupravený komunitní firmware. Pro jeho nahrání a konfiguraci je vhodné postupovat podle [návodu na komunitním webu](https://sensor.community/cz/sensors/airrohr/). 21 | ### Home Assistant 22 | Do AirBoxu lze nahrát i firmware ESPHome, získaná data využít v HA a odtud je odesílat na web [sensor.community](https://sensor.community/cz/). Konfigurační soubory yaml pro ESPHome, služeb odesílání dat včetně automatizace jsou k dispozici ve [složce YAML](/YAML). 23 | Konfigurace služeb a automatizace je z větší části práce šikuly [hmmboba](https://github.com/hmmbob/HomeAssistantConfig) - děkuji! 24 | ## Tipy 25 | 1. Místo Wemos D1 mini doporučuji spíše modul [WeMos D1 Mini Pro 16MB](https://www.laskakit.cz/wemos-d1-mini-pro--esp8266-wifi-modul/) kvůli možnosti připojení externí antény, např. [WiFi 42x12mm anténa 2.4G 5dB](https://www.laskakit.cz/wifi-42x12mm-antena-2-4g--5db-u-fl--ipex1--konektor/) nebo [NiceRF snténa 3.0dBi 2.4G](https://www.laskakit.cz/antena-10cm-2-4g/) s příslušným pigtailem. 26 | 2. Na vrtání velkých děr do krabičky se skvěle osvědčily [stromečkové/stupňovité vrtáky](https://www.lidl.cz/p/parkside-sada-specialnich-vrtaku-psb-6-a1/p100341714004). Velké poděkování [Jiri Janovec](https://twitter.com/jjiik) a [Josef Zvolanek #ePap](https://twitter.com/JosefZvolanek) za radu! 27 | -------------------------------------------------------------------------------- /YAML/airbox.yaml: -------------------------------------------------------------------------------- 1 | esphome: 2 | name: airbox 3 | platformio_options: 4 | board_build.f_cpu: 80000000L 5 | 6 | esp8266: 7 | board: esp07 8 | 9 | i2c: 10 | - id: bus_a 11 | sda: GPIO0 #D3 12 | scl: GPIO2 #D4 13 | scan: True 14 | 15 | # Enable logging 16 | logger: 17 | level: info 18 | 19 | # Enable Home Assistant API 20 | api: 21 | encryption: 22 | key: "TOfsRrJCtIp/9dy8yjqE9XkwbR81tHzxCQAajmeBZQI=" 23 | 24 | ota: 25 | password: "1547e8a15c61e76705c9fa0fd143165c" 26 | 27 | wifi: 28 | fast_connect: True 29 | ssid: !secret wifi_ssid ## create your own secret.yaml file 30 | password: !secret wifi_password ## create your own secret.yaml file 31 | 32 | # Enable fallback hotspot (captive portal) in case wifi connection fails 33 | ap: 34 | ssid: "airbox Fallback Hotspot" 35 | password: "buPthyk6mLkS" 36 | 37 | captive_portal: 38 | 39 | sensor: 40 | - platform: bme280 41 | temperature: 42 | name: "airbox BME280 Temperature" 43 | oversampling: 16x 44 | id: "airbox_temperature" 45 | unit_of_measurement: "°C" 46 | device_class: "temperature" 47 | accuracy_decimals: 1 48 | filters: 49 | - offset: -2.2 ## my sensor individual calibration 50 | pressure: 51 | name: "airbox BME280 Pressure" 52 | id: "airbox_pressure" 53 | unit_of_measurement: "hPa" 54 | device_class: "pressure" 55 | accuracy_decimals: 2 56 | humidity: 57 | name: "airbox BME280 Humidity" 58 | id: "airbox_humidity" 59 | unit_of_measurement: "%" 60 | device_class: "humidity" 61 | accuracy_decimals: 1 62 | iir_filter: 4x 63 | i2c_id: bus_a 64 | address: 0x76 65 | update_interval: 15s 66 | - platform: template 67 | name: "airbox BME280 Sea level pressure" 68 | id: "airbox_sea_level_pressure" 69 | update_interval: 15s 70 | unit_of_measurement: 'hPa' 71 | device_class: pressure 72 | accuracy_decimals: 2 73 | lambda: |- 74 | const float STANDARD_ALTITUDE = 500.0; // in meters 75 | return id(airbox_pressure).state / powf(1 - ((0.0065 * STANDARD_ALTITUDE) / 76 | (id(airbox_temperature).state + (0.0065 * STANDARD_ALTITUDE) + 273.15)), 5.257); // in hPa 77 | 78 | - platform: sps30 79 | pm_1_0: 80 | name: "airbox PM <1µm" #Weight concentration 81 | id: "airbox_pm1" 82 | icon: "mdi:blur" 83 | unit_of_measurement: "µg/m³" 84 | accuracy_decimals: 1 85 | pm_2_5: 86 | name: "airbox PM <2.5µm" 87 | id: "airbox_pm2_5" 88 | icon: "mdi:blur" 89 | unit_of_measurement: "µg/m³" 90 | accuracy_decimals: 1 91 | pm_4_0: 92 | name: "airbox PM <4µm" 93 | id: "airbox_pm4" 94 | icon: "mdi:blur" 95 | unit_of_measurement: "µg/m³" 96 | accuracy_decimals: 1 97 | pm_10_0: 98 | name: "airbox PM <10µm" 99 | id: "airbox_pm10" 100 | icon: "mdi:blur" 101 | unit_of_measurement: "µg/m³" 102 | accuracy_decimals: 1 103 | 104 | pmc_0_5: 105 | name: "airbox NC <0.5µm" # Number concentration 106 | id: "airbox_nc0_5" 107 | icon: "mdi:blur-linear" 108 | unit_of_measurement: "#/cm³" 109 | accuracy_decimals: 1 110 | pmc_1_0: 111 | name: "airbox NC <1µm" 112 | id: "airbox_nc1" 113 | icon: "mdi:blur-linear" 114 | unit_of_measurement: "#/cm³" 115 | accuracy_decimals: 1 116 | pmc_2_5: 117 | name: "airbox NC <2.5µm" 118 | id: "airbox_nc2_5" 119 | icon: "mdi:blur-linear" 120 | unit_of_measurement: "#/cm³" 121 | accuracy_decimals: 1 122 | pmc_4_0: 123 | name: "airbox NC <4µm" 124 | id: "airbox_nc4" 125 | icon: "mdi:blur-linear" 126 | unit_of_measurement: "#/cm³" 127 | accuracy_decimals: 1 128 | pmc_10_0: 129 | name: "airbox NC <10µm" 130 | id: "airbox_nc10" 131 | icon: "mdi:blur-linear" 132 | unit_of_measurement: "#/cm³" 133 | accuracy_decimals: 1 134 | pm_size: 135 | name: "airbox Typical Particle size" 136 | id: "airbox_pm_size" 137 | unit_of_measurement: "µm" 138 | accuracy_decimals: 1 139 | address: 0x69 140 | update_interval: 15s 141 | 142 | - platform: wifi_signal # Reports the WiFi signal strength/RSSI in dB 143 | name: "WiFi RSSI" 144 | id: wifi_signal_db 145 | update_interval: 60s 146 | entity_category: "diagnostic" 147 | 148 | web_server: 149 | port: 80 150 | 151 | --------------------------------------------------------------------------------