├── .gitattributes ├── .github └── stale.yml ├── Bilder ├── Awekas_Einrichtung_Station.png ├── Awekas_Einrichtung_Station1.png ├── Awekas_Stationsseite.png ├── Awekas_Stationsweb.png ├── Grafana-0.png ├── Grafana-1.png ├── Grafana-Dashboard_V8.png ├── Grafana-Dashboard_V8a.png ├── Grafana-Settings_V3.png ├── Grafana_V3a.png ├── Grafana_V3b.png ├── Influx_logging.png ├── OSEM SenseBox.png ├── OSEM Sensoren.png ├── OSEM Wetterstation_conf.png ├── OSEM_Messwerte.png ├── OSEM_User.png ├── WOW Settings1.png ├── WOW Settings1a.png ├── WOW Settings2.png ├── WOW Settings3.png ├── WOW.png ├── WS_View_Config_Ecowitt.png ├── WS_View_Config_Felder.png ├── Wettercom.png ├── Wetterstatistik_DP_Control.png ├── Wetterstatistik_DP_Data.png ├── Wetterstatistik_DP_Uebersicht.png ├── Wetterstatistik_DPs.png ├── Windy.png ├── Windy_APIKey.png ├── Windy_Registrierung.png ├── debug.png ├── ioB-Datenpunkte.png ├── iobroker_objekte.png ├── objekte_iobroker.png ├── wetter_com.png └── wettercom.gif ├── Docker └── docker-compose.yml ├── Grafana Dashboard ├── README.md ├── Wetterstation-Dashboard(Grafana V8.x).json ├── Wetterstation-Dashboard.json └── Wetterstation-Dashboard_V3.json ├── LICENSE ├── README.md ├── _config.yml ├── firmware.version ├── wetterstation-statistik.js ├── wetterstation.conf ├── wetterstation.js ├── wetterstation.sh ├── wetterstation.sub ├── ws_updater.beta └── ws_updater.sh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 14 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | - enhancement 10 | # Label to use when marking an issue as stale 11 | staleLabel: wontfix 12 | # Comment to post when marking an issue as stale. Set to `false` to disable 13 | markComment: > 14 | This issue has been automatically marked as stale because it has not had 15 | recent activity. It will be closed in 7 days if no further activity occurs. Thank you 16 | for your contributions. 17 | # Comment to post when closing a stale issue. Set to `false` to disable 18 | closeComment: false 19 | -------------------------------------------------------------------------------- /Bilder/Awekas_Einrichtung_Station.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Awekas_Einrichtung_Station.png -------------------------------------------------------------------------------- /Bilder/Awekas_Einrichtung_Station1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Awekas_Einrichtung_Station1.png -------------------------------------------------------------------------------- /Bilder/Awekas_Stationsseite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Awekas_Stationsseite.png -------------------------------------------------------------------------------- /Bilder/Awekas_Stationsweb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Awekas_Stationsweb.png -------------------------------------------------------------------------------- /Bilder/Grafana-0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Grafana-0.png -------------------------------------------------------------------------------- /Bilder/Grafana-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Grafana-1.png -------------------------------------------------------------------------------- /Bilder/Grafana-Dashboard_V8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Grafana-Dashboard_V8.png -------------------------------------------------------------------------------- /Bilder/Grafana-Dashboard_V8a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Grafana-Dashboard_V8a.png -------------------------------------------------------------------------------- /Bilder/Grafana-Settings_V3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Grafana-Settings_V3.png -------------------------------------------------------------------------------- /Bilder/Grafana_V3a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Grafana_V3a.png -------------------------------------------------------------------------------- /Bilder/Grafana_V3b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Grafana_V3b.png -------------------------------------------------------------------------------- /Bilder/Influx_logging.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Influx_logging.png -------------------------------------------------------------------------------- /Bilder/OSEM SenseBox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/OSEM SenseBox.png -------------------------------------------------------------------------------- /Bilder/OSEM Sensoren.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/OSEM Sensoren.png -------------------------------------------------------------------------------- /Bilder/OSEM Wetterstation_conf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/OSEM Wetterstation_conf.png -------------------------------------------------------------------------------- /Bilder/OSEM_Messwerte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/OSEM_Messwerte.png -------------------------------------------------------------------------------- /Bilder/OSEM_User.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/OSEM_User.png -------------------------------------------------------------------------------- /Bilder/WOW Settings1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/WOW Settings1.png -------------------------------------------------------------------------------- /Bilder/WOW Settings1a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/WOW Settings1a.png -------------------------------------------------------------------------------- /Bilder/WOW Settings2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/WOW Settings2.png -------------------------------------------------------------------------------- /Bilder/WOW Settings3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/WOW Settings3.png -------------------------------------------------------------------------------- /Bilder/WOW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/WOW.png -------------------------------------------------------------------------------- /Bilder/WS_View_Config_Ecowitt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/WS_View_Config_Ecowitt.png -------------------------------------------------------------------------------- /Bilder/WS_View_Config_Felder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/WS_View_Config_Felder.png -------------------------------------------------------------------------------- /Bilder/Wettercom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Wettercom.png -------------------------------------------------------------------------------- /Bilder/Wetterstatistik_DP_Control.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Wetterstatistik_DP_Control.png -------------------------------------------------------------------------------- /Bilder/Wetterstatistik_DP_Data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Wetterstatistik_DP_Data.png -------------------------------------------------------------------------------- /Bilder/Wetterstatistik_DP_Uebersicht.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Wetterstatistik_DP_Uebersicht.png -------------------------------------------------------------------------------- /Bilder/Wetterstatistik_DPs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Wetterstatistik_DPs.png -------------------------------------------------------------------------------- /Bilder/Windy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Windy.png -------------------------------------------------------------------------------- /Bilder/Windy_APIKey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Windy_APIKey.png -------------------------------------------------------------------------------- /Bilder/Windy_Registrierung.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/Windy_Registrierung.png -------------------------------------------------------------------------------- /Bilder/debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/debug.png -------------------------------------------------------------------------------- /Bilder/ioB-Datenpunkte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/ioB-Datenpunkte.png -------------------------------------------------------------------------------- /Bilder/iobroker_objekte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/iobroker_objekte.png -------------------------------------------------------------------------------- /Bilder/objekte_iobroker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/objekte_iobroker.png -------------------------------------------------------------------------------- /Bilder/wetter_com.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/wetter_com.png -------------------------------------------------------------------------------- /Bilder/wettercom.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/c9244ae7528e0cfcff37cf760175eb55dd969b1c/Bilder/wettercom.gif -------------------------------------------------------------------------------- /Docker/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | wetterstation: 4 | network_mode: host 5 | restart: always 6 | image: ubuntu:jammy-20240227 7 | container_name: wetterstation 8 | hostname: wetterstation 9 | volumes: 10 | - ./wetterstation:/opt/wetterstation 11 | ports: 12 | - 1080:1080 13 | command: > 14 | /bin/bash -c 15 | " 16 | apt-get update && 17 | apt-get install -y apt-transport-https ca-certificates gnupg netcat-openbsd bc jq dc nano sudo curl && 18 | cd /opt/wetterstation && chmod +x wetterstation.sh && /opt/wetterstation/wetterstation.sh 19 | " 20 | 21 | -------------------------------------------------------------------------------- /Grafana Dashboard/README.md: -------------------------------------------------------------------------------- 1 | Ersteller: crunchip@forum.iobroker.net 2 | Modifikationen: sborg@forum.iobroker.net 3 | 4 | Das Grafana-Dashboard als JSON-Export. 5 | 6 | V3.0 des Dashboards ist speziell auf InfluxDB V2.x angepasst. Die Abfrage erfolgt mittels Flux. 7 | Benötigt : 8 | * Boom Theme Plugin (für das Hintergrundbild) 9 | * Spectraphilic Windrose Plugin 10 | * Blendstat Panel (by farski) Plugin 11 | * Table Plugin 12 | 13 | Installation des Windrose-Plugins: 14 | ``` 15 | sudo su - 16 | cd /var/lib/grafana/plugins 17 | git clone https://github.com/spectraphilic/grafana-windrose.git 18 | ``` 19 | Das Plugin in Grafana laden, dazu die `grafana.ini` bearbeiten: 20 | ``` 21 | nano /etc/grafana/grafana.ini 22 | ``` 23 | und unter **[plugins]** das laden erlauben: 24 | ``` 25 | [plugins] 26 | allow_loading_unsigned_plugins = spectraphilic-windrose-panel 27 | ``` 28 | Nun noch den Grafana Service neu starten. 29 | 30 | Für die Wetter- und Regenvorhersage werden weitere Datenpunkte aus den Adaptern "Das Wetter" und "Weatherunderground" 31 | benötigt, sowie weitere Datenpunkte aus dem ioBroker (bspw. "Ozon" oder "Strahlenbelastung" etc.). 32 | 33 | Die Konfiguration des Dashboardes erfolgt in dessen Settings über die Variablen: 34 | ![Konfiguration Dashboard](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Grafana-Settings_V3.png) 35 | 36 | Hier besteht die Möglichkeit mit zwei unterschiedlichen Buckets zu arbeiten. Nutzt man nur eines für alles (was ich nicht 37 | unbedingt empfehlen würde) trägt man bei beiden den gleichen Bucketnamen ein. 38 | 39 | Bilder zur V3.0:
40 | ![Übersicht Teil 1](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Grafana_V3a.png) 41 | ![Übersicht Teil 2](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Grafana_V3b.png) 42 | --- 43 | 44 | 45 | V2.0 ist für Grafana V8.x angepasst und enthällt zahlreiche Fixes für die einzelnen Panels. 46 | 47 | Benötigt : 48 | * Boom Theme Plugin (für das Hintergrundbild) 49 | * WindRose Plugin 50 | * Blendstat Panel (by farski) Plugin 51 | * Table Plugin 52 | 53 | 54 | Vor dem Import in der Datei ***\_\_DBname\_\_*** durch den eigenen Influx-Datenbanknamen ersetzen (40 Treffer bzw. bei V2.0 dann 45 Treffer), sonst gibt das 55 | später eine Klickorgie 😉 56 | 57 | Für die Wetter- und Regenvorhersage werden weitere Datenpunkte aus den Adaptern "Das Wetter" und "Weatherunderground" 58 | benötigt. 59 | 60 | KEIN Support zu Fragen bzgl. Influx, Grafana oder dem Import etc. des DashBoardes! 61 | 62 | Mit freundlicher Genehmigung zur Veröffentlichung von crunchip@forum.iobroker.net 63 |
64 |
65 |
66 |
67 | Creator: crunchip@forum.iobroker.net 68 | Modifications: sborg@forum.iobroker.net 69 | 70 | The Grafana dashboard as a JSON export. 71 | V2.0 is adapted for Grafana V8.x and contains numerous fixes for the individual panels. 72 | 73 | Requires: 74 | * Boom Theme plugin (for the background image) 75 | * WindRose plugin 76 | * Blendstat Panel (by farski) Plugin 77 | * Table Plugin 78 | 79 | Before importing, replace ***\_\_DBname\_\_*** in the file with your own Influx database name (40 hits or 45 hits with V2.0), otherwise you get 80 | later a click orgy 😉 81 | 82 | For the weather and rain forecast, further data points from the adapters "Das Wetter" and "Weatherunderground" 83 | needed. 84 | 85 | NO support for questions regarding Influx, Grafana or the import etc. of the DashBoard! 86 | 87 | Courtesy of crunchip@forum.iobroker.net for posting 88 | 89 | 90 | --- 91 | 92 | Bilder V2.0 / Pictures from V2.0:
93 | ![Pic1](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Grafana-Dashboard_V8.png) 94 | ![Pic2](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Grafana-Dashboard_V8a.png) 95 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019-2024 SBorg2014 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # :partly_sunny: WLAN-Wetterstation 2 |

3 | [![Current Release](https://img.shields.io/github/v/release/SBorg2014/WLAN-Wetterstation.svg)](https://github.com/SBorg2014/WLAN-Wetterstation/releases/latest) 4 | [![Scc Count Badge](https://sloc.xyz/github/SBorg2014/WLAN-Wetterstation/?category=code)](https://github/SBorg2014/WLAN-Wetterstation/) 5 | [![Downloads](https://img.shields.io/github/downloads/SBorg2014/WLAN-Wetterstation/latest/total.svg)](https://github.com/SBorg2014/WLAN-Wetterstation/releases/latest) 6 | [![GitHub download](https://img.shields.io/github/downloads/SBorg2014/WLAN-Wetterstation/total.svg)](https://github.com/SBorg2014/WLAN-Wetterstation/releases/latest) 7 | [![Contributors](https://img.shields.io/github/contributors/SBorg2014/WLAN-Wetterstation.svg)](https://github.com/SBorg2014/WLAN-Wetterstation/graphs/contributors) 8 | [![Average time to resolve an issue](http://isitmaintained.com/badge/resolution/SBorg2014/WLAN-Wetterstation.svg)](https://github.com/SBorg2014/WLAN-Wetterstation/issues) 9 | [![Percentage of issues still open](http://isitmaintained.com/badge/open/SBorg2014/WLAN-Wetterstation.svg)](https://github.com/SBorg2014/WLAN-Wetterstation/issues) 10 | [![GitHub issues](https://img.shields.io/github/issues/SBorg2014/WLAN-Wetterstation)](https://github.com/SBorg2014/WLAN-Wetterstation/issues) 11 | [![Commits since last release](https://img.shields.io/github/commits-since/SBorg2014/WLAN-Wetterstation/latest.svg)](https://github.com/SBorg2014/WLAN-Wetterstation/releases/latest) 12 | [![Visitors](https://api.visitorbadge.io/api/visitors?path=SBorg2014%2FWLAN-Wetterstation&label=Visitors%20since%2024.11.2024&labelColor=%235a5a5a&countColor=%234cc71e&style=flat&labelStyle=none)](https://visitorbadge.io/status?path=SBorg2014%2FWLAN-Wetterstation) 13 | [![License](https://img.shields.io/github/license/SBorg2014/WLAN-Wetterstation.svg)](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/LICENSE) 14 | [](https://api.gitsponsors.com/api/badge/link?p=E4fe5NJSbRsUJvEmBUW7KTRZMvejphK07f7hGHRGNm6EDSHEpb7x8898lN7IiN5i8JLpHVdSHZ6D4fwrPo4pGw==) 15 | 16 | schafft eine Verbindung von einer WLAN-Wetterstation zum ioBroker und kann optional die Wetterdaten für [AWEKAS.at](https://www.awekas.at), [openSenseMap](https://opensensemap.org), [Windy](https://www.windy.com), [WeatherObservationsWebsite (WOW)](https://wow.metoffice.gov.uk/) und [wetter.com](https://www.wetter.com) zur Verfügung stellen (__Projekt läuft nur unter Linux__)
17 | 18 | Die Wetterstation muss dazu in der Lage sein ihre Daten im "Wunderground/Ecowitt"-Format zu senden.

19 | Bisher getestete Stationen: 20 | - BRESSER® 21 | * WLAN Farb-Wetter Center mit 5-in-1 Profi-Sensor V (*) 22 | * WLAN Comfort Wetterstation mit 7-in-1 Profi-Sensor (*) 23 | - ChiliTec Funk Wetterstation 12in1 24 | - Curconsa FT0300 (*) (inkl. Zusatzsensor) 25 | - DNT Weatherscreen PRO 26 | - Ecowitt 27 | * Gateway GW1000 28 | * Gateway GW2000A 29 | * WS2910 30 | - ELV WS980WiFi 31 | - Eurochron EFWS 2900 (baugleich zu Sainlogic 10in1 Wifi, Ambient Weather WS-2902, Chilitec CTW-902 Wifi) 32 | - Froggit 33 | * Gateway/USB-Dongle DP1500/DP2000 34 | * HP1000SE Pro 35 | * WH3000 SE 36 | * WH4000 SE 37 | * WH6000 Pro 38 | - Renkforce WH2600 39 | - Sainlogic 40 | * 7in1 WiFi WS3500 41 | * Profi Wlan Wetterstation FT0300 (*) 42 | - Ventus W830 43 | 44 | (*) über DNS-Server wie bspw. PiHole oder dnsmasq 45 |

46 | 47 | Zusatzsensoren (mittels Station oder Gateway DP1500/DP2000/GW1000/GW2000A): 48 | - bis zu 8 Stück DP10/WN35 Blattfeuchte-Sensoren 49 | - bis zu 8 Stück DP30/WH31 Temperatur-Sensoren(3)(4) 50 | - bis zu 8 Stück DP35/WN34 Wassertemperatur-Sensoren 51 | - ein DP40/WH32 (bzw. WH26) Außentemperatur- und Luftfeuchtigkeitssensor 52 | - bis zu 8 Stück DP50/WH31A Temperatur-/Luftfeuchtigkeit-Sensoren(4) 53 | - ein DP60/WH57 Blitzsensor 54 | - bis zu 4 Stück DP70/WH55 Wasserleckage-Sensoren 55 | - bis zu 16 Stück DP100/WH51[L] Bodenfeuchte-Sensoren(4) 56 | - bis zu 4 Stück DP200/WH43 PM2.5 Feinstaub-Sensoren 57 | - ein DP250/WH45 5-In-1 CO2 / PM2.5 / PM10 / Temperatur / Luftfeuchte Innenraumsensor 58 | - ein DP300/WS68 Solarunterstütztes Anemometer mit UV-Lichtsensor 59 | - ein WH25 Sensor 60 | - ein WS90 "Wittboy" Sensor 61 | - BRESSER® (1) 62 | * bis zu 4 Stück(2) _BRESSER® Thermo-/Hygro-Sensor 7 Kanal_ #7009999 63 | 64 |
*(1) nicht alle Bresser-Stationen unterstützen Zusatzsensoren! siehe [hier](https://forum.iobroker.net/post/977421)
65 | (2) durch das verwendete Wunderground-Protokoll limitiert 66 | (3) sind als DP50 einzutragen 67 | (4) es sind in Summe nur max. 16 Sensoren der Typen DP30/50/100 bzw. deren WHxx-Derivate möglich.

68 | __Die mögliche Anzahl der Zusatzsensoren ist nicht durch das Skript begrenzt, sondern wird vom Display und/oder Gateway bestimmt.__* 69 |

70 | 71 | über eigenen DNS-Server: 72 | - Stationen ohne Möglichkeit der Konfiguration mittels App *WS View\[+\]* wie bspw. *Sainlogic Profi Wlan Wetterstation FT0300* oder Stationen der Firma BRESSER® 73 | - Installation siehe [WiKi](https://github.com/SBorg2014/WLAN-Wetterstation/wiki/Installation---eigener-DNS-Server) 74 |

75 | 76 | ## Unterstützung für dieses/zukünftige Projekte ## 77 | Wer möchte kann mir gerne einen Kaffee ausgeben und mich bei den Projekten unterstützen. Ich freue mich über jedweden Support.

78 | [![paypal](https://www.paypalobjects.com/de_DE/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=RR76AEZHPJ7H4&source=url) 79 |

80 | 81 | Beispiel einer Visualisierung per Grafana (zu finden [hier](https://github.com/SBorg2014/WLAN-Wetterstation/tree/master/Grafana%20Dashboard)): 82 | ![Grafana](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Grafana-0.png) 83 | ![Grafana](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Grafana-1.png) 84 |

85 | Datenpunkte im ioBroker:
86 | ![ioB-Datenpunkte](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/ioB-Datenpunkte.png) 87 |

88 | Daten in openSenseMap:
89 | ![Bild openSenseMap](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/OSEM_Messwerte.png) 90 |

91 | Daten in Windy:
92 | ![Bild Windy](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Windy.png) 93 |

94 | Daten in Wetter.com:
95 | ![Bild Wetter.com](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/wettercom.gif) 96 |

97 | Daten in Awekas.at (Stationsseite, kostenlos):
98 | ![Bild Stationsseite AWEKAS](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Awekas_Stationsseite.png) 99 |
und kostenpflichtiges "Stationsweb": 100 | ![Bild Stationsweb AWEKAS](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Awekas_Stationsweb.png) 101 |

102 | Auszug von WeatherObservationsWebsite (WOW): 103 | ![Bild WOW](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/WOW.png) 104 |

105 | 106 | 107 | ## Weiterführende Informationen ## 108 | ***[Thread im ioBroker-Forum](https://forum.iobroker.net/topic/28384/linux-shell-skript-wlan-wetterstation)*** 109 |

110 | 111 | ## Installation ## 112 | ***[siehe WiKi](https://github.com/SBorg2014/WLAN-Wetterstation/wiki)*** 113 |

114 | 115 | ## Wetterstation-Statistik (Addon) ## 116 | ![ioB-Datenpunkte](https://github.com/SBorg2014/WLAN-Wetterstation/blob/master/Bilder/Wetterstatistik_DPs.png) 117 |
118 | ***[siehe WiKi](https://github.com/SBorg2014/WLAN-Wetterstation/wiki/Wetterstation-Statistik)*** 119 |

120 | 121 | ## Versionen ## 122 | 123 | **V3.5.0 - 10.05.2025** 124 | ``` 125 | ~ Fix DP50/DP100 werden auch als FT0300-Sensoren erkannt 126 | ~ Fix bei AWEKAS.at - Skript bleibt bei fehlender Internet-Verbindung hängen 127 | + (Wasserdampf-)Drucksättigungsdefizit VPD / Issue #79 128 | ~ Unterstützung für bis zu 16x DP100 / Issue #80 129 | ``` 130 | 131 | **V3.4.0 - 20.07.2024** 132 | ``` 133 | ~ Fix "Kommunikationsfehler" bei Gateways mit Firmware ab V3.1.1 / Issue #71 134 | ~ Fix am ws_updater, Restart des Service wird nach Update nicht ausgeführt 135 | ``` 136 | 137 | **V3.3.0 - 06.07.2024** 138 | ``` 139 | + Fix Simple API-Fehlermeldung bei leerer Solarenergie 140 | + Fix DP "Windy Datenübertragung" verbleibt auf "false" trotz erfolgreicher Datenübertragung 141 | (Änderung an der API von windy) 142 | + Raw-Werte bei DP100/WH51[L] hinzugefügt 143 | ``` 144 | 145 | **V3.2.0 - 12.08.2023** 146 | ``` 147 | + Support für WeatherObservationsWebsite (WOW) 148 | + Fix Zeitstempel für neuere Gateway-Firmwarereleases die ein URL-Encoding enthalten 149 | ``` 150 | 151 | **V3.1.1 - 05.06.2023 Bugfix Release** 152 | ``` 153 | + Fix "MetSommer" (Skript bleibt bei den Mitternachtjobs hängen) 154 | ``` 155 | 156 | **V3.1.0 - 16.03.2023 Bugfix Release** 157 | ``` 158 | + Windböe max für Stationen die den Wert nicht liefern 159 | + Option "k" für selbstsignierte Zertifikate bei der Influx-Abfrage hinzugefügt 160 | + Parameter "--influx_test" zum test der Influx-Konnektivität 161 | + Fix "MetSommer" (Skript bleibt bei den Mitternachtjobs hängen) 162 | ``` 163 | 164 | **V3.0.0 - 08.02.2023 Breaking Release** 165 | ``` 166 | ~ Breaking Release / Support für (und nur noch!) InfluxDB V2.x / Issue #41 167 | ~ Mindestintervall von 65 Sekunden beim Datenversand an AWEKAS.at 168 | + Support Zusatzsensor Curconsa FT0300 / Pull Request #55 (LukasTr1980) 169 | ~ Anzahl maximaler interner Sensoren von 30 auf 35 angehoben 170 | ``` 171 | 172 | **V2.21.0 - 15.01.2023** 173 | ``` 174 | + Support für AWEKAS 175 | ~ fix fehlende Regenwerte wenn nur der WS90 ohne weitere Außeneinheit benutzt wird / Issue #51 176 | ``` 177 | 178 | **V2.20.0 - 12.12.2022** 179 | ``` 180 | ~ fix Wolkenbasis (keine Werte falls Taupunkt negativ) / Issue #46 (viper4iob) 181 | ~ fix Wetterwarnung (Reif) / Issue #47 (viper4iob) 182 | ~ fix OpenSenseMap für Stationen die 10-Minutendurchschnittswerte bereits liefern / Issue #48 (viper4iob) 183 | ``` 184 | 185 | **V2.19.0 - 12.08.2022** 186 | ``` 187 | + Wetterwarnungen Schwüle, Tau/Nebel und Reif 188 | ~ URL-Encoding für Umlaute 189 | + Unterstützung für WS90 "Wittboy" 190 | ``` 191 | 192 | **V2.18.0 - 28.07.2022** 193 | ``` 194 | + Höhe der Wolkenbasis 195 | + Windrichtung der letzten 10 Minuten als Text 196 | + Unterstützung für DP10/WN35 Blattfeuchte-Sensor 197 | + Ausgabe der Skriptversion in Datenpunkt beim Start 198 | ``` 199 | 200 | **V2.17.0 - 22.07.2022** 201 | ``` 202 | + durchschnittliche Windrichtung und -geschwindigkeit der letzten 10 Minuten alternativ anstelle 203 | der aktuellen Werte an OpenSenseMap, windy und wetter.com senden 204 | + Temperaturtrend Aussentemperatur der letzten Stunde 205 | ~ Fix für Datenübertragung an nicht antwortenden OSeM-Server 206 | ``` 207 | 208 | **V2.16.0 - 12.07.2022** 209 | ``` 210 | + Windrichtung der letzten 10 Minuten für alle Stationen (benötigt wird dafür nun noch 'dc') 211 | + durchschnittliche Windgeschwindigkeit der letzten 10 Minuten für alle Stationen 212 | ~ Bugfix gelegentlicher "jq parse"-Fehler 213 | ~ Bugfix Regenmenge des meteorologischen Sommers aktualisiert sich nicht 214 | ``` 215 | 216 | **V2.15.0 - 19.06.2022** 217 | ``` 218 | + neuer DP "Meldungen"; für Status- und Fehlermeldungen 219 | + Datenübertragung an Wunderground.com auch bei eigenem DNS-Server (Protokoll #9)(@git-ZeR0) 220 | + Windrichtung und -geschwindigkeit der letzten 10 Minuten (aktuell HP1000SE Pro) 221 | + ws_updater: anlegen neuer Datenpunkte per Rest-API möglich 222 | ``` 223 | 224 | **V2.14.0 - 28.05.2022** 225 | ``` 226 | ~ Fixed authentication for Simple-API setBulk requests (@crycode-de) 227 | + Set ack flag on setBulk requests (requires PR ioBroker/ioBroker.simple-api#145) (@crycode-de) 228 | + Added option to ignore SSL errors if HTTPS is used together with a self-signed certificate (@crycode-de) 229 | + Added the state .Info.Sonnenschein_VorTag_Text (@crycode-de) 230 | ~ Merge some SAPI "Single" calls into SAPI "Bulk" calls (@crycode-de) 231 | ``` 232 | 233 | **V2.13.0 - 05.04.2022** 234 | ``` 235 | + Unterstützung für DP35/WN34 Sensor (@Omnedon) 236 | ``` 237 | 238 | 239 | **V2.12.1 - 29.03.2022** 240 | ``` 241 | ~ Fehler bei "FIX_AUSSENTEMP" behoben (keine Datenübertragung an den ioB / Issue #31) 242 | ``` 243 | 244 | 245 | **V2.12.0 - 26.03.2022** 246 | ``` 247 | + bei fehlerhafter Außentemperatur erfolgt keine Datenübertragung des Paketes an den ioB 248 | ``` 249 | 250 | 251 | **V2.11.1 - 14.02.2022** 252 | ``` 253 | ~ Reduzierung valides Datenpaket auf 250 Zeichen 254 | ~ "SainLogic Pro"-Protokoll in "DNS" umbenannt 255 | ``` 256 | 257 | 258 | **V2.11.0 - 03.12.2021** 259 | ``` 260 | ~ Windgeschwindigkeit bei wetter.com in m/s 261 | + Konfigurationsmöglichkeit des Kommunikationsfehlers (Issue #26) 262 | ~ Bugfix Speicherort beim logging 263 | ~ Ergänzung bei Prüfung auf valides Datenpaket (Außentemperatur hinzugefügt) 264 | + Hinweis auf korrekte WS_ID bei Wunderground-Protokoll falls Kommunikationsfehler 265 | ``` 266 | 267 | 268 | **V2.10.1 - 22.11.2021** 269 | ``` 270 | ~ Bugfix 'jq'-Fehlermeldungen von 0:00 Uhr bis 01:00 Uhr 271 | ~ Bugfix Fehlermeldung "bereits existierender User" bei der OSeM-Registrierung obwohl keiner angelegt 272 | + bei Option '--debug' werden, sofern aktiviert, nun auch die Daten an den/die Wetter-Dienst(e) geschickt und deren Meldung(en) ausgegeben 273 | ~ Fix auftretende Fehlermeldung falls SimpleAPI nicht erreichbar war 274 | ~ Codeoptimierungen 275 | ``` 276 | 277 | 278 | **V2.10.0 - 21.10.2021** 279 | ``` 280 | ~ Bugfix Option '--data' bei Ecowitt-Protokoll 281 | ~ Passkey bei Nutzung des Ecowitt-Protokolls maskieren 282 | + logging des Datenstrings der Wetterstation in eine Datei 283 | + Unterstützung für DP40/WH32 (bzw. WH26) Sensor 284 | + Unterstützung für DP300/WS68 Sensor 285 | + Unterstützung für WH31 (bzw. WH25) Sensor 286 | + netcat-/Success-Meldungen im Syslog entfernt 287 | + Patch Sommer-/Winterzeit für wetter.com 288 | ``` 289 | 290 | 291 | **V2.9.0 - 25.08.2021** 292 | ``` 293 | + Min-/Max-Aussentemperatur des heutigen Tages 294 | ~ Änderung bei Datenübertragung per Simple-API wg. InfluxDB 2.x 295 | + Meteorologischer Sommer Durchschnittstemperatur und Regenmenge 296 | + neuer Shell-Parameter --metsommer (zur manuellen Berechnung der Werte des meteorologischen Sommers) 297 | ``` 298 | 299 | 300 | **V2.8.0 - 14.08.2021** 301 | ``` 302 | ~ Änderung am Messverfahren der Solarenergie (festes Poll-Intervall --> Zeitstempel) 303 | + Support für wetter.com 304 | ``` 305 | 306 | 307 | **V2.7.0 - 15.07.2021** 308 | ``` 309 | + Bei bereits eingetragenem OSEM-User erfolgt Abbruch der OSEM-Registrierung 310 | + Unterstützung für DP250/WH45 Sensor 311 | ~ Fix Prüfung netcat-Version 312 | ~ Berechnung Windchill nur bis 11°C 313 | ``` 314 | 315 | 316 | **V2.6.0 - 04.05.2021** 317 | ``` 318 | ~ Fix Avg Aussentemperatur vor einem Jahr 319 | ~ Windchill erst ab 5km/h Windgeschwindigkeit 320 | + Prüfung bei Option "v" ob die netcat-Version korrekt ist 321 | + Support für Windy 322 | ~ Hitzeindex 323 | ``` 324 | 325 | 326 | **V2.5.0 - 08.02.2021** 327 | ``` 328 | ~ Fix für Protokoll #9 wg. fehlender Regenrate 329 | + Min/Max/Avg Aussentemperatur vor einem Jahr 330 | + Unterstützung von max. 4 DP70 Sensoren 331 | ~ Codeoptimierungen 332 | ``` 333 | 334 | 335 | **V2.4.0 - 03.02.2021** 336 | ``` 337 | + Hitzeindex (>20°C) 338 | + Unterstützung von max. 4 DP200 Sensoren 339 | ``` 340 | 341 | 342 | **V2.3.0 - 26.01.2021** 343 | ``` 344 | ~ Fix Rundungsfehler Windchill/Taupunkt 345 | + Min/max Aussentemperatur der letzten 24h 346 | + Unterstützung für DP60 Sensor 347 | ~ Fix für Protokoll #9 wg. fehlender Regenrate 348 | ``` 349 | 350 | 351 | **V2.2.0 - 21.01.2021** 352 | ``` 353 | ~ Fix Batteriestatus 354 | ~ Chillfaktor umbenannt auf Windchill/gefühlte Temperatur 355 | + Berechnung Windchill + Taupunkt für Ecowitt-Protokoll 356 | ``` 357 | 358 | 359 | **V2.1.0 - 10.01.2021** 360 | ``` 361 | + zusätzliches Protokoll "9" für userspezifische Abfrage 362 | ~ Fix Reset kumulierte Regenmenge zum Jahresanfang 363 | ~ Fix für DP100 Bodenfeuchte 364 | ``` 365 | 366 | 367 | **V2.0.0 - 15.12.2020** 368 | ``` 369 | + Unterstützung des Gateways und Zusatzsensoren (@a200) 370 | + Protokoll (wunderground oder ecowitt) wählbar 371 | ``` 372 | 373 | 374 | **V1.6.0 - 06.12.2020** 375 | ``` 376 | + Patch (@a200) für neuere Firmwareversionen (V1.6.3) speziell bei Nutzung eines Gateways 377 | ~ Reset des Error-Kommunikationszählers 378 | + Prüfung bei Option "-v" ob 'bc' und 'jq' installiert sind 379 | ~ Option "n" bei netcat hinzugefügt 380 | ``` 381 | 382 | 383 | **V1.5.0 - 30.11.2020** 384 | ``` 385 | + Verschlüsselung mittels HTTPS möglich 386 | + Authentifizierung mittels User/Passwort 387 | + ws_updater.sh (zum updaten der wetterstation.conf) 388 | ``` 389 | 390 | 391 | **V1.4.0 - 15.11.2020** 392 | ``` 393 | + Support für OpenSenseMap 394 | ``` 395 | 396 | 397 | **V1.3.1 - 10.10.2020** 398 | ``` 399 | ~ fix für Leerzeichen im Verzeichnisnamen 400 | + Wetterstation-Statistik (JS-Addon) 401 | ``` 402 | 403 | 404 | **V1.3.0 - 22.06.2020** 405 | ``` 406 | + letztes Regenereignis und Regenmenge 407 | + Fehlermeldung bei falscher WS_ID / ID der Wetterstation 408 | + Sonnenscheindauer + Solarenergie vom Vortag 409 | ~ Änderung/Fix Sonnenscheindauer 410 | ``` 411 | 412 | 413 | **V1.2.0 - 01.05.2020** 414 | ``` 415 | + Firmwareupgrade verfügbar? 416 | + Firmwareversion 417 | + Sonnenscheindauer Heute, Woche, Monat, Jahr 418 | + UV-Belastung 419 | + Solarenergie Heute, Woche, Monat, Jahr 420 | + Vorjahreswerte von Regenmenge, Sonnenscheindauer und Solarenergie 421 | ``` 422 | 423 | 424 | **V1.1.0 - 14.04.2020** 425 | ``` 426 | + aktueller Regenstatus 427 | + Luftdrucktendenz, Wettertrend und aktuelles Wetter 428 | ``` 429 | 430 | 431 | **V1.0.0 - 18.03.2020** 432 | ``` 433 | + Berechnung der Jahresregenmenge 434 | + Windrichtung zusätzlich als Text 435 | ~ Änderung "Regen Aktuell" in "Regenrate" 436 | ~ Splitt in conf- + sub-Datei 437 | ``` 438 | 439 | 440 | **V0.1.3 - 08.02.2020** 441 | ``` 442 | + Unterstützung für Datenpunkt "Regenmenge Jahr", zB. für Froggit WH4000SE 443 | + Shell-Parameter -s (Klartextanzeige Passwort + Station-ID) 444 | + Shell-Parameter --data (zeigt nur das gesendete Datenpaket der Wetterstation an) 445 | ``` 446 | 447 | **V0.1.2 - 31.01.2020** 448 | ``` 449 | + Prüfung auf Datenintegrität 450 | + neuer Datenpunkt bei Kommunikationsfehler 451 | + Ausgabe Datenpaket der Wetterstation bei Debug 452 | ``` 453 | 454 | **V0.1.1 - 01.01.2020** 455 | ``` 456 | + UTC-Korrektur 457 | + Config-Versionscheck 458 | + Shell-Parameter -v/-h/--debug 459 | ``` 460 | 461 | **V0.1.0 - erstes Release (29.12.2019)** 462 | ``` 463 | + erstes Release 464 | ``` 465 | 466 |

467 | ## :scroll: License ## 468 | MIT License 469 | 470 | Copyright (c)2019-2024 by SBorg 471 | 472 | Permission is hereby granted, free of charge, to any person obtaining a copy 473 | of this software and associated documentation files (the "Software"), to deal 474 | in the Software without restriction, including without limitation the rights 475 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 476 | copies of the Software, and to permit persons to whom the Software is 477 | furnished to do so, subject to the following conditions: 478 | 479 | The above copyright notice and this permission notice shall be included in all 480 | copies or substantial portions of the Software. 481 | 482 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 483 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 484 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 485 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 486 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 487 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 488 | SOFTWARE. 489 | 490 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-midnight 2 | -------------------------------------------------------------------------------- /firmware.version: -------------------------------------------------------------------------------- 1 | EasyWeatherV1.7.0 2 | -------------------------------------------------------------------------------- /wetterstation.conf: -------------------------------------------------------------------------------- 1 | ### Settings V3.5.0 ----------------------------------------------------------- 2 | #Debuging einschalten [true/false] / default: false / Ausgabe der Messwerte 3 | debug=false 4 | 5 | #Verhalten bei Kommunikationsfehler [true/false] / default: false / Soll der Datenpunkt automatisch resettet werden? 6 | RESET_KOMFEHLER=false 7 | 8 | #Logging einschalten [true/false] / default: false / schreibt die Datenstrings der Station in eine Datei 9 | logging=false 10 | 11 | #ioBroker-IP und Port der Simple-Restful-API [xxx.xxx.xxx.xxx:xxxxx] 12 | IPP=192.168.1.3:8087 13 | 14 | #Protokoll, ioBroker-IP und Port der Rest-API [http(s)://xxx.xxx.xxx.xxx:xxxxx] / leer lassen falls nicht benutzt 15 | RESTAPI_URL= 16 | RESTAPI_USER= 17 | RESTAPI_PW= 18 | 19 | #Protokoll der Wetterstation [1/2/9] / 1=Wunderground ; 2=Ecowitt ; 9=DNS / default: 2 20 | WS_PROTOKOLL=2 21 | 22 | #Anzahl der vorhandenen Zusatzsensoren Froggit, Ecowitt und Bresser / default: 0 23 | ANZAHL_WH31=0 24 | ANZAHL_WS90=0 25 | ANZAHL_DP10=0 26 | ANZAHL_DP35=0 27 | ANZAHL_DP40=0 28 | ANZAHL_DP50=0 29 | ANZAHL_DP60=0 30 | ANZAHL_DP70=0 31 | ANZAHL_DP100=0 32 | ANZAHL_DP200=0 33 | ANZAHL_DP250=0 34 | ANZAHL_DP300=0 35 | ANZAHL_7009999=0 36 | 37 | #Protokoll (HTTP oder HTTPS) / default: HTTP 38 | WEB=HTTP 39 | 40 | #Ignoriere Zertifikatsfehler bei der Simple-Restful-API [true/false] / default: false / nötig bei eigenen Zertifikaten 41 | WEB_IGN_SSL_ERROR=false 42 | 43 | #User-Authentifizierung falls benutzt; sonst leer lassen 44 | AUTH_USER= 45 | AUTH_PASS= 46 | 47 | #Port der Wetterstation 48 | WS_PORT=1080 49 | 50 | #Pollintervall der Wetterstation in Sekunden (minimal 16 Sekunden) 51 | WS_POLL=30 52 | 53 | #Name/ID der Wetterstation 54 | WS_ID=ZuHause 55 | 56 | #wo sollen die Datenobjekte abgelegt werden 57 | PRE_DP=0_userdata.0.Wetterstation 58 | 59 | #InfluxDB-Konfiguration / ohne InfluxDB alles leer lassen 60 | #Protokoll (HTTP oder HTTPS) / default: HTTP 61 | INFLUX_WEB=HTTP 62 | #IP und Port der API [xxx.xxx.xxx.xxx:xxxxx] 63 | INFLUX_API= 64 | #Bucket, Token und Organisation der InfluxDB 65 | INFLUX_BUCKET= 66 | INFLUX_TOKEN= 67 | INFLUX_ORG= 68 | 69 | #letztes Regenereignis als [DATUM], [UNIX]-Timestamp oder [DIFF]erenz ("vor xx Tagen") 70 | # DATUM = 28.04.2020 13:12 71 | # UNIX = 1588074964 72 | # DIFF = gerade eben / vor einer Stunde / vor 23 Stunden / vor einem Tag / vor 12 Tagen 73 | 74 | LAST_RAIN=DIFF 75 | 76 | #Text-Format für Datenpunkte "Sonnenschein_[Tag|Woche|Monat|Jahr]_Text" 77 | # zweistellig wird ggf. mit einer führenden "0" aufgefüllt 78 | # d = Tag(e) 0...n ein- und mehrstellig / h = Stunden 0...n ein- oder mehrstellig 79 | # hh = Stunden zweistellig (00...23) / mm = Minuten zweistellig (00...59) / ss = Sekunden zweistellig (00...59) 80 | # 81 | # Beispiel: 68 Stunden, 2 Minuten und 15 Sekunden 82 | # 83 | # Auswahl | Ausgabe im Datenpunkt 84 | # ---------------------------------------------------------------------------- 85 | # [0] = h Std. mm Min. ss Sek. | 68 Std. 02 Min. 15 Sek. 86 | # [1] = h:mm | 68:02 87 | # [2] = d Tag/e h Std. | 2 Tage 20 Std. 88 | # [3] = d Tag/e, h Std, m Min | 2 Tage, 20 Std, 2 Min (Anzeige Tage erst bei >0) 89 | 90 | SONNENSCHEIN_TXTFORMAT=3 91 | 92 | 93 | #Daten an Wetter.com senden (leer lassen falls nicht gewünscht)? 94 | WETTERCOM_ID= 95 | WETTERCOM_PW= 96 | 97 | #Daten an Wunderground.com senden? [true/false] / default: false 98 | #Nur nötig und sinnvoll bei WS_PROTOKOLL=9 (DNS) wenn trotzdem auch Daten weiterhin an Wunderground.com gesendet werden sollen. 99 | WUNDERGROUND_UPDATE=false 100 | 101 | #Windrichtung und -geschwindigkeit der letzten 10 Minuten anstelle aktueller Werte an 102 | #windy/OpenSenseMap/wetter.com übertragen? [true/false] / default: false 103 | USE_AVG_WIND=false 104 | 105 | #Fix aktivieren bei fehlerhafter Außentemperatur [true/false] / default: false 106 | #Bei unplausiblem Messwert wird kein Datenpaket an den ioB geschickt 107 | FIX_AUSSENTEMP=false 108 | 109 | 110 | 111 | 112 | ############################################################################################# 113 | ### openSenseMap - Einstellungen (nur nötig falls openSenseMap benutzt werden soll) ### 114 | ### ### 115 | ### Für die Registrierung muss "openSenseMap" auf "false" eingestellt sein! ### 116 | ### Erst wenn auch Sensoren angelegt wurden, darf auf "true" umgestellt werden! ### 117 | ############################################################################################# 118 | 119 | #openSenseMap aktivieren [true/false] / default: false 120 | openSenseMap=false 121 | 122 | #SenseBox-User 123 | senseBox_USER= 124 | 125 | #SenseBox-Password 126 | senseBox_PWD= 127 | 128 | #ID der senseBox (24-stellig) 129 | senseBox_ID= 130 | 131 | #Security-Token der Box 132 | BOX_TOKEN= 133 | 134 | 135 | 136 | ### Die restlichen Einstellungen für OpenSenseMap werden vom System generiert/benutzt ###### 137 | ### Änderungen sind hier nicht nötig, außer man weiß ganz genau was man tut! ############### 138 | 139 | #Sensor-IDs (wird automatisch anhand der Sensoren erzeugt) 140 | SENSEBOX_IDSENSOR=() 141 | 142 | #Sensor-Bezeichnung (Reihenfolge muss zur Sensor-ID identisch sein!) 143 | SENSEBOX_IDNAME=("Temperatur" "Luftfeuchte" "Luftdruck relativ" "Luftdruck absolut" "Taupunkt" "gefühlte Temperatur" "Sonnenstrahlung" "Windgeschwindigkeit" "Windrichtung" "UV-Index" "Regenrate") 144 | 145 | #Messwertezuordnung (Reihenfolge muss zur Sensor-ID identisch sein!) 146 | SENSEBOX_IDMESSWERT=(1 5 10 9 2 3 16 6 8 17 11) 147 | 148 | #Sensorendefinitionen 149 | ICONS=(osem-thermometer osem-humidity osem-barometer osem-barometer osem-thermometer osem-thermometer osem-brightness osem-particulate-matter osem-particulate-matter osem-brightness osem-umbrella) 150 | UNITS=('°C' '%H' 'hPa' 'hPa' '°C' '°C' 'W/m²' 'km/h' '°' 'Index' 'mm/h') 151 | 152 | ############################################################################################# 153 | ### openSenseMap - Ende der Einstellungen ############################################# 154 | ############################################################################################# 155 | 156 | 157 | 158 | ############################################################################################# 159 | ### Windy - Einstellungen (nur nötig falls Windy benutzt werden soll) ### 160 | ############################################################################################# 161 | 162 | #Windy aktivieren [true/false] / default: false 163 | use_windy=false 164 | 165 | #Windy API-Key 166 | windy_APIKey= 167 | 168 | #Station [number: 0 - 2147483647] / default: 0 169 | windy_Station= 170 | 171 | #Name der Station [Text] 172 | windy_Name= 173 | 174 | #Latitude/Breitengrad der Station 175 | windy_Latitude= 176 | 177 | #Longitude/Längengrad der Station 178 | windy_Longitude= 179 | 180 | #Elevation/Höhe ÜNN 181 | windy_Elevation= 182 | 183 | #Montagehöhe Temperatursensor über Boden 184 | windy_Tempheight= 185 | 186 | #Montagehöhe Windsensor über Boden 187 | windy_Windheight= 188 | 189 | ############################################################################################# 190 | ### Windy - Ende der Einstellungen #################################################### 191 | ############################################################################################# 192 | 193 | 194 | 195 | ############################################################################################# 196 | ### AWEKAS - Einstellungen (nur nötig falls AWEKAS benutzt werden soll) ### 197 | ############################################################################################# 198 | 199 | #AWEKAS aktivieren [true/false] / default: false 200 | use_awekas=false 201 | 202 | #AWEKAS Login Username und Passwort 203 | AWEKAS_USER= 204 | AWEKAS_PW= 205 | 206 | ############################################################################################# 207 | ### AWEKAS - Ende der Einstellungen ################################################### 208 | ############################################################################################# 209 | 210 | 211 | 212 | ############################################################################################# 213 | ### WOW - Einstellungen (nur nötig falls WOW benutzt werden soll) ### 214 | ############################################################################################# 215 | 216 | #WOW aktivieren [true/false] / default: false 217 | use_wow=false 218 | 219 | #WOW Site ID und Authentication Key 220 | WOW_SITEID= 221 | WOW_AUTHKEY= 222 | 223 | ############################################################################################# 224 | ### WOW - Ende der Einstellungen ###################################################### 225 | ############################################################################################# 226 | 227 | ### Ende Usereinstellungen 228 | ###EoF 229 | -------------------------------------------------------------------------------- /wetterstation.js: -------------------------------------------------------------------------------- 1 | //Wetterstation Datenpunkte anlegen V3.5.0 2 | let DP = "0_userdata.0.Wetterstation."; 3 | let WH31 = 0; // Anzahl der WH31/WH25 Sensoren (max. 1 Stück) 4 | let WS90 = 0; // Anzahl der WS90 Sensoren (max. 1 Stück) 5 | let DP10 = 0; // Anzahl der DP10/WN35 Sensoren (max. 8 Stück) 6 | let DP35 = 0; // Anzahl der DP35/WN34 Sensoren (max. 8 Stück) 7 | let DP40 = 0; // Anzahl der DP40/WH32 Sensoren (max. 1 Stück) 8 | let DP50 = 0; // Anzahl der DP50/WH31 Sensoren (max. 8 Stück) 9 | let DP60 = 0; // Anzahl der DP60/WH57 Sensoren (max. 1 Stück) 10 | let DP70 = 0; // Anzahl der DP70/WH55 Sensoren (max. 4 Stück) 11 | let DP100 = 0; // Anzahl der DP100/WH51[L] Sensoren (max. 16 Stück) 12 | let DP200 = 0; // Anzahl der DP200/WH43 Sensoren (max. 4 Stück) 13 | let DP250 = 0; // Anzahl der DP250/WH45 Sensoren (max. 1 Stück) 14 | let DP300 = 0; // Anzahl der DP300/WS68 Sensoren (max. 1 Stück) 15 | let BR7009999 = 0; // Anzahl der Thermo-Hygro-7Ch-Sensoren (max. 4 Stück) 16 | let FT0300 = 0; // Anzahl der FT0300 Sensoren (max. 1 Stück) 17 | //Ende der User-Einstellungen ------------------- 18 | 19 | //Prüfe Objektpfad 20 | if (DP[DP.length - 1] != '.') { DP += '.'; } 21 | 22 | dpAnlegen(); 23 | 24 | async function dpAnlegen(){ 25 | await createStateAsync(DP + "Innentemperatur", 0, { name: "Temperatur im Haus", type: "number", role: "state", unit: "°C" }); 26 | await createStateAsync(DP + "Aussentemperatur", 0, { name: "Temperatur Außen", type: "number", role: "state", unit: "°C" }); 27 | await createStateAsync(DP + "Aussentemperatur_Trend", 0, { name: "Trend der Aussentemperatur der letzten Stunde", type: "number", role: "state", unit: "°C" }); 28 | await createStateAsync(DP + "Taupunkt", 0, { name: "Taupunkt", type: "number", role: "state", unit: "°C" }); 29 | await createStateAsync(DP + "Gefuehlte_Temperatur", 0, { name: "Windchill", type: "number", role: "state", unit: "°C" }); 30 | await createStateAsync(DP + "Innenfeuchtigkeit", 0, { name: "Luftfeuchtigkeit Innen", type: "number", role: "state", unit: "%" }); 31 | await createStateAsync(DP + "Aussenfeuchtigkeit", 0, { name: "Luftfeuchtigkeit Außen", type: "number", role: "state", unit: "%" }); 32 | await createStateAsync(DP + "Wind", 0, { name: "Windgeschwindigkeit", type: "number", role: "state", unit: "km/h" }); 33 | await createStateAsync(DP + "Wind_max", 0, { name: "Windgeschwindigkeit maximal", type: "number", role: "state", unit: "km/h" }); 34 | await createStateAsync(DP + "Wind_10min", 0, { name: "Windgeschwindigkeit Durchschnitt 10min", type: "number", role: "state", unit: "km/h" }); 35 | await createStateAsync(DP + "Windrichtung", 0, { name: "Windrichtung in Grad", type: "number", role: "state", unit: "°" }); 36 | await createStateAsync(DP + "Windrichtung_Text", " ", { name: "Windrichtung als Text", type: "string", role: "state" }); 37 | await createStateAsync(DP + "Windrichtung_Text_10min", " ", { name: "Windrichtung Durchschnitt 10 Minuten als Text", type: "string", role: "state" }); 38 | await createStateAsync(DP + "Windrichtung_10min", 0, { name: "Windrichtung Durchschnitt 10 Minuten", type: "number", role: "state", unit: "°" }); 39 | await createStateAsync(DP + "Druck_absolut", 0, { name: "Luftdruck absolut", type: "number", role: "state", unit: "hPa" }); 40 | await createStateAsync(DP + "Druck_relativ", 0, { name: "Luftdruck relativ", type: "number", role: "state", unit: "hPa" }); 41 | await createStateAsync(DP + "Druck_Tendenz", "", { name: "Luftdrucktendenz", type: "mixed", role: "state" }); 42 | await createStateAsync(DP + "Wetter_Trend", " ", { name: "Wettertrend", type: "string", role: "state" }); 43 | await createStateAsync(DP + "Wetter_aktuell", " ", { name: "aktuelles Wetter", type: "string", role: "state" }); 44 | await createStateAsync(DP + "Regenrate", 0, { name: "Regenrate", type: "number", role: "state", unit: "mm/h" }); 45 | await createStateAsync(DP + "Regenstatus", "--", { name: "aktueller Regenstatus", type: "string", role: "state" }); 46 | await createStateAsync(DP + "Regen_Tag", 0, { name: "Regenmenge Heute", type: "number", role: "state", unit: "mm" }); 47 | await createStateAsync(DP + "Regen_Woche", 0, { name: "Regenmenge Woche", type: "number", role: "state", unit: "mm" }); 48 | await createStateAsync(DP + "Regen_Monat", 0, { name: "Regenmenge Monat", type: "number", role: "state", unit: "mm" }); 49 | await createStateAsync(DP + "Regen_Jahr", 0, { name: "Regenmenge Jahr aus Station", type: "number", role: "state", unit: "mm" }); 50 | await createStateAsync(DP + "Regen_Jahr_kumuliert", 0, { name: "Regenmenge Jahr berechnet", type: "number", role: "state", unit: "mm" }); 51 | await createStateAsync(DP + "Sättigungsdefizit", 0, { name: "(Wasserdampf-)Drucksättigungsdefizit VPD", type: "number", role: "state", unit: "kPa" }); 52 | await createStateAsync(DP + "Sonnenstrahlung", 0, { name: "Sonnenstrahlung", type: "number", role: "state", unit: "W/m²" }); 53 | await createStateAsync(DP + "UV_Index", 0, { name: "UV Index", type: "number", role: "state" }); 54 | await createStateAsync(DP + "UV_Belastung", " ", { name: "UV-Belastung", type: "string", role: "state" }); 55 | await createStateAsync(DP + "Zeitstempel", " ", { name: "von wann ist die Messung", type: "string", role: "state" }); 56 | await createStateAsync(DP + "_Kommunikationsfehler", false, { name: "liegt ein Problem vor", type: "boolean", role: "state" }); 57 | await createStateAsync(DP + "tempData.Wetterdaten", " ", { name: "temporär gespeicherte Wetterdaten", type: "string", role: "state" }); 58 | await createStateAsync(DP + "tempData.Sonnenschein", " ", { name: "temporäre Daten Tag, Woche, Monat, Jahr", type: "string", role: "state" }); 59 | await createStateAsync(DP + "tempData.Solarenergie", "0", { name: "temporäre Daten Tag, Woche, Monat, Jahr", type: "string", role: "state" }); 60 | await createStateAsync(DP + "Info.FW_Upgrade", false, { name: "neue Firmware für die Station", type: "boolean", role: "state" }); 61 | await createStateAsync(DP + "Info.FW_Version", " ", { name: "Firmwareversion der Station", type: "string", role: "state" }); 62 | await createStateAsync(DP + "Info.Meldungen", " ", { name: "Status- und Fehlermeldungen", type: "string", role: "state" }); 63 | await createStateAsync(DP + "Info.Hitzeindex", 0, { name: "Hitzeindex (erst ab 20°C)", type: "mixed", role: "state", unit: "°C" }); 64 | await createStateAsync(DP + "Info.openSenseMap", false, { name: "Datenübertragung openSenseMap erfolgreich", type: "boolean", role: "state" }); 65 | await createStateAsync(DP + "Info.Shellscriptversion", false, { name: "Versionsnummer des Scriptes", type: "string", role: "state" }); 66 | await createStateAsync(DP + "Info.Windy", false, { name: "Datenübertragung Windy erfolgreich", type: "boolean", role: "state" }); 67 | await createStateAsync(DP + "Info.Wetter_com", false, { name: "Datenübertragung Wetter.com erfolgreich", type: "boolean", role: "state" }); 68 | await createStateAsync(DP + "Info.WOW", false, { name: "Datenübertragung WOW erfolgreich", type: "boolean", role: "state" }); 69 | await createStateAsync(DP + "Info.Wunderground_com", false, { name: "Datenübertragung Wunderground.com erfolgreich", type: "boolean", role: "state" }); 70 | await createStateAsync(DP + "Info.Awekas_at", false, { name: "Datenübertragung AWEKAS.at erfolgreich", type: "boolean", role: "state" }); 71 | await createStateAsync(DP + "Info.Sonnenschein_VorTag", 0, { name: "Sonnenscheindauer Gestern", type: "number", role: "state", unit: "Sek." }); 72 | await createStateAsync(DP + "Info.Sonnenschein_Tag", 0, { name: "Sonnenscheindauer Heute", type: "number", role: "state", unit: "Sek." }); 73 | await createStateAsync(DP + "Info.Sonnenschein_Woche", 0, { name: "Sonnenscheindauer diese Woche", type: "number", role: "state", unit: "Sek." }); 74 | await createStateAsync(DP + "Info.Sonnenschein_Monat", 0, { name: "Sonnenscheindauer diesen Monat", type: "number", role: "state", unit: "Sek." }); 75 | await createStateAsync(DP + "Info.Sonnenschein_Jahr", 0, { name: "Sonnenscheindauer dieses Jahr", type: "number", role: "state", unit: "Sek." }); 76 | await createStateAsync(DP + "Info.Sonnenschein_VorTag_Text", " ", { name: "Sonnenscheindauer Gestern als Text", type: "string", role: "state" }); 77 | await createStateAsync(DP + "Info.Sonnenschein_Tag_Text", " ", { name: "Sonnenscheindauer Heute als Text", type: "string", role: "state" }); 78 | await createStateAsync(DP + "Info.Sonnenschein_Woche_Text", " ", { name: "Sonnenscheindauer diese Woche als Text", type: "string", role: "state" }); 79 | await createStateAsync(DP + "Info.Sonnenschein_Monat_Text", " ", { name: "Sonnenscheindauer diesen Monat als Text", type: "string", role: "state" }); 80 | await createStateAsync(DP + "Info.Sonnenschein_Jahr_Text", " ", { name: "Sonnenscheindauer dieses Jahr als Text", type: "string", role: "state" }); 81 | await createStateAsync(DP + "Info.Sonnenschein_VorJahr", 0, { name: "Sonnenscheindauer letztes Jahr", type: "number", role: "state", unit: "Sek." }); 82 | await createStateAsync(DP + "Info.Regenmenge_VorJahr", 0, { name: "Regenmenge letztes Jahr", type: "number", role: "state", unit: "mm" }); 83 | await createStateAsync(DP + "Info.Regenmenge_Met_Sommer", 0, { name: "Regenmenge des meteorologischen Sommers", type: "number", role: "value", unit: "l/m²" }); 84 | await createStateAsync(DP + "Info.Solarenergie_VorTag", 0, { name: "Solarenergie Gestern", type: "number", role: "state", unit: "Wh/m²" }); 85 | await createStateAsync(DP + "Info.Solarenergie_Tag", 0, { name: "Solarenergie Heute", type: "number", role: "state", unit: "Wh/m²" }); 86 | await createStateAsync(DP + "Info.Solarenergie_Woche", 0, { name: "Solarenergie diese Woche", type: "number", role: "state", unit: "kWh/m²" }); 87 | await createStateAsync(DP + "Info.Solarenergie_Monat", 0, { name: "Solarenergie diesen Monat", type: "number", role: "state", unit: "kWh/m²" }); 88 | await createStateAsync(DP + "Info.Solarenergie_Jahr", 0, { name: "Solarenergie dieses Jahr", type: "number", role: "state", unit: "kWh/m²" }); 89 | await createStateAsync(DP + "Info.Solarenergie_VorJahr", 0, { name: "Solarenergie letztes Jahr", type: "number", role: "state", unit: "kWh/m²" }); 90 | await createStateAsync(DP + "Info.Letzter_Regen", " ", { name: "letztes Regenereignis", type: "string", role: "state" }); 91 | await createStateAsync(DP + "Info.Letzte_Regenmenge", 0, { name: "letzte Regenmenge", type: "number", role: "value", unit: "mm" }); 92 | await createStateAsync(DP + "Info.Station_Batteriestatus", 0, { name: "Batteriestatus [0=OK, 1=Alarm]", type: "number", role: "value" }); 93 | await createStateAsync(DP + "Info.Wetterstation_Gateway", " ", { name: "Gateway Informationen", type: "string", role: "state" }); 94 | await createStateAsync(DP + "Info.Wetterwarnung" ," ", {name: "mögliche Wetterereignisse", type: "string", role: "state" }); 95 | await createStateAsync(DP + "Info.Wolkenbasis", 0, { name: "Höhe der Wolkenbasis", type: "number", role: "state", unit: "m" }); 96 | await createStateAsync(DP + "Info.Temp_Aussen_24h_max", 0, { name: "höchste Aussentemperatur der letzten 24 Stunden", type: "number", role: "state", unit: "°C" }); 97 | await createStateAsync(DP + "Info.Temp_Aussen_Heute_max", 0, { name: "bisher höchste Aussentemperatur des heutigen Tages", type: "number", role: "value", unit: "°C" }); 98 | await createStateAsync(DP + "Info.Temp_Aussen_Heute_min", 0, { name: "bisher niedrigste Aussentemperatur des heutigen Tages", type: "number", role: "value", unit: "°C" }); 99 | await createStateAsync(DP + "Info.Temp_Aussen_24h_min", 0, { name: "tiefste Aussentemperatur der letzten 24 Stunden", type: "number", role: "value", unit: "°C" }); 100 | await createStateAsync(DP + "Info.Temp_Aussen_365t_min", 0, { name: "tiefste Aussentemperatur vor einem Jahr", type: "number", role: "value", unit: "°C" }); 101 | await createStateAsync(DP + "Info.Temp_Aussen_365t_max", 0, { name: "höchste Aussentemperatur vor einem Jahr", type: "number", role: "value", unit: "°C" }); 102 | await createStateAsync(DP + "Info.Temp_Aussen_365t_avg", 0, { name: "durchschnittliche Aussentemperatur vor einem Jahr", type: "number", role: "value", unit: "°C" }); 103 | await createStateAsync(DP + "Info.Temp_Met_Sommer_avg", 0, { name: "Durchschnittstemperatur des meteorologischen Sommers", type: "number", role: "value", unit: "°C" }); 104 | await createStateAsync(DP + "Windboeen_max", 0, { name: "Windböengeschwindigkeit maximal", type: "number", role: "value", unit: "km/h" }); 105 | await createStateAsync(DP + "Regen_Event", 0, { name: "Regenmenge Event", type: "number", role: "value", unit: "mm" }); 106 | await createStateAsync(DP + "Regen_Stunde", 0, { name: "Regenmenge Stunde", type: "number", role: "value", unit: "mm" }); 107 | await createStateAsync(DP + "Regen_Total", 0, { name: "Regenmenge Insgesammt", type: "number", role: "value", unit: "mm" }); 108 | 109 | if (DP100 > 0 && DP100 <= 16) { await DP100_anlegen(); console.log("Datenpunkte für DP100 angelegt..."); } 110 | if (WS90 > 0 && WS90 <= 1) { await WS90_anlegen(); console.log("Datenpunkte für WS90 angelegt..."); } 111 | if (BR7009999 > 0 && BR7009999 <= 4) { await BR7009999_anlegen(); console.log("Datenpunkte für Bresser #7009999 angelegt..."); } 112 | if (FT0300 > 0 && FT0300 <= 1) { await FT0300_anlegen(); console.log("Datenpunkte für Zusatzsensor FT0300 angelegt..."); } 113 | console.log("Anlegen der Datenpunkte beendet. Skript kann nun gestoppt werden..."); 114 | } 115 | 116 | if (WH31 > 0 && WH31 <= 1) { 117 | if (!existsState(DP + "WH31")) { createState(DP + "WH31", '', { name: "Temp-Luftfeuchte Sensor Innen" }); } 118 | for (var i = 1; i <= WH31; i++) { 119 | if (!existsState(DP + "WH31." + i + ".Batterie")) { 120 | createState(DP + "WH31." + i + ".Batterie", "", { 121 | "name": "WH31 Kanal " + i + " Batteriestatus [0=OK, 1=Alarm]", 122 | "type": "number", 123 | "role": "state" 124 | }); 125 | } 126 | } 127 | } 128 | 129 | 130 | //WS90 - Sensoren 131 | async function WS90_anlegen() { 132 | if (!existsState(DP + "WS90")) { await createStateAsync(DP + 'WS90', '', { name: 'WS90 "Wittboy"' }); } 133 | for (var i = 1; i <= WS90; i++) { 134 | if (!existsState(DP + 'WS90.' + i)) { await createStateAsync(DP + 'WS90.' + i, '', { name: i + '. Kanal' }); } 135 | if (!existsState(DP + 'WS90.' + i + '.aktuelle_Regenrate')) { 136 | await createStateAsync(DP + 'WS90.' + i + '.aktuelle_Regenrate', { 137 | name: 'WS90 Kanal ' + i + ' aktuelle Regenrate', 138 | type: 'number', 139 | role: 'state', 140 | unit: 'mm/h' 141 | }); 142 | } 143 | if (!existsState(DP + 'WS90.' + i + '.aktuelle_Regenmenge')) { 144 | await createStateAsync(DP + 'WS90.' + i + '.aktuelle_Regenmenge', { 145 | name: 'WS90 Kanal ' + i + ' aktuelle Regenmenge', 146 | type: 'number', 147 | role: 'state', 148 | unit: 'mm' 149 | }); 150 | } 151 | if (!existsState(DP + 'WS90.' + i + '.stuendliche_Regenmenge')) { 152 | await createStateAsync(DP + 'WS90.' + i + '.stuendliche_Regenmenge', { 153 | name: 'WS90 Kanal ' + i + ' stündliche Regenmenge', 154 | type: 'number', 155 | role: 'state', 156 | unit: 'mm' 157 | }); 158 | } 159 | if (!existsState(DP + 'WS90.' + i + '.taegliche_Regenmenge')) { 160 | await createStateAsync(DP + 'WS90.' + i + '.taegliche_Regenmenge', { 161 | name: 'WS90 Kanal ' + i + ' tägliche Regenmenge', 162 | type: 'number', 163 | role: 'state', 164 | unit: 'mm' 165 | }); 166 | } 167 | if (!existsState(DP + 'WS90.' + i + '.woechentliche_Regenmenge')) { 168 | await createStateAsync(DP + 'WS90.' + i + '.woechentliche_Regenmenge', { 169 | name: 'WS90 Kanal ' + i + ' wöchentliche Regenmenge', 170 | type: 'number', 171 | role: 'state', 172 | unit: 'mm' 173 | }); 174 | } 175 | if (!existsState(DP + 'WS90.' + i + '.monatliche_Regenmenge')) { 176 | await createStateAsync(DP + 'WS90.' + i + '.monatliche_Regenmenge', { 177 | name: 'WS90 Kanal ' + i + ' monatliche Regenmenge', 178 | type: 'number', 179 | role: 'state', 180 | unit: 'mm' 181 | }); 182 | } 183 | if (!existsState(DP + 'WS90.' + i + '.jaehrliche_Regenmenge')) { 184 | await createStateAsync(DP + 'WS90.' + i + '.jaehrliche_Regenmenge', { 185 | name: 'WS90 Kanal ' + i + ' jährliche Regenmenge', 186 | type: 'number', 187 | role: 'state', 188 | unit: 'mm' 189 | }); 190 | } 191 | if (!existsState(DP + 'WS90.' + i + '.Firmwareversion')) { 192 | await createStateAsync(DP + 'WS90.' + i + '.Firmwareversion', { 193 | name: 'WS90 Kanal ' + i + ' Firmwareversion', 194 | type: 'mixed', 195 | role: 'state' 196 | }); 197 | } 198 | if (!existsState(DP + 'WS90.' + i + '.Spannung_GoldCap')) { 199 | await createStateAsync(DP + 'WS90.' + i + '.Spannung_GoldCap', { 200 | name: 'WS90 Kanal ' + i + ' Spannung des GoldCaps (Solarzelle)', 201 | type: 'number', 202 | role: 'state', 203 | unit: 'Volt' 204 | }); 205 | } 206 | if (!existsState(DP + 'WS90.' + i + '.Batterie')) { 207 | await createStateAsync(DP + 'WS90.' + i + '.Batterie', { 208 | name: 'WS90 Kanal ' + i + ' Batterie', 209 | type: 'number', 210 | role: 'state', 211 | unit: 'Volt' 212 | }); 213 | } 214 | } 215 | } 216 | 217 | if (DP10 > 0 && DP10 <= 8) { 218 | if (!existsState(DP + "DP10")) { createState(DP + "DP10", '', { name: "Blattfeuchte Sensor" }); } 219 | for (var i = 1; i <= DP10; i++) { 220 | if (!existsState(DP + "DP10." + i + ".Blattfeuchte")) { 221 | createState(DP + "DP10." + i + ".Blattfeuchte", "", { 222 | "name": "DP10 Kanal " + i + " Blattfeuchte", 223 | "type": "number", 224 | "role": "state", 225 | "unit": "%" 226 | }); 227 | } 228 | if (!existsState(DP + "DP10." + i + ".Batterie")) { 229 | createState(DP + "DP10." + i + ".Batterie", "", { 230 | "name": "DP10 Kanal " + i + " Batterie", 231 | "type": "number", 232 | "role": "state", 233 | "unit": "Volt" 234 | }); 235 | } 236 | } 237 | } 238 | 239 | if (DP35 > 0 && DP35 <= 8) { 240 | if (!existsState(DP + "DP35")) { createState(DP + "DP35", '', { name: "Wassertemperatur Sensor Außen" }); } 241 | for (var i = 1; i <= DP35; i++) { 242 | if (!existsState(DP + "DP35." + i + ".Temperatur")) { 243 | createState(DP + "DP35." + i + ".Temperatur", "", { 244 | "name": "DP35 Kanal " + i + " Temperatur", 245 | "type": "number", 246 | "role": "state", 247 | "unit": "°C" 248 | }); 249 | } 250 | if (!existsState(DP + "DP35." + i + ".Batterie")) { 251 | createState(DP + "DP35." + i + ".Batterie", "", { 252 | "name": "DP35 Kanal " + i + " Batterie", 253 | "type": "number", 254 | "role": "state" 255 | }); 256 | } 257 | } 258 | } 259 | 260 | if (DP40 > 0 && DP40 <= 1) { 261 | if (!existsState(DP + "DP40")) { createState(DP + "DP40", '', { name: "Temp-Luftfeuchte Sensor Außen" }); } 262 | for (var i = 1; i <= DP40; i++) { 263 | if (!existsState(DP + "DP40." + i + ".Batterie")) { 264 | createState(DP + "DP40." + i + ".Batterie", "", { 265 | "name": "DP40 Kanal " + i + " Batteriestatus [0=OK, 1=Alarm]", 266 | "type": "number", 267 | "role": "state" 268 | }); 269 | } 270 | } 271 | } 272 | 273 | if (DP50 > 0 && DP50 <= 8) { 274 | if (!existsState(DP + "DP50")) { createState(DP + "DP50", '', { name: "Mehrkanal Thermo-Hygrometersensoren" }); } 275 | for (var i = 1; i <= DP50; i++) { 276 | if (!existsState(DP + "DP50." + i + ".Temperatur")) { 277 | createState(DP + "DP50." + i + ".Temperatur", "", { 278 | "name": "DP50 Kanal " + i + " Temperatur", 279 | "type": "number", 280 | "role": "state", 281 | "unit": "°C" 282 | }); 283 | } 284 | if (!existsState(DP + "DP50." + i + ".Feuchtigkeit")) { 285 | createState(DP + "DP50." + i + ".Feuchtigkeit", "", { 286 | "name": "DP50 Kanal " + i + " Feuchtigkeit", 287 | "type": "number", 288 | "role": "state", 289 | "unit": "%" 290 | }); 291 | } 292 | if (!existsState(DP + "DP50." + i + ".Batterie")) { 293 | createState(DP + "DP50." + i + ".Batterie", "", { 294 | "name": "DP50 Kanal " + i + " Batterie", 295 | "type": "number", 296 | "role": "state" 297 | }); 298 | } 299 | } 300 | } 301 | 302 | if (DP60 > 0 && DP60 <= 1) { 303 | if (!existsState(DP + "DP60")) { createState(DP + "DP60", '', { name: "Blitzdetektor" }); } 304 | for (let i = 1; i <= DP60; i++) { 305 | if (!existsState(DP + "DP60." + i + ".Entfernung")) { 306 | createState(DP + "DP60." + i + ".Entfernung", "", { 307 | "name": "DP60 Kanal " + i + " Entfernung", 308 | "type": "number", 309 | "role": "state", 310 | "unit": "km" 311 | }); 312 | } 313 | if (!existsState(DP + "DP60." + i + ".Zeitpunkt")) { 314 | createState(DP + "DP60." + i + ".Zeitpunkt", "", { 315 | "name": "DP60 Kanal " + i + " Zeitpunkt (Unix-Timestamp)", 316 | "type": "number", 317 | "role": "state" 318 | }); 319 | } 320 | if (!existsState(DP + "DP60." + i + ".Anzahl")) { 321 | createState(DP + "DP60." + i + ".Anzahl", "", { 322 | "name": "DP60 Kanal " + i + " Anzahl innerhalb von 24 Stunden", 323 | "type": "number", 324 | "role": "state" 325 | }); 326 | } 327 | if (!existsState(DP + "DP60." + i + ".Batterie")) { 328 | createState(DP + "DP60." + i + ".Batterie", "", { 329 | "name": "DP60 Kanal " + i + " Batterie (5 = max)", 330 | "type": "number", 331 | "role": "state" 332 | }); 333 | } 334 | } 335 | } 336 | 337 | if (DP70 > 0 && DP70 <= 4) { 338 | if (!existsState(DP + "DP70")) { createState(DP + "DP70", '', { name: "Mehrkanal-Wasserlecksensoren" }); } 339 | for (var i = 1; i <= DP70; i++) { 340 | if (!existsState(DP + "DP70." + i + ".Status")) { 341 | createState(DP + "DP70." + i + ".Status", "", { 342 | "name": "DP70 Kanal " + i + " Status (normal/Alarm)", 343 | "type": "string", 344 | "role": "state" 345 | }); 346 | } 347 | if (!existsState(DP + "DP70." + i + ".Batterie")) { 348 | createState(DP + "DP70." + i + ".Batterie", "", { 349 | "name": "DP70 Kanal " + i + " Batterie", 350 | "type": "number", 351 | "role": "state" 352 | }); 353 | } 354 | } 355 | } 356 | 357 | //DP100 / WH51[L] - Sensoren 358 | async function DP100_anlegen() { 359 | if (!existsState(DP + "DP100")) { await createStateAsync(DP + "DP100", '', { name: "Mehrkanal Bodenfeuchtesensoren" }); } 360 | for (var i = 1; i <= DP100; i++) { 361 | if (!existsState(DP + "DP100." + i + ".Bodenfeuchtigkeit")) { 362 | await createStateAsync(DP + "DP100." + i + ".Bodenfeuchtigkeit", "", { 363 | "name": "DP100 Kanal " + i + " Bodenfeuchtigkeit", 364 | "type": "number", 365 | "role": "state", 366 | "unit": "%" 367 | }); 368 | } 369 | if (!existsState(DP + "DP100." + i + ".Batterie")) { 370 | await createStateAsync(DP + "DP100." + i + ".Batterie", "", { 371 | "name": "DP100 Kanal " + i + " Batterie", 372 | "type": "number", 373 | "role": "state", 374 | "unit": "V" 375 | }); 376 | } 377 | if (!existsState(DP + "DP100." + i + ".Raw")) { 378 | await createStateAsync(DP + "DP100." + i + ".Raw", "", { 379 | "name": "DP100 Kanal " + i + " Raw-Wert", 380 | "type": "number", 381 | "role": "state" 382 | }); 383 | } 384 | } 385 | } 386 | 387 | if (DP200 > 0 && DP200 <= 4) { 388 | if (!existsState(DP + "DP200")) { createState(DP + "DP200", '', { name: "Feinstaub Emissionssensoren" }); } 389 | for (var i = 1; i <= DP200; i++) { 390 | if (!existsState(DP + "DP200." + i + ".PM25")) { 391 | createState(DP + "DP200." + i + ".PM25", "", { 392 | "name": "DP200 Kanal " + i + " 2.5µm Partikel", 393 | "type": "number", 394 | "role": "state", 395 | "unit": "µg/m³" 396 | }); 397 | } 398 | if (!existsState(DP + "DP200." + i + ".PM25_24h")) { 399 | createState(DP + "DP200." + i + ".PM25_24h", "", { 400 | "name": "DP200 Kanal " + i + " Durchschnitt per 24h", 401 | "type": "number", 402 | "role": "state", 403 | "unit": "µg/m³" 404 | }); 405 | } 406 | if (!existsState(DP + "DP200." + i + ".Batterie")) { 407 | createState(DP + "DP200." + i + ".Batterie", "", { 408 | "name": "DP200 Kanal " + i + " Batterie (5 = max)", 409 | "type": "number", 410 | "role": "state" 411 | }); 412 | } 413 | } 414 | } 415 | 416 | if (DP250 > 0 && DP250 <= 1) { 417 | if (!existsState(DP + "DP250")) { createState(DP + "DP250", '', { name: "5-In-1 CO2 / PM2.5 / PM10 / Temperatur / Luftfeuchte Innenraumsensor" }); } 418 | for (let i = 1; i <= DP250; i++) { 419 | if (!existsState(DP + "DP250." + i + ".Temperatur")) { 420 | createState(DP + "DP250." + i + ".Temperatur", "", { 421 | "name": "DP250 Kanal " + i + " Temperatur", 422 | "type": "number", 423 | "role": "value", 424 | "unit": "°C" 425 | }); 426 | } 427 | if (!existsState(DP + "DP250." + i + ".Luftfeuchtigkeit")) { 428 | createState(DP + "DP250." + i + ".Luftfeuchtigkeit", "", { 429 | "name": "DP250 Kanal " + i + " Luftfeuchtigkeit", 430 | "type": "number", 431 | "role": "value", 432 | "unit": "%" 433 | }); 434 | } 435 | if (!existsState(DP + "DP250." + i + ".PM25")) { 436 | createState(DP + "DP250." + i + ".PM25", "", { 437 | "name": "DP250 Kanal " + i + " 2.5µm Partikel", 438 | "type": "number", 439 | "role": "value", 440 | "unit": "µg/m³" 441 | }); 442 | } 443 | if (!existsState(DP + "DP250." + i + ".PM25_24h")) { 444 | createState(DP + "DP250." + i + ".PM25_24h", "", { 445 | "name": "DP250 Kanal " + i + " Durchschnitt per 24h", 446 | "type": "number", 447 | "role": "value", 448 | "unit": "µg/m³" 449 | }); 450 | } 451 | if (!existsState(DP + "DP250." + i + ".PM10")) { 452 | createState(DP + "DP250." + i + ".PM10", "", { 453 | "name": "DP250 Kanal " + i + " 10µm Partikel", 454 | "type": "number", 455 | "role": "value", 456 | "unit": "µg/m³" 457 | }); 458 | } 459 | if (!existsState(DP + "DP250." + i + ".PM10_24h")) { 460 | createState(DP + "DP250." + i + ".PM10_24h", "", { 461 | "name": "DP250 Kanal " + i + " Durchschnitt per 24h", 462 | "type": "number", 463 | "role": "value", 464 | "unit": "µg/m³" 465 | }); 466 | } 467 | if (!existsState(DP + "DP250." + i + ".CO2")) { 468 | createState(DP + "DP250." + i + ".CO2", "", { 469 | "name": "DP250 Kanal " + i + " CO2-Konzentration", 470 | "type": "number", 471 | "role": "value", 472 | "unit": "ppm" 473 | }); 474 | } 475 | if (!existsState(DP + "DP250." + i + ".CO2_24h")) { 476 | createState(DP + "DP250." + i + ".CO2_24h", "", { 477 | "name": "DP250 Kanal " + i + " Durchschnitt per 24h", 478 | "type": "number", 479 | "role": "value", 480 | "unit": "ppm" 481 | }); 482 | } 483 | if (!existsState(DP + "DP250." + i + ".Batterie")) { 484 | createState(DP + "DP250." + i + ".Batterie", "", { 485 | "name": "DP250 Kanal " + i + " Batterie (6 = max)", 486 | "type": "number", 487 | "role": "value" 488 | }); 489 | } 490 | } 491 | } 492 | 493 | if (DP300 > 0 && DP300 <= 1) { 494 | if (!existsState(DP + "DP300")) { createState(DP + "DP300", '', { name: "Solar unterstütztes Anemometer mit UV-Lichtsensor" }); } 495 | for (let i = 1; i <= DP300; i++) { 496 | if (!existsState(DP + "DP300." + i + ".Batterie")) { 497 | createState(DP + "DP300." + i + ".Batterie", "", { 498 | "name": "DP300 Kanal " + i + " Batterie", 499 | "type": "number", 500 | "role": "value", 501 | "unit": "Volt" 502 | }); 503 | } 504 | } 505 | } 506 | 507 | //Bresser #7009999 - Sensoren 508 | async function BR7009999_anlegen() { 509 | if (!existsState(DP + "BR7009999")) { await createStateAsync(DP + 'BR7009999', '', { name: 'Thermo-Hygro-7Ch-Sensor' }); } 510 | for (var i = 1; i <= BR7009999; i++) { 511 | if (!existsState(DP + 'BR7009999.' + i)) { await createStateAsync(DP + 'BR7009999.' + i, '', { name: i + '. Kanal' }); } 512 | if (!existsState(DP + 'BR7009999.' + i + '.Temperatur')) { 513 | await createStateAsync(DP + 'BR7009999.' + i + '.Temperatur', { 514 | name: 'BR7009999 Kanal ' + i + ' Temperatur', 515 | type: 'number', 516 | role: 'state', 517 | unit: '°C' 518 | }); 519 | } 520 | if (!existsState(DP + 'BR7009999.' + i + '.Luftfeuchte')) { 521 | await createStateAsync(DP + 'BR7009999.' + i + '.Luftfeuchte', { 522 | name: 'BR7009999 Kanal ' + i + ' Luftfeuchte', 523 | type: 'number', 524 | role: 'state', 525 | unit: '%' 526 | }); 527 | } 528 | } 529 | } 530 | 531 | //FT0300 - Sensoren 532 | async function FT0300_anlegen() { 533 | await createStateAsync(DP + "FT0300_Temperatur_1", 0, { name: "Temperatur FT0300 Sensor 1", type: "number", role: "state", unit: "°C" }); 534 | await createStateAsync(DP + "FT0300_Feuchte_1", 0, { name: "Feuchtigkeit FT0300 Sensor 1", type: "number", role: "state", unit: "%" }); 535 | } 536 | -------------------------------------------------------------------------------- /wetterstation.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | : <<'Versionsinfo' 3 | 4 | 5 | V3.5.0 - 10.05.2025 (c) 2019-2025 SBorg 6 | 7 | wertet ein Datenpaket einer WLAN-Wetterstation im Wunderground-/Ecowitt-Format aus, konvertiert dieses und überträgt 8 | die Daten an den ioBroker (alternativ auch an AWEKAS, OpenSenseMap, Windy, wetter.com und WeatherObservationsWebsite) 9 | 10 | benötigt den 'Simple RESTful API'-Adapter im ioBroker, 'jq', 'bc' und 'dc' unter Linux 11 | 12 | 13 | V3.5.0 / 10.05.2025 ~ Fix DP50/DP100 werden auch als FT0300-Sensoren erkannt 14 | ~ Fix bei AWEKAS.at - Skript bleibt bei fehlender Internet-Verbindung hängen 15 | + (Wasserdampf-)Drucksättigungsdefizit VPD / Issue #79 16 | ~ Unterstützung für bis zu 16x DP100 / Issue #80 17 | V3.4.0 / 20.07.2024 ~ Fix "Kommunikationsfehler" bei Gateways mit Firmware ab V3.1.1 / Issue #71 18 | ~ Fix am ws_updater, Restart des Service wird nach Update nicht ausgeführt 19 | V3.3.0 / 06.07.2024 + Fix Simple API-Fehlermeldung bei leerer Solarenergie 20 | + Fix DP "Windy Datenübertragung" verbleibt auf "false" trotz erfolgreicher Datenübertragung 21 | (Änderung an der API von windy) 22 | + Raw-Werte bei DP100/WH51[L] hinzugefügt 23 | V3.2.0 / 12.08.2023 + Support für WeatherObservationsWebsite (WOW) 24 | + Fix Zeitstempel für neuere Gateway-Firmwarereleases die ein URL-Encoding enthalten 25 | V3.1.1 / 04.06.2023 + Fix "MetSommer" (Skript bleibt bei den Mitternachtjobs hängen) 26 | V3.1.0 / 16.03.2023 + Windböe max für Stationen die den Wert nicht liefern 27 | + Option "k" für selbstsignierte Zertifikate bei der Influx-Abfrage hinzugefügt 28 | + Parameter "--influx_test" zum test der Influx-Konnektivität 29 | + Fix "MetSommer" (Skript bleibt bei den Mitternachtjobs hängen) 30 | V3.0.0 / 08.02.2023 ~ Breaking Release / Support für (und nur noch!) InfluxDB V2.x / Issue #41 31 | ~ Mindestintervall von 65 Sekunden beim Datenversand an AWEKAS.at 32 | + Support Zusatzsensor Curconsa FT0300 / Pull Request #55 (LukasTr1980) 33 | ~ Anzahl maximaler interner Sensoren von 30 auf 35 angehoben 34 | + Debug-Option zum Test der InfluxDB-Konnektivität 35 | V2.22.0 / 23.01.2023 + Support für Bresser Thermo-Hygro-7Ch-Sensor #7009999 / Issue #53 36 | V2.21.0 / 15.01.2023 + Support für AWEKAS 37 | ~ fix fehlende Regenwerte wenn nur der WS90 ohne weitere Außeneinheit benutzt wird / Issue #51 38 | V2.20.0 / 12.12.2022 ~ fix Wolkenbasis (keine Werte falls Taupunkt negativ) / Issue #46 (viper4iob) 39 | ~ fix Wetterwarnung (Reif) / Issue #47 (viper4iob) 40 | ~ fix OpenSenseMap für Stationen die 10-Minutendurchschnittswerte bereits liefern / Issue #48 (viper4iob) 41 | V2.19.0 / 12.08.2022 + Wetterwarnungen Schwüle, Tau/Nebel und Reif 42 | ~ URL-Encoding für Umlaute 43 | + Unterstützung für WS90 "Wittboy" 44 | V2.18.0 / 28.07.2022 + Höhe der Wolkenbasis 45 | + Windrichtung der letzten 10 Minuten als Text 46 | + Unterstützung für DP10/WN35 Blattfeuchte-Sensor 47 | + Ausgabe der Skriptversion in Datenpunkt beim Start 48 | V2.17.0 / 22.07.2022 + durchschnittliche Windrichtung und -geschwindigkeit der letzten 10 Minuten alternativ anstelle 49 | der aktuellen Werte an OpenSenseMap, windy und wetter.com senden 50 | + Temperaturtrend Aussentemperatur der letzten Stunde 51 | ~ Fix für Datenübertragung an nicht antwortenden OSeM-Server 52 | V2.16.0 / 12.07.2022 + Windrichtung der letzten 10 Minuten für alle Stationen (benötigt wird dafür nun noch 'dc') 53 | + durchschnittliche Windgeschwindigkeit der letzten 10 Minuten für alle Stationen 54 | ~ Bugfix gelegentlicher "jq parse"-Fehler 55 | ~ Bugfix Regenmenge des meteorologischen Sommers aktualisiert sich nicht 56 | V2.15.0 / 19.06.2022 + neuer DP "Meldungen"; für Status- und Fehlermeldungen 57 | + Datenübertragung an Wunderground.com auch bei eigenem DNS-Server (Protokoll #9)(@git-ZeR0) 58 | + Windrichtung und -geschwindigkeit der letzten 10 Minuten (aktuell HP1000SE Pro) 59 | + ws_updater: anlegen neuer Datenpunkte per Rest-API möglich 60 | V2.14.0 / 28.05.2022 ~ Fixed authentication for Simple-API setBulk requests (@crycode-de) 61 | + Set ack flag on setBulk requests (requires PR ioBroker/ioBroker.simple-api#145) (@crycode-de) 62 | + Added option to ignore SSL errors if HTTPS is used together with a self-signed certificate (@crycode-de) 63 | + Added the state .Info.Sonnenschein_VorTag_Text (@crycode-de) 64 | ~ Merge some SAPI "Single" calls into SAPI "Bulk" calls (@crycode-de) 65 | V2.13.0 / 05.04.2022 + Unterstützung für DP35/WN34 Sensor (@Omnedon) 66 | V2.12.1 / 29.03.2022 ~ Fehler bei "FIX_AUSSENTEMP" behoben (keine Datenübertragung an den ioB / Issue #31) 67 | V2.12.0 / 26.03.2022 + bei fehlerhafter Außentemperatur erfolgt keine Datenübertragung des Paketes an den ioB 68 | V2.11.1 / 14.02.2022 ~ Reduzierung valides Datenpaket auf 250 Zeichen 69 | ~ "SainLogic Pro"-Protokoll in "DNS" umbenannt 70 | V2.11.0 / 03.12.2021 ~ Windgeschwindigkeit bei wetter.com in m/s 71 | + Konfigurationsmöglichkeit des Kommunikationsfehlers (Issue #26) 72 | ~ Bugfix Speicherort beim logging 73 | ~ Ergänzung bei Prüfung auf valides Datenpaket (Außentemperatur hinzugefügt) 74 | + Hinweis auf korrekte WS_ID bei Wunderground-Protokoll falls Kommunikationsfehler 75 | V2.10.1 / 22.11.2021 ~ Bugfix 'jq'-Fehlermeldungen von 0:00 Uhr bis 01:00 Uhr 76 | ~ Bugfix Fehlermeldung "bereits existierender User" bei der OSeM-Registrierung obwohl keiner angelegt 77 | + bei Option '--debug' werden, sofern aktiviert, nun auch die Daten an den/die Wetter-Dienst(e) 78 | geschickt und deren Meldung(en) ausgegeben 79 | ~ Fix auftretende Fehlermeldung falls SimpleAPI nicht erreichbar war 80 | ~ Codeoptimierungen 81 | V2.10.0 / 21.10.2021 ~ Bugfix Option '--data' bei Ecowitt-Protokoll 82 | ~ Passkey bei Nutzung des Ecowitt-Protokolls maskieren 83 | + logging des Datenstrings der Wetterstation in eine Datei 84 | + Unterstützung für DP40/WH32 (bzw. WH26) Sensor 85 | + Unterstützung für DP300/WS68 Sensor 86 | + Unterstützung für WH31 (bzw. WH25) Sensor 87 | + netcat-/Success-Meldungen im Syslog entfernt 88 | + Patch Sommer-/Winterzeit für wetter.com 89 | V2.9.0 / 25.08.2021 + Min-/Max-Aussentemperatur des heutigen Tages 90 | ~ Änderung bei Datenübertragung per Simple-API wg. InfluxDB 2.x 91 | + Meteorologischer Sommer Durchschnittstemperatur und Regenmenge 92 | + neuer Shell-Parameter --metsommer (zur manuellen Berechnung der Werte des meteorologischen Sommers) 93 | V2.8.0 / 14.08.2021 ~ Änderung am Messverfahren der Solarenergie (festes Poll-Intervall --> Zeitstempel) 94 | + Support für wetter.com 95 | V2.7.0 / 15.07.2021 + Bei bereits eingetragenem OSEM-User erfolgt Abbruch der OSEM-Registrierung 96 | + Unterstützung für DP250/WH45 Sensor 97 | ~ Fix Prüfung netcat-Version 98 | ~ Berechnung Windchill nur bis 11°C 99 | V2.6.0 / 04.05.2021 ~ Fix Avg Aussentemperatur vor einem Jahr 100 | ~ Windchill erst ab 5km/h Windgeschwindigkeit 101 | + Prüfung bei Option "v" ob die netcat-Version korrekt ist 102 | + Support für Windy 103 | ~ Hitzeindex 104 | V2.5.0 / 08.02.2021 ~ Fix für Protokoll #9 wg. fehlender Regenrate 105 | + Min/Max/Avg Aussentemperatur vor einem Jahr 106 | + Unterstützung von max. 4 DP70 Sensoren 107 | ~ Codeoptimierungen 108 | V2.4.0 / 03.02.2021 + Hitzeindex (>20°C) 109 | + Unterstützung von max. 4 DP200 Sensoren 110 | V2.3.0 / 26.01.2021 ~ Fix Rundungsfehler Windchill/Taupunkt 111 | + Min/max Aussentemperatur der letzten 24h 112 | + Unterstützung für DP60 Sensor 113 | ~ Fix für Protokoll #9 wg. fehlender Regenrate 114 | V2.2.0 / 21.01.2021 ~ Fix Batteriestatus 115 | ~ Chillfaktor umbenannt auf Windchill/gefühlte Temperatur 116 | + Berechnung Windchill + Taupunkt für Ecowitt-Protokoll 117 | V2.1.0 / 10.01.2021 + zusätzliches Protokoll "9" für userspezifische Abfrage 118 | ~ Fix Reset kumulierte Regenmenge zum Jahresanfang 119 | ~ Fix für DP100 Bodenfeuchte 120 | V2.0.0 / 15.12.2020 + Unterstützung des Gateways und Zusatzsensoren (@a200) 121 | + Protokoll (wunderground oder ecowitt) wählbar 122 | V1.6.0 / 06.12.2020 + Patch (@a200) für neuere Firmwareversionen (V1.6.3) speziell bei Nutzung eines Gateways 123 | ~ Reset des Error-Kommunikationszählers 124 | + Prüfung bei Option "-v" ob 'bc' und 'jq' installiert sind 125 | ~ Option "n" bei netcat hinzugefügt 126 | V1.5.0 / 30.11.2020 ~ Simple-API per HTTP[S] und Authentifizierung 127 | + Update-Routine (beta) 128 | V1.4.0 / 30.10.2020 + Support für openSenseMap 129 | V1.3.1 / 08.10.2020 ~ Fix falls Leerzeichen im Verzeichnisnamen 130 | V1.3.0 / 19.06.2020 + letztes Regenereignis und Regenmenge 131 | + Fehlermeldung bei falscher WS_ID / ID der Wetterstation 132 | + Sonnenscheindauer + Solarenergie vom Vortag 133 | ~ Änderung/Fix Sonnenscheindauer 134 | V1.2.0 / 20.04.2020 + Firmwareupgrade verfügbar? 135 | + Firmwareversion 136 | + Sonnenscheindauer Heute, Woche, Monat, Jahr 137 | + UV-Belastung 138 | + Solarenergie Heute, Woche, Monat, Jahr 139 | + Vorjahreswerte von Regenmenge, Sonnenscheindauer und Solarenergie 140 | V1.1.0 / 03.04.2020 + aktueller Regenstatus 141 | + Luftdrucktendenz, Wettertrend und aktuelles Wetter 142 | V1.0.0 / 12.03.2020 + Berechnung Jahresregenmenge 143 | + Windrichtung zusätzlich als Text 144 | ~ Änderung "Regen Aktuell" in "Regenrate" 145 | ~ Splitt in conf- + sub-Datei 146 | V0.1.3 / 08.02.2020 + Unterstützung für Datenpunkt "Regenmenge Jahr", zB. für Froggit WH4000 SE 147 | + Shell-Parameter -s (Klartextanzeige Passwort + Station-ID) 148 | + Shell-Parameter --data (zeigt nur das gesendete Datenpaket der Wetterstation an) 149 | V0.1.2 / 31.01.2020 + Prüfung auf Datenintegrität 150 | + neuer Datenpunkt bei Kommunikationsfehler 151 | + Ausgabe Datenpaket der Wetterstation bei Debug 152 | V0.1.1 / 01.01.2020 + UTC-Korrektur 153 | + Config-Versionscheck 154 | + Shell-Parameter -v/-h/--debug 155 | V0.1.0 / 29.12.2019 erstes Release 156 | 157 | Versionsinfo 158 | ### Ende Infoblock 159 | 160 | #Versionierung 161 | SH_VER="V3.5.0" 162 | CONF_V="V3.5.0" 163 | SUBVER="V3.5.0" 164 | 165 | 166 | #Installationsverzeichnis feststellen 167 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" 168 | 169 | #Config-Version prüfen 170 | VER_CONFIG=$(cat "${DIR}/wetterstation.conf"|grep '### Setting'|cut -d" " -f3) 171 | if [ $CONF_V != $VER_CONFIG ]; then 172 | echo -e "wetterstation: \e[31mERROR #000 - Config-Version mismatch!\n" 173 | echo -e "benutzt: $VER_CONFIG\t benötigt wird: $CONF_V \e[0m" 174 | exit 1 175 | fi 176 | 177 | #Sub-Version prüfen 178 | SUB_CONFIG=$(cat "${DIR}/wetterstation.sub"|grep '### Subroutinen'|cut -d" " -f3) 179 | if [ $SUBVER != $SUB_CONFIG ]; then 180 | echo -e "wetterstation: \e[31mERROR #001 - Subroutinen-Version mismatch!\n" 181 | echo -e "benutzt: $SUB_CONFIG\t benötigt wird: $SUBVER \e[0m" 182 | exit 1 183 | fi 184 | 185 | #Konfiguration lesen + Subroutinen laden 186 | . "${DIR}/wetterstation.conf" 187 | . "${DIR}/wetterstation.sub" 188 | 189 | 190 | #gibt es Parameter? 191 | while [ "$1" != "" ]; do 192 | case $1 in 193 | --debug ) version 194 | debug=true #override 195 | ;; 196 | --osem_reg ) osem_register 197 | exit 198 | ;; 199 | --windy_reg ) windy_register 200 | exit 201 | ;; 202 | --metsommer ) metsom_override=true 203 | metsommer 204 | exit 205 | ;; 206 | --influx_test) minmax24h DEBUG 207 | exit 208 | ;; 209 | -s | --show ) show_pwid=true 210 | ;; 211 | -d | --data ) setup 212 | ws_data 213 | exit 214 | ;; 215 | -v | --version ) version 216 | exit 217 | ;; 218 | -h | --help ) usage 219 | exit 220 | ;; 221 | * ) usage 222 | exit 1 223 | esac 224 | shift 225 | done 226 | 227 | 228 | #Setup + Initial ausführen 229 | setup 230 | minmaxheute 231 | 232 | 233 | #Endlosschleife 234 | while true 235 | do 236 | 237 | #Kommunikation herstellen und Daten empfangen 238 | get_DATA 239 | 240 | #KOM-Fehler? 241 | if [ "$?" -eq "0" ]; then 242 | unset MESSWERTE; unset MESSWERTERAWIN 243 | MESSWERTERAWIN=(${DATA//&/ }) 244 | rawinlen=${#MESSWERTERAWIN[@]} 245 | j=35 246 | for (( i=1; i -273") )) 354 | then 355 | iob_send 356 | if [ "${TEMPFIX_ERR}" -gt "0" ]; then let "TEMPFIX_ERR--"; fi 357 | else 358 | MELDUNG "unplausibler Messwert Aussentemperatur. Datenpaket verworfen..." 359 | let "TEMPFIX_ERR++" 360 | if [ "${TEMPFIX_ERR}" -gt "10" ] 361 | then 362 | MELDUNG "m%C3%B6glicherweise Batterie des Wettermastes schwach" 363 | SAPI "Single" "set/${DP_STATION_BATTERIE}?value=1&ack=true" 364 | fi 365 | fi 366 | else 367 | iob_send 368 | fi 369 | 370 | #Reset Kommfehler 371 | if [ ! -z "$KOMFEHLER" ] && [ "$KOMFEHLER" -gt "0" ]; then 372 | let "KOMFEHLER--" 373 | if [ "$KOMFEHLER" -eq "0" ] && [ $RESET_KOMFEHLER == "true" ]; then SAPI "Single" "set/${DP_KOMFEHLER}?value=false&ack=true"; fi 374 | fi 375 | 376 | 377 | else 378 | let "KOMFEHLER++" 379 | if [ "$KOMFEHLER" -eq "10" ]; then SAPI "Single" "set/${DP_KOMFEHLER}?value=true&ack=true"; fi 380 | if [ "$KOMFEHLER" -gt "10" ]; then KOMFEHLER=10; fi #Anzahl beschränken 381 | fi 382 | 383 | 384 | 385 | #Debug eingeschaltet? 386 | if [ $debug == "true" ]; then debuging; fi 387 | 388 | 389 | 390 | #Mitternachtjobs 391 | if [ $(date +%H) -ge "23" ] && [ $(date +%M) -ge "58" ] && [ -z $MIDNIGHTRUN ]; then 392 | rain #Jahresregenmenge 393 | firmware_check #neue Firmware 394 | reset_zaehler #Sonnenscheindauer, Solarenergie zurücksetzen (enthällt auch Speicherung Werte VorJahr) 395 | minmaxavg365d #Min-/Max-/Avg-Aussentemperatur vor einem Jahr 396 | metsommer #meteorologischer Sommer Durchschnittstemperatur und Regenmenge 397 | MELDUNG "Mitternachtjobs durchgef%C3%BChrt" 398 | fi 399 | if [ $(date +%H) -eq "0" ] && [ $(date +%M) -le "3" ]; then 400 | unset MIDNIGHTRUN 401 | if [ $(date +%Z) == "CEST" ]; then ZULU=22; else ZULU=23; fi 402 | fi 403 | 404 | 405 | 406 | #15-Minutenjobs: Wetterprognose; min/max Aussentemperatur der letzten 24h + heute 407 | DO_IT=$(date +%M) 408 | DO_IT=${DO_IT#0} 409 | if [ $(( $DO_IT % 15 )) -eq "0" ]; then 410 | if [ $(date +%s) -ge "$TIMER_SET" ]; then wetterprognose 411 | if [ ! -z ${INFLUX_BUCKET} ]; then minmax24h; minmaxheute; fi 412 | fi 413 | do_Wetterwarnung 414 | #stündlich Lebenszeichen 415 | if [ "$(date +%H)" -ne "${ALIVE}" ]; then ALIVE=$(date +%H); MELDUNG "Skript l%C3%A4uft..."; fi 416 | fi 417 | 418 | 419 | 420 | #6-Minutenjobs: WOW, Windy 421 | if [ $(( $DO_IT % 6 )) -eq "0" ] && [ ${block_6minjobs} -le "0" ]; then 422 | 423 | #Windy 424 | if [ ${use_windy} == "true" ]; then windy_update; fi 425 | #WOW 426 | if [ ${use_wow} == "true" ]; then wow_update; fi 427 | 428 | #run_onlyonce 429 | block_6minjobs=3; 430 | 431 | else 432 | let block_6minjobs-- 433 | fi 434 | 435 | 436 | 437 | #5-Minutenjobs: wetter.com; Wolkenbasis 438 | if [[ $(( $DO_IT % 5 )) -eq "0" && -z ${run_5minjobs_onlyonce} ]]; then 439 | 440 | #wetter.com / Wolkenbasis 441 | if [ ! -z ${WETTERCOM_ID} ]; then wettercom_update; fi 442 | do_wolkenbasis 443 | 444 | #Windböe max. für Stationen die keinen Wert (#21) liefern 445 | if [ ! -z ${INFLUX_BUCKET} ] && [ -z ${MESSWERTE[21]} ]; then windboeemax; fi 446 | 447 | #run only once 448 | run_5minjobs_onlyonce=true 449 | 450 | else 451 | if [ ${run_5minjobs_onlyonce} ]; then unset run_5minjobs_onlyonce; fi 452 | fi 453 | 454 | 455 | 456 | #Hitzeindex 457 | if (( $(bc -l <<< "${MESSWERTE[1]} > 20") )); then 458 | HITZEINDEX=$(round $(hitzeindex ${MESSWERTE[1]} ${MESSWERTE[5]}) 2) 459 | else 460 | HITZEINDEX= 461 | fi 462 | 463 | 464 | #openSenseMap 465 | if [ ${openSenseMap} == "true" ]; then opensensemap; fi 466 | 467 | #Wunderground 468 | if [ ${WUNDERGROUND_UPDATE} == "true" ]; then wunderground_update; fi 469 | 470 | #AWEKAS 471 | if [ ${use_awekas} == "true" ]; then awekas_update; fi 472 | 473 | 474 | #Logging eingeschaltet? 475 | if [ $logging == "true" ]; then logging; fi 476 | 477 | 478 | done 479 | ###EoF 480 | 481 | -------------------------------------------------------------------------------- /ws_updater.beta: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | UPDATE_VER=V3.4.0 4 | 5 | ### Farbdefinition 6 | GR='\e[1;32m' 7 | GE='\e[1;33m' 8 | WE='\e[1;37m' 9 | BL='\e[1;36m' 10 | RE='\e[1;31m' 11 | 12 | 13 | echo -e "\n\n${BL}" 14 | echo -e ' 15 | _ _______ __ __ __ __ 16 | | | / / ___/ / / / /___ ____/ /___ _/ /____ _____ 17 | | | /| / /\__ \______/ / / / __ \/ __ / __ `/ __/ _ \/ ___/ 18 | | |/ |/ /___/ /_____/ /_/ / /_/ / /_/ / /_/ / /_/ __/ / 19 | |__/|__//____/ \____/ .___/\__,_/\__,_/\__/\___/_/' ${GE}${UPDATE_VER}${BL} 20 | echo -en ' /_/' 21 | echo -e "${WE}\n" 22 | 23 | 24 | #Nicht als root... 25 | if [ $(whoami) = "root" ]; then echo -e "$RE Ausführung als \"root\" nicht möglich...!\n"; exit 1; fi 26 | 27 | #Verzeichnis feststellen + conf lesen 28 | DIR=$(pwd) 29 | if [ -f "${DIR}/wetterstation.conf" ]; then . "${DIR}/wetterstation.conf"; fi 30 | 31 | 32 | #Test ob Datei auf GitHub, sonst Fallback 33 | if [ "$1" = "" ] && ( ! curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh|grep -xq '404: Not Found' ); then 34 | echo -e "$WE Benutze neuste Version ${BL}$(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh|grep -m 1 'UPDATE_VER='|cut -d"=" -f2)${WE} auf GitHub..." 35 | sleep 2 36 | source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --menu 37 | exit 0 38 | fi 39 | 40 | 41 | 42 | checker() { 43 | #Test ob bc, jq, unzip, patch und dc installiert sind / Service im User-Kontext läuft 44 | #installierte Influx-Version 45 | #Rest-Api im ioB läuft 46 | #Service im User-Kontext? 47 | if [ ! $(cat /etc/systemd/system/wetterstation.service|grep User=) ]; then 48 | echo -e "\n$GE Service läuft nicht im User-Kontext sondern unter User ${RE}root${GE}..." 49 | jn_abfrage "\n$WE Soll nun auf User (empfohlen) umgestellt werden?" 50 | if [ -z $antwort ]; then echo -e "\n"; return; fi 51 | echo -e "\n" 52 | sudo sed -i '/\[Service\]/a User='$(whoami)'\nGroup='$(whoami) /etc/systemd/system/wetterstation.service 53 | echo -e "\n Done... Restarte Service...\n" 54 | sudo systemctl daemon-reload 55 | sudo systemctl restart wetterstation 56 | fi 57 | if [ ! -z ${INFLUX_API} ]; then check_prog influx; fi 58 | check_prog bc 59 | check_prog jq 60 | check_prog dc 61 | check_prog unzip 62 | check_prog patch 63 | check_prog restapi 64 | echo -e "\n" 65 | } 66 | 67 | 68 | check_prog() { 69 | if [ $1 == "influx" ]; then 70 | if [ ! $(curl -skL -I "${INFLUX_WEB}://${INFLUX_API}/ping" | grep X-Influxdb-Version | cut -d" " -f2 | grep v2.[0-9].[0-9]) ]; then echo -e "${RE} Offizieller Support nur noch für Influx V2.x!\n\n${WE}"; sleep 5; fi 71 | return 72 | fi 73 | if [ $1 == "restapi" ]; then 74 | if [ "$(nc -vz $(echo "${RESTAPI_URL}" | grep -o '[\.0-9]*') &> /dev/null; echo $?)" -eq "0" ]; then RESTAPI=true 75 | echo -e "\n Zugriff auf $GR'Rest-API'$WE im ioBroker: [$GR✓$WE]" 76 | else 77 | RESTAPI=false 78 | echo -e "\n Zugriff auf $GR'Rest-API'$WE im ioBroker: [$RE✗$WE]" 79 | echo -e " (Dies ist kein Problem, es können nur keine neuen Datenpunkte bei Bedarf automatisch angelegt werden." 80 | echo -e " Dies muss im Fall neuer Datenpunkte per 'wetterstation.js' von Hand im ioBroker erfolgen.)" 81 | fi 82 | return 83 | fi 84 | if [ $(which $1) ]; then 85 | echo -e " $GR'$1'$WE installiert: [$GR✓$WE]" 86 | else 87 | echo -e " $GR'$1'$WE installiert: [$RE✗$WE]" 88 | echo -e "\n\n $RE Bitte zuerst '$1' installieren [sudo apt install $1]\n" 89 | exit 1 90 | fi 91 | } 92 | 93 | backup() { 94 | echo -e "\n Lege Sicherungskopie der wetterstation.conf an..." 95 | cp ./wetterstation.conf ./wetterstation.conf.backup 96 | } 97 | 98 | FEHLER() { 99 | if [ "$UPDATE_VER" == "$VERSION" ]; then echo -e "\n$WE Version ist aktuell, nothing to do...\n"; exit 0; fi 100 | echo -e "\n Updater ist ${RE}nur${WE} für Versionen ab V1.4.0 !\n" 101 | exit 1 102 | } 103 | 104 | patcher() { 105 | echo -en "\n${WE} Soll die ${RE}wetterstation.conf ${WE}nun auf die neue Version ${GE}${UPDATE_VER}${WE} gepatcht werden? [${GR}J/N${WE}]" 106 | read -n 1 -p ": " JN 107 | if [ "$JN" = "J" ] || [ "$JN" = "j" ]; then 108 | echo -e "\n\n\n" 109 | else 110 | echo -e "\n\n\n" 111 | echo -e " $RE Abbruch... ${WE}\n\n\n"; exit 1; 112 | fi 113 | 114 | VERSION_SH=$(cat ./wetterstation.sh|grep "SH_VER"|cut -d"=" -f2|tr -d \") 115 | 116 | while [ "$VERSION_CONF" != "$VERSION_SH" ] 117 | do 118 | VERSION_CONF=$(cat ./wetterstation.conf|grep "### Settings V"|cut -d" " -f3) 119 | 120 | case ${VERSION_CONF} in 121 | V1.4.0) PATCH140 ;; 122 | V1.5.0) PATCH150 ;; 123 | V1.6.0) PATCH160 ;; 124 | V2.0.0) PATCH210 ;; 125 | V2.1.0) PATCH220 ;; 126 | V2.2.0) PATCH230 ;; 127 | V2.3.0) PATCH240 ;; 128 | V2.4.0) PATCH250 ;; 129 | V2.5.0) PATCH260 ;; 130 | V2.6.0) PATCH270 ;; 131 | V2.7.0) PATCH280 ;; 132 | V2.8.0) PATCH2100 ;; 133 | V2.9.0) echo -e "$GE Kein Patch nötig...\n" ;; 134 | V2.10.0) PATCH2110 ;; 135 | V2.11.0) PATCH2111 ;; 136 | V2.11.1) PATCH2120 ;; 137 | V2.12.0) PATCH2121 ;; 138 | V2.12.1) PATCH2130 ;; 139 | V2.13.0) PATCH2140 ;; 140 | V2.14.0) PATCH2150 ;; 141 | V2.15.0) PATCH2160 ;; 142 | V2.16.0) PATCH2170 ;; 143 | V2.17.0) PATCH2180 ;; 144 | V2.18.0) PATCH2190 ;; 145 | V2.19.0) PATCH2200 ;; 146 | V2.20.0) PATCH2210 ;; 147 | V2.21.0) PATCH2220 ;; 148 | V2.22.0) PATCH3000 ;; 149 | V3.0.0) PATCH3010 ;; 150 | V3.1.0) PATCH3011 ;; 151 | V3.1.1) PATCH3020 ;; 152 | V3.2.0) PATCH3030 ;; 153 | V3.3.0) PATCH3040 && service_restart && exit 0;; 154 | V3.4.0) echo -e "$GE Version ist bereits aktuell...\n" && exit 0;; 155 | *) FEHLER 156 | esac 157 | 158 | done 159 | exit 0 160 | } 161 | 162 | main() { 163 | #Wetterstation im Verzeichnis vorhanden 164 | if [ ! -f ./wetterstation.sh ]; then 165 | echo -e "\n$RE Keine Version von WLAN-Wetterstation im aktuellen Verzeichnis gefunden...\n" 166 | exit 1 167 | fi 168 | 169 | #aktuelle Version von GitHub holen 170 | GitHub=$(curl -sH "Accept: application/vnd.github.v3+json" https://api.github.com/repos/SBorg2014/WLAN-Wetterstation/releases/latest) 171 | akt_ver_long=$(echo ${GitHub} | jq -r '.name' | sed -e 's/-/vom/; s/\"//g') 172 | akt_version=$(echo ${GitHub} | jq -r '.tag_name') 173 | info_version=$(echo ${GitHub} | jq -r '.body' | tr -d '*\\') 174 | 175 | echo -e " Aktuelle Version (latest) auf GitHub: ${GR}$akt_ver_long$WE" 176 | VERSION=$(cat ./wetterstation.sh|grep "SH_VER"|cut -d"=" -f2|tr -d \") 177 | echo -e " Version im aktuellen Verzeichnis : ${GR}$VERSION" 178 | 179 | if [ "$VERSION" == "$akt_version" ]; then echo -e "\n$GE Version ist bereits aktuell...\n"; exit 0; fi 180 | 181 | echo -e "\n$WE Informationen zum Release $akt_version:" 182 | echo -e " ─────────────────────────────────────────────────────────────" 183 | echo -e "\n$GE $info_version\n$WE" 184 | 185 | jn_abfrage "\n$WE Soll ein Update von WLAN-Wetterstation durchgeführt werden?" 186 | if [ -z $antwort ]; then echo -e "\n"; exit 0; fi 187 | 188 | #Update 189 | echo -e "\n\n$WE Führe Update aus...\n" 190 | DL_URL=$(echo ${GitHub} | jq -r '.assets | .[].browser_download_url') 191 | curl -LJ ${DL_URL} -o tmp.zip 192 | unzip -o tmp.zip -x wetterstation.conf 193 | sudo chmod +x wetterstation.sh ws_updater.sh 194 | 195 | rm tmp.zip 196 | source ./ws_updater.sh --patch 197 | } 198 | 199 | service_restart() { 200 | jn_abfrage "\n ${WE}Update ausgeführt. Soll der Service nun neu gestartet werden?" 201 | if [ ! -z $antwort ]; then echo -e "\n"; sudo systemctl restart wetterstation.service; fi 202 | } 203 | 204 | ######################################################################################## 205 | #Patch Version V1.4.0 auf V1.5.0 206 | PATCH140() { 207 | backup 208 | echo -e "\n Patche wetterstation.conf auf V1.5.0 ..." 209 | sed -i '/^.#Port der Wetterstation/i \ #Protokoll (HTTP oder HTTPS) \/ default: HTTP\n WEB=HTTP\n\n #User-Authentifizierung falls benutzt; sonst leer lassen\n AUTH_USER=\n AUTH_PASS=\n' ./wetterstation.conf 210 | sed -i 's/### Settings V1.4.0/### Settings V1.5.0/' ./wetterstation.conf 211 | echo -e " Fertig...\n" 212 | } 213 | 214 | 215 | #Patch Version V1.5.0 auf V1.6.0 216 | PATCH150() { 217 | backup 218 | echo -e "\n Patche wetterstation.conf auf V1.6.0 ..." 219 | sed -i 's/### Settings V1.5.0/### Settings V1.6.0/' ./wetterstation.conf 220 | echo -e " Fertig...\n" 221 | } 222 | 223 | 224 | #Patch Version V1.6.0 auf V2.0.0 225 | PATCH160() { 226 | backup 227 | echo -e "\n Patche wetterstation.conf auf V2.0.0 ..." 228 | sed -i '/^.#Protokoll (HTTP oder HTTPS)/i \ #Protokoll der Wetterstation [1/2] \/ 1=Wunderground ; 2=Ecowitt \/ default: 1\n WS_PROTOKOLL=1\n\n #Anzahl der vorhandenen DP50 Sensoren \/ default: 0\n ANZAHL_DP50=0\n\n #HTTP Anzahl der vorhandenen DP100 Sensoren \/ default: 0\n ANZAHL_DP100=0\n' ./wetterstation.conf 229 | sed -i 's/### Settings V1.6.0/### Settings V2.0.0/' ./wetterstation.conf 230 | echo -e " Fertig...\n" 231 | } 232 | 233 | 234 | #Patch Version V2.0.0 auf V2.1.0 235 | PATCH210() { 236 | backup 237 | echo -e "\n Patche wetterstation.conf auf V2.1.0 ..." 238 | sed -i 's/#Protokoll der Wetterstation \[1\/2\] \/ 1=Wunderground ; 2=Ecowitt \/ default: 1/#Protokoll der Wetterstation \[1\/2\/9\] \/ 1=Wunderground ; 2=Ecowitt ; 9=Sainlogic Profi \/ default: 1/' ./wetterstation.conf 239 | sed -i 's/### Settings V2.0.0/### Settings V2.1.0/' ./wetterstation.conf 240 | echo -e " Fertig...\n" 241 | } 242 | 243 | 244 | #Patch Version V2.1.0 auf V2.2.0 245 | PATCH220() { 246 | backup 247 | echo -e "\n Patche wetterstation.conf auf V2.2.0 ..." 248 | sed -i 's/Chillfaktor/gefühlte Temperatur/' ./wetterstation.conf 249 | sed -i 's/### Settings V2.1.0/### Settings V2.2.0/' ./wetterstation.conf 250 | echo -e " Fertig...\n" 251 | } 252 | 253 | 254 | #Patch Version V2.2.0 auf V2.3.0 255 | PATCH230() { 256 | backup 257 | echo -e "\n Patche wetterstation.conf auf V2.3.0 ..." 258 | sed -i '/#Anzahl der vorhandenen DP50/,/ANZAHL_DP100=/c\ #Anzahl der vorhandenen Zusatzsensoren \/ default: 0\n ANZAHL_DP50=0\n ANZAHL_DP60=0\n ANZAHL_DP100=0' ./wetterstation.conf 259 | sed -i '/^.#letztes Regenereignis/i \ #InfluxDB-Konfiguration \/ ohne InfluxDB alles leer lassen\n #IP und Port der API [xxx.xxx.xxx.xxx:xxxxx]\n INFLUX_API=\n #Name, User und Passwort der InfluxDB-Datenbank\n INFLUX_DB=\n INFLUX_USER=\n INFLUX_PASSWORD=\n' ./wetterstation.conf 260 | sed -i 's/### Settings V2.2.0/### Settings V2.3.0/' ./wetterstation.conf 261 | echo -e " Fertig...\n" 262 | echo -e " ${GE}Eventuelle Zusatzsensoren DP50/60/100 müssen neu eingetragen werden!" 263 | echo -e " Neuen Configblock für Influx beachten/konfigurieren!\n" 264 | } 265 | 266 | 267 | #Patch Version V2.3.0 auf V2.4.0 268 | PATCH240() { 269 | backup 270 | echo -e "\n Patche wetterstation.conf auf V2.4.0 ..." 271 | sed -i '/^.*ANZAHL_DP100=.*/a \ ANZAHL_DP200=0' ./wetterstation.conf 272 | sed -i 's/### Settings V2.3.0/### Settings V2.4.0/' ./wetterstation.conf 273 | echo -e " Fertig...\n" 274 | echo -e " ${GE}Eventuelle Zusatzsensoren DP200 müssen eingetragen werden!\n" 275 | } 276 | 277 | 278 | #Patch Version V2.4.0 auf V2.5.0 279 | PATCH250() { 280 | backup 281 | echo -e "\n Patche wetterstation.conf auf V2.5.0 ..." 282 | sed -i '/^.*ANZAHL_DP100=.*/i \ ANZAHL_DP70=0' ./wetterstation.conf 283 | sed -i 's/### Settings V2.4.0/### Settings V2.5.0/' ./wetterstation.conf 284 | echo -e " Fertig...\n" 285 | echo -e " ${GE}Eventuelle Zusatzsensoren DP70 müssen eingetragen werden!\n" 286 | } 287 | 288 | 289 | #Patch Version V2.5.0 auf V2.6.0 290 | PATCH260() { 291 | backup 292 | echo -e "\n Patche wetterstation.conf auf V2.6.0 ..." 293 | patch_260 && patch ./wetterstation.conf < patch 294 | rm patch 295 | echo -e " ${GE}Windy kann nun mittels \033[30m\033[47m./wetterstation.sh --windy_reg\033[0m ${GE}eingerichtet werden !\n" 296 | } 297 | 298 | 299 | #Patch Version V2.6.0 auf V2.7.0 300 | PATCH270() { 301 | backup 302 | echo -e "\n Patche wetterstation.conf auf V2.7.0 ..." 303 | sed -i '/^.*ANZAHL_DP200=.*/a \ ANZAHL_DP250=0' ./wetterstation.conf 304 | sed -i 's/### Settings V2.6.0/### Settings V2.7.0/' ./wetterstation.conf 305 | echo -e " Fertig...\n" 306 | echo -e " ${GE}Eventueller Zusatzsensor DP250/WH45 muss eingetragen werden!\n" 307 | } 308 | 309 | 310 | #Patch Version V2.7.0 auf V2.8.0 311 | PATCH280() { 312 | backup 313 | echo -e "\n Patche wetterstation.conf auf V2.8.0 ..." 314 | sed -i '/^.*SONNENSCHEIN_TXTFORMAT=.*/a \ \n\n #Daten an Wetter.com senden (leer lassen falls nicht gewünscht)?\n WETTERCOM_ID=\n WETTERCOM_PW=' ./wetterstation.conf 315 | sed -i 's/### Settings V2.7.0/### Settings V2.8.0/' ./wetterstation.conf 316 | echo -e " Fertig...\n" 317 | echo -e " ${GE}Falls die Übertragung der Wetterdaten an wetter.com erfolgen soll, nun aktivieren durch eintragen von User-ID und Passwort!\n" 318 | } 319 | 320 | 321 | #Patch Version V2.8.0 auf V2.10.0 322 | PATCH2100() { 323 | backup 324 | echo -e "\n Patche wetterstation.conf auf V2.10.0 ..." 325 | patch_2100 && patch ./wetterstation.conf < patch.dat 326 | rm patch.dat 327 | echo -e " Fertig...\n" 328 | echo -e " ${GE}Eventuelle Zusatzsensoren DP300/WS68, DP40/WH32 oder WH25/WH31 müssen eingetragen werden!\n" 329 | } 330 | 331 | 332 | #Patch Version V2.10.0 auf V2.11.0 333 | PATCH2110() { 334 | backup 335 | echo -e "\n Patche wetterstation.conf auf V2.11.0 ..." 336 | sed -i 's/### Settings V2.10.0/### Settings V2.11.0/' ./wetterstation.conf 337 | sed -i '/^.*debug=.*/a \ \n #Verhalten bei Kommunikationsfehler [true/false] / default: false / Soll der Datenpunkt automatisch resettet werden?\n RESET_KOMFEHLER=false' ./wetterstation.conf 338 | echo -e " Fertig...\n" 339 | echo -e " ${GE}Parameter für Kommunikationsfehler ggf. ändern. Per Default verbleibt er im Zustand 'true' bei einem Fehler.\n" 340 | } 341 | 342 | 343 | #Patch Version V2.11.0 auf V2.11.1 344 | PATCH2111() { 345 | backup 346 | echo -e "\n Patche wetterstation.conf auf V2.11.1 ..." 347 | sed -i 's/### Settings V2.11.0/### Settings V2.11.1/' ./wetterstation.conf 348 | sed -i 's/Sainlogic Profi/DNS/' ./wetterstation.conf 349 | echo -e " Fertig...\n" 350 | } 351 | 352 | 353 | #Patch Version V2.11.1 auf V2.12.0 354 | PATCH2120() { 355 | backup 356 | echo -e "\n Patche wetterstation.conf auf V2.12.0 ..." 357 | sed -i 's/### Settings V2.11.1/### Settings V2.12.0/' ./wetterstation.conf 358 | sed -i '/^.*WETTERCOM_PW=.*/a \ \n #Fix aktivieren bei fehlerhafter Außentemperatur [true/false] / default: false\n #Bei unplausiblem Messwert wird kein Datenpaket an den ioB geschickt\n FIX_AUSSENTEMP=false' ./wetterstation.conf 359 | echo -e " Fertig...\n" 360 | echo -e " ${GE}Parameter für FIX_AUSSENTEMP ggf. ändern. Per Default werden auch unplausible Messwerte an den ioB geschickt.\n" 361 | } 362 | 363 | 364 | #Patch Version V2.12.0 auf V2.12.1 365 | PATCH2121() { 366 | backup 367 | echo -e "${WE}\n Patche wetterstation.conf auf V2.12.1 ..." 368 | sed -i 's/### Settings V2.12.0/### Settings V2.12.1/' ./wetterstation.conf 369 | echo -e "${WE} Fertig...\n" 370 | } 371 | 372 | 373 | #Patch Version V2.12.1 auf V2.13.0 374 | PATCH2130() { 375 | backup 376 | echo -e "${WE}\n Patche wetterstation.conf auf V2.13.0 ..." 377 | sed -i 's/### Settings V2.12.1/### Settings V2.13.0/' ./wetterstation.conf 378 | sed -i '/^.*ANZAHL_WH31=.*/a \ ANZAHL_DP35=0' ./wetterstation.conf 379 | echo -e "${WE} Fertig...\n" 380 | echo -e " ${GE}Eventuelle Zusatzsensoren DP35 müssen eingetragen werden!\n" 381 | } 382 | 383 | 384 | #Patch Version V2.13.0 auf V2.14.0 385 | PATCH2140() { 386 | backup 387 | echo -e "${WE}\n Patche wetterstation.conf auf V2.14.0 ..." 388 | sed -i 's/### Settings V2.13.0/### Settings V2.14.0/' ./wetterstation.conf 389 | sed -i '/^.*WEB=HTTP.*/a \\n #Ignoriere Zertifikatsfehler bei der Simple-Restful-API [true/false] / default: false / nötig bei eigenen Zertifikaten\n WEB_IGN_SSL_ERROR=false' ./wetterstation.conf 390 | echo -e "${WE} Fertig...\n" 391 | } 392 | 393 | 394 | #Patch Version V2.14.0 auf V2.15.0 395 | PATCH2150() { 396 | backup 397 | echo -e "${WE}\n Patche wetterstation.conf auf V2.15.0 ..." 398 | sed -i 's/### Settings V2.14.0/### Settings V2.15.0/' ./wetterstation.conf 399 | sed -i '/^.*WETTERCOM_PW=.*/a \\n\n #Daten an Wunderground.com senden? [true/false] / default: false\n #Nur nötig und sinnvoll bei WS_PROTOKOLL=9 (DNS) wenn trotzdem auch Daten weiterhin an Wunderground.com gesendet werden sollen.\n WUNDERGROUND_UPDATE=false' ./wetterstation.conf 400 | sed -i 's/#InfluxDB-Konfiguration/#InfluxDB-Konfiguration für Influx V1.x.x/' ./wetterstation.conf 401 | echo -e "${WE} Fertig...\n" 402 | echo -e " ${GE}Die Datenübertragung an Wunderground.com kann nun aktiviert werden!\n" 403 | } 404 | 405 | 406 | #Patch Version V2.15.0 auf V2.16.0 407 | PATCH2160() { 408 | backup 409 | echo -e "${WE}\n Patche wetterstation.conf auf V2.16.0 ..." 410 | sed -i 's/### Settings V2.15.0/### Settings V2.16.0/' ./wetterstation.conf 411 | sed -i '/^.*IPP=.*/a \\n #Protokoll, ioBroker-IP und Port der Rest-API [http(s)://xxx.xxx.xxx.xxx:xxxxx] / leer lassen falls nicht benutzt\n RESTAPI_URL=\n RESTAPI_USER=\n RESTAPI_PW=' ./wetterstation.conf 412 | echo -e "${WE} Fertig...\n" 413 | echo -e " ${GE}Die Rest-API kann nun durch Eingabe der URL und den Zugangsdaten aktiviert werden!\n" 414 | } 415 | 416 | 417 | #Patch Version V2.16.0 auf V2.17.0 418 | PATCH2170() { 419 | backup 420 | echo -e "${WE}\n Patche wetterstation.conf auf V2.17.0 ..." 421 | sed -i 's/### Settings V2.16.0/### Settings V2.17.0/' ./wetterstation.conf 422 | sed -i '/^.*WUNDERGROUND_UPDATE=.*/a \\n #Windrichtung und -geschwindigkeit der letzten 10 Minuten anstelle aktueller Werte an\n #windy/OpenSenseMap/wetter.com übertragen? [true/false] / default: false\n USE_AVG_WIND=false' ./wetterstation.conf 423 | if [ ${RESTAPI} == "true" ]; then make_objects ".Aussentemperatur_Trend" "Trend der Aussentemperatur der letzten Stunde" "number" "°C"; fi 424 | echo -e "${WE} Fertig...\n" 425 | echo -e " ${GE}Die alternative Datenübertragung von Windrichtung und -geschwindigkeit der letzten\n 10 Minuten an windy/OpenSenseMap/wetter.com kann nun aktiviert werden!" 426 | echo -e " Einstellung dafür in der wetterstation.conf: ${BL}USE_AVG_WIND=true\n${WE}" 427 | } 428 | 429 | 430 | #Patch Version V2.17.0 auf V2.18.0 431 | PATCH2180() { 432 | backup 433 | echo -e "${WE}\n Patche wetterstation.conf auf V2.18.0 ..." 434 | sed -i 's/### Settings V2.17.0/### Settings V2.18.0/' ./wetterstation.conf 435 | sed -i '/^.*ANZAHL_DP35=.*/i \ ANZAHL_DP10=0' ./wetterstation.conf 436 | if [ ${RESTAPI} == "true" ]; then 437 | make_objects ".Info.Wolkenbasis" "Höhe der Wolkenbasis" "number" "m" 438 | make_objects ".Info.Shellscriptversion" "Versionsnummer des Scriptes" "string" 439 | make_objects ".Windrichtung_Text_10min" "Windrichtung Durchschnitt 10 Minuten als Text" "string" 440 | fi 441 | echo -e "${WE} Fertig...\n" 442 | echo -e " ${GE}Eventuelle Zusatzsensoren DP10/WN35 können nun eingetragen werden!\n${WE}" 443 | } 444 | 445 | 446 | #Patch Version V2.18.0 auf V2.19.0 447 | PATCH2190() { 448 | backup 449 | echo -e "${WE}\n Patche wetterstation.conf auf V2.19.0 ..." 450 | sed -i 's/### Settings V2.18.0/### Settings V2.19.0/' ./wetterstation.conf 451 | sed -i '/^.*ANZAHL_WH31=.*/a \ ANZAHL_WS90=0' ./wetterstation.conf 452 | if [ ${RESTAPI} == "true" ]; then make_objects ".Info.Wetterwarnung" "mögliche Wetterereignisse" "string" 453 | # #Abfrage starten zum Anlegen der DPs des WS90 454 | # jn_abfrage "${WE} Sollen nun Datenpunkte für den WS90 angelegt werden...(nur sinnvoll wenn man auch einen hat ;-))?" 455 | # if [ ! -z $antwort ]; then 456 | # make_objects ".WS90" "WS90 Wittboy" "folder" 457 | # make_objects ".WS90.1.aktuelle_Regenrate" "WS90 Kanal 1 aktuelle Regenrate" "number" "mm/h" 458 | # fi 459 | fi 460 | echo -e "\n${WE} Fertig...\n" 461 | echo -e " ${GE}Eventueller Zusatzsensor WS90 kann nun eingetragen werden!${WE}" 462 | # if [ ${RESTAPI} != "true" ] || [ -z $antwort ]; then echo -e " ${GE}Dazu noch 'wetterstation.js' im ioB ersetzen, konfigurieren und einmalig ausführen.\n${WE}"; fi 463 | echo -e " ${GE}Dazu noch 'wetterstation.js' im ioB ersetzen, konfigurieren und einmalig ausführen.\n${WE}" 464 | } 465 | 466 | 467 | #Patch Version V2.19.0 auf V2.20.0 468 | PATCH2200(){ 469 | backup 470 | echo -e "${WE}\n Patche wetterstation.conf auf V2.20.0 ..." 471 | sed -i 's/### Settings V2.19.0/### Settings V2.20.0/' ./wetterstation.conf 472 | echo -e "\n${WE} Fertig...\n" 473 | } 474 | 475 | 476 | #Patch Version V2.20.0 auf V2.21.0 477 | PATCH2210(){ 478 | backup 479 | echo -e "${WE}\n Patche wetterstation.conf auf V2.21.0 ..." 480 | sed -i 's/### Settings V2.20.0/### Settings V2.21.0/' ./wetterstation.conf 481 | sed -i '/^.*Ende Usereinstellungen.*/i \\n #############################################################################################\n ### AWEKAS - Einstellungen (nur nötig falls AWEKAS benutzt werden soll) ###\n #############################################################################################' ./wetterstation.conf 482 | sed -i '/^.*Ende Usereinstellungen.*/i \\n #AWEKAS aktivieren [true/false] / default: false\n use_awekas=false\n\ 483 | #AWEKAS Login Username und Passwort\n AWEKAS_USER=\n AWEKAS_PW=\n\ 484 | #############################################################################################\ 485 | ### AWEKAS - Ende der Einstellungen ###################################################\ 486 | #############################################################################################\n' ./wetterstation.conf 487 | if [ ${RESTAPI} == "true" ]; then 488 | make_objects ".Info.Awekas_at" "Datenübertragung an AWEKAS.at erfolgreich" "boolean" 489 | fi 490 | echo -e "\n${WE} Fertig...\n" 491 | echo -e " ${GE}Die Datenübertragung kann nun (optional) in der wetterstaion.conf nach Eintragung der Zugangsdaten aktiviert werden.${WE}" 492 | } 493 | 494 | 495 | #Patch Version V2.21.0 auf V2.22.0 496 | PATCH2220(){ 497 | backup 498 | echo -e "${WE}\n Patche wetterstation.conf auf V2.22.0 ..." 499 | sed -i 's/### Settings V2.21.0/### Settings V2.22.0/' ./wetterstation.conf 500 | sed -i 's/Anzahl der vorhandenen Zusatzsensoren/Anzahl der vorhandenen Zusatzsensoren Froggit, Ecowitt und Bresser/' ./wetterstation.conf 501 | sed -i '/^.*ANZAHL_DP300=.*/a \ ANZAHL_7009999=0' ./wetterstation.conf 502 | echo -e "\n${WE} Fertig...\n" 503 | echo -e " ${GE}Eventuelle Zusatzsensoren Bresser #7009999 können nun eingetragen werden!${WE}" 504 | echo -e " ${GE}Dazu noch 'wetterstation.js' im ioB ersetzen, konfigurieren und einmalig ausführen.\n${WE}" 505 | } 506 | 507 | 508 | #Patch Version V2.22.0 auf V3.0.0 509 | PATCH3000(){ 510 | echo -e "${RE}"' 511 | ___ __ __ __ 512 | / | _____/ /_ / /___ ______ ____ _ / / 513 | / /| |/ ___/ __ \/ __/ / / / __ \/ __ `/ / / 514 | / ___ / /__/ / / / /_/ /_/ / / / / /_/ / /_/ 515 | /_/ |_\___/_/ /_/\__/\__,_/_/ /_/\__, / (_) 516 | /____/'"${WE}" 517 | 518 | echo -e "\n${GE} ┌──────────────────────────────────────────────────────┐" 519 | echo -e " │ V3.0.0 ist ein Breaking-Release! │" 520 | echo -e " │ Es wird zwingend bei der Nutzung der Influx-Features │" 521 | echo -e " │ InfluxDB mindestens in der Version 2.x oder höher │" 522 | echo -e " │ benötigt ! │" 523 | echo -e " └──────────────────────────────────────────────────────┘${WE}\n" 524 | 525 | jn_abfrage "${WE}\n Möchten Sie ${BL}WLAN-Wetterstation${WE} auf Version V3.0.0 updaten?" 526 | if [ -z $antwort ]; then echo -e "\n ${RE}Abbruch...${WE}\n\n"; exit 1; fi 527 | unset antwort 528 | 529 | backup 530 | echo -e "${WE}\n Patche wetterstation.conf auf V3.0.0 ..." 531 | sed -i 's/### Settings V2.22.0/### Settings V3.0.0/' ./wetterstation.conf 532 | sed -i 's/#Name, User und Passwort der InfluxDB-Datenbank/#Bucket, Token und Organisation der InfluxDB/' ./wetterstation.conf 533 | sed -i 's/INFLUX_DB=/INFLUX_BUCKET=/' ./wetterstation.conf 534 | sed -i 's/INFLUX_USER=.*/INFLUX_TOKEN=/' ./wetterstation.conf 535 | sed -i 's/INFLUX_PASSWORD=.*/INFLUX_ORG=/' ./wetterstation.conf 536 | sed -i '/^.*#InfluxDB-Konfiguration \/ ohne InfluxDB alles leer lassen.*/a \ #Protokoll (HTTP oder HTTPS) / default: HTTP\n INFLUX_WEB=HTTP' ./wetterstation.conf 537 | echo -e "\n${WE} Fertig...\n" 538 | echo -e " ${GE}InfluxDB in Version 2.x kann nun in der Konfiguration aktiviert werden.\n${WE}" 539 | } 540 | 541 | 542 | #Patch Version V3.0.0 auf V3.1.0 543 | PATCH3010(){ 544 | backup 545 | echo -e "${WE}\n Patche wetterstation.conf auf V3.1.0 ..." 546 | sed -i 's/### Settings V3.0.0/### Settings V3.1.0/' ./wetterstation.conf 547 | echo -e "\n${WE} Fertig...\n" 548 | } 549 | 550 | 551 | #Patch Version V3.1.0 auf V3.1.1 552 | PATCH3011(){ 553 | backup 554 | echo -e "${WE}\n Patche wetterstation.conf auf V3.1.1 ..." 555 | sed -i 's/### Settings V3.1.0/### Settings V3.1.1/' ./wetterstation.conf 556 | echo -e "\n${WE} Fertig...\n" 557 | } 558 | 559 | 560 | patch_260() { 561 | cat <patch 562 | --- wetterstation.conf_250 2021-05-13 13:45:06.297750501 +0200 563 | +++ wetterstation.conf 2021-05-12 18:39:24.358821394 +0200 564 | @@ -1,4 +1,4 @@ 565 | -### Settings V2.5.0 ----------------------------------------------------------- 566 | +### Settings V2.6.0 ----------------------------------------------------------- 567 | #Debuging einschalten [true/false] / default: false / Ausgabe der Messwerte 568 | debug=false 569 | 570 | @@ -112,5 +112,42 @@ 571 | ############################################################################################# 572 | 573 | 574 | + 575 | + ############################################################################################# 576 | + ### Windy - Einstellungen (nur nötig falls Windy benutzt werden soll) ### 577 | + ############################################################################################# 578 | + 579 | + #Windy aktivieren [true/false] / default: false 580 | + use_windy=false 581 | + 582 | + #Windy API-Key 583 | + windy_APIKey= 584 | + 585 | + #Station [number: 0 - 2147483647] / default: 0 586 | + windy_Station= 587 | + 588 | + #Name der Station [Text] 589 | + windy_Name= 590 | + 591 | + #Latitude/Breitengrad der Station 592 | + windy_Latitude= 593 | + 594 | + #Longitude/Längengrad der Station 595 | + windy_Longitude= 596 | + 597 | + #Elevation/Höhe ÜNN 598 | + windy_Elevation= 599 | + 600 | + #Montagehöhe Temperatursensor über Boden 601 | + windy_Tempheight= 602 | + 603 | + #Montagehöhe Windsensor über Boden 604 | + windy_Windheight= 605 | + 606 | + ############################################################################################# 607 | + ### Windy - Ende der Einstellungen #################################################### 608 | + ############################################################################################# 609 | + 610 | + 611 | ### Ende Usereinstellungen 612 | ###EoF 613 | EoD 614 | } 615 | 616 | patch_2100() { 617 | cat <patch.dat 618 | --- wetterstation.org 2021-10-26 20:01:56.772982845 +0200 619 | +++ wetterstation.conf 2021-10-26 20:04:21.625615091 +0200 620 | @@ -1,7 +1,10 @@ 621 | -### Settings V2.8.0 ----------------------------------------------------------- 622 | +### Settings V2.10.0 ----------------------------------------------------------- 623 | #Debuging einschalten [true/false] / default: false / Ausgabe der Messwerte 624 | debug=false 625 | 626 | + #Logging einschalten [true/false] / default: false / schreibt die Datenstrings der Station in eine Datei 627 | + logging=false 628 | + 629 | #ioBroker-IP und Port der Simple-Restful-API [xxx.xxx.xxx.xxx:xxxxx] 630 | IPP=192.168.1.3:8087 631 | 632 | @@ -9,12 +12,15 @@ 633 | WS_PROTOKOLL=1 634 | 635 | #Anzahl der vorhandenen Zusatzsensoren / default: 0 636 | + ANZAHL_WH31=0 637 | + ANZAHL_DP40=0 638 | ANZAHL_DP50=0 639 | ANZAHL_DP60=0 640 | ANZAHL_DP70=0 641 | ANZAHL_DP100=0 642 | ANZAHL_DP200=0 643 | ANZAHL_DP250=0 644 | + ANZAHL_DP300=0 645 | 646 | #Protokoll (HTTP oder HTTPS) / default: HTTP 647 | WEB=HTTP 648 | EofP 649 | } 650 | 651 | 652 | #Patch Version V3.1.1 auf V3.2.0 653 | PATCH3020(){ 654 | backup 655 | echo -e "${WE}\n Patche wetterstation.conf auf V3.2.0 ..." 656 | sed -i 's/### Settings V3.1.1/### Settings V3.2.0/' ./wetterstation.conf 657 | sed -i '/^.*Ende Usereinstellungen.*/i \\n\n #############################################################################################\n ### WOW - Einstellungen (nur nötig falls WOW benutzt werden soll) ###\n #############################################################################################' ./wetterstation.conf 658 | sed -i '/^.*Ende Usereinstellungen.*/i \\n #WOW aktivieren [true/false] / default: false\n use_wow=false\n\ 659 | #WOW Site ID und Authentication Key\n WOW_SITEID=\n WOW_AUTHKEY=\n\ 660 | #############################################################################################\ 661 | ### WOW - Ende der Einstellungen ######################################################\ 662 | #############################################################################################\n' ./wetterstation.conf 663 | if [ ${RESTAPI} == "true" ]; then 664 | make_objects ".Info.WOW" "Datenübertragung WOW erfolgreich" "boolean" 665 | fi 666 | echo -e "\n${WE} Fertig...\n" 667 | echo -e " ${GE}Die Datenübertragung kann nun (optional) in der wetterstaion.conf nach Eintragung der Zugangsdaten und Aktivierung erfolgen.${WE}" 668 | } 669 | 670 | 671 | #Patch Version V3.2.0 auf V3.3.0 672 | PATCH3030(){ 673 | backup 674 | echo -e "${WE}\n Patche wetterstation.conf auf V3.3.0 ..." 675 | sed -i 's/### Settings V3.2.0/### Settings V3.3.0/' ./wetterstation.conf 676 | echo -e "\n${WE} Fertig...\n" 677 | } 678 | 679 | 680 | #Patch Version V3.3.0 auf V3.4.0 681 | PATCH3040(){ 682 | backup 683 | echo -e "${WE}\n Patche wetterstation.conf auf V3.4.0 ..." 684 | sed -i 's/### Settings V3.3.0/### Settings V3.4.0/' ./wetterstation.conf 685 | echo -e "\n${WE} Fertig...\n" 686 | } 687 | 688 | 689 | jn_abfrage() { 690 | echo -en "\n$1 ${WE}[${GR}J/N${WE}]" 691 | read -n 1 -p ": " JN 692 | if [ "$JN" = "J" ] || [ "$JN" = "j" ]; then 693 | antwort=true 694 | else 695 | unset antwort 696 | fi 697 | 698 | } 699 | 700 | install() { 701 | #WLAN-Wetterstation Installationsroutine 702 | jn_abfrage "${WE}\n Möchten Sie ${BL}WLAN-Wetterstation${WE} im aktuellen Verzeichnis installieren?" 703 | if [ -z $antwort ]; then echo -e "\n ${RE}Abbruch...${WE}\n\n"; exit 1; fi 704 | unset antwort 705 | 706 | #aktuelle Version feststellen, downloaden und entpacken 707 | echo -e "\n\n\n Hole Daten von GitHub..." 708 | GitHub=$(curl -sH "Accept: application/vnd.github.v3+json" https://api.github.com/repos/SBorg2014/WLAN-Wetterstation/releases/latest) 709 | akt_version=$(echo ${GitHub} | jq -r '.name' | sed -e 's/-/vom/; s/\"//g') 710 | echo -e " Aktuelle Version: ${GR}${akt_version}${WE}" 711 | DL_URL=$(echo ${GitHub} | jq -r '.assets | .[].browser_download_url') 712 | echo -e " Lade Datei von GitHub herunter...\n" 713 | curl -LJ ${DL_URL} -o tmp.zip 714 | echo -e "\n Entpacke Dateien...\n" 715 | unzip -n tmp.zip 716 | 717 | echo -e "\n Lösche Dateidownload..." 718 | rm tmp.zip 719 | 720 | echo -e "\n Dateien ausführbar setzen..." 721 | chmod +x ws_updater.sh wetterstation.sh 722 | 723 | jn_abfrage "\n${WE} Soll WLAN-Wetterstation nun als Service eingerichtet werden?" 724 | if [ ! -z $antwort ]; then service; fi 725 | 726 | #Konfiguration öffnen 727 | jn_abfrage "\n${WE} Konfiguration nun öffnen?" 728 | if [ ! -z $antwort ]; then 729 | if [ ! -f ~/.selected_editor ]; then update-alternatives --config editor; fi 730 | $(cat ~/.selected_editor | grep SELECTED_EDITOR | cut -d"=" -f2 | tr -d \") wetterstation.conf 731 | fi 732 | 733 | #DPs im ioB anlegen... 734 | jn_abfrage "\n${BL} Nun mittels des Javascriptes ${GE}'wetterstation.js'${BL} die Datenpunkte im ioBroker anlegen! Fertig [\e[101m Nein=Abbruch \e[0m${BL}]?" 735 | if [ -z $antwort ]; then echo -e "\n"; exit 1; fi 736 | unset antwort 737 | 738 | #Testlauf starten 739 | jn_abfrage "\n${WE} Einmaligen Testdurchlauf im Debug-Modus starten...(empfiehlt sich)?" 740 | if [ ! -z $antwort ]; then ./wetterstation.sh --debug; fi 741 | 742 | #enable Service 743 | jn_abfrage "\n${WE} WLAN-Wetterstation Service nun starten?" 744 | if [ ! -z $antwort ]; then sudo systemctl start wetterstation.service; fi 745 | 746 | echo -e "\n\n Fertig..." 747 | echo -e " Wenn der Testlauf ausgeführt wurde und erfolgreich verlief, sollten nun aktuelle Daten\n der Wetterstation im ioBroker in den Datenpunkten stehen ;-)\n" 748 | } 749 | 750 | service() { 751 | #existiert der Service schon? 752 | if [ -f /etc/systemd/system/wetterstation.service ]; then 753 | echo -e "\n\n ${RE}Wetterstation-Service existiert bereits!${WE}\n" 754 | return 0 755 | fi 756 | 757 | sudo tee -a /etc/systemd/system/wetterstation.service > /dev/null <<-EoD 758 | [Unit] 759 | Description=Service für ioBroker Wetterstation 760 | 761 | [Service] 762 | User=$(whoami) 763 | Group=$(whoami) 764 | ExecStart=${DIR}/wetterstation.sh 765 | 766 | [Install] 767 | WantedBy=multi-user.target 768 | EoD 769 | 770 | echo -e "\n Aktiviere den Service nun..." 771 | sudo systemctl daemon-reload 772 | sudo systemctl enable wetterstation.service 773 | echo -e "\n ${GE}Der Service kann nun mittels ${GR}systemctl start wetterstation${GE} gestartet werden..." 774 | 775 | } 776 | 777 | usage() { 778 | echo -e "\nusage: ws_updater [[--install] | [--patch] | [--service] | [-h|--help]]\n" 779 | echo -e " --install\tinstalliert WLAN-Wetterstation im aktuellen Verzeichnis" 780 | echo -e " --patch\tpatcht die 'wetterstation.conf' auf eine neue Version" 781 | echo -e " --service\trichtet WLAN-Wetterstation als Service ein" 782 | echo -e " -h | --help\tdieses Hilfemenue\n" 783 | } 784 | 785 | menu() { 786 | clear 787 | echo -e "$WE\n\n\n" 788 | echo -e "\t Auswahlmenü für WLAN-Wetterstation:" 789 | echo -e "\t_____________________________________\n\n" 790 | echo -e "\t [${BL}1${WE}] im aktuellen Verzeichnis installieren\n" 791 | echo -e "\t [${BL}2${WE}] als Service einrichten\n" 792 | echo -e "\t [${BL}3${WE}] Konfigurationsdatei patchen\n" 793 | echo -e "\t [${BL}4${WE}] Update ausführen\n\n" 794 | echo -e "\t [${BL}E${WE}] Exit\n\n\n" 795 | echo -en "\t Ihre Auswahl: [${GR}1-4,E${WE}]" 796 | 797 | read -n 1 -p ": " MENU_AUSWAHL 798 | echo -e "\n" 799 | case $MENU_AUSWAHL in 800 | 1) source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --install 801 | exit 0 ;; 802 | 2) source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --service 803 | exit 0 ;; 804 | 3) source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --patch 805 | exit 0 ;; 806 | 4) source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --gitup 807 | exit 0 ;; 808 | e|E) exit 0 ;; 809 | *) menu 810 | esac 811 | } 812 | 813 | make_objects(){ 814 | #1: ID 815 | #2: name 816 | #3: type 817 | #4: unit 818 | 819 | echo -e "\n ${WE}Lege neues Object im ioBroker an: $BL${PRE_DP}$1$WE" 820 | local TOKEN=$(echo -n ${RESTAPI_USER}:${RESTAPI_PW} | base64) 821 | 822 | #build Data-String 823 | local DATA=$(cat <<-EOD 824 | { 825 | "_id": "${PRE_DP}$1", 826 | "type": "state", 827 | "common": { 828 | "name": "$2", 829 | "type": "$3", 830 | "role": "state" 831 | }, 832 | "native": { 833 | "name": "$2", 834 | "type": "$3", 835 | "role": "state" 836 | } 837 | } 838 | EOD 839 | ) 840 | 841 | #Check 4 Units 842 | if [ "$4" != "" ]; then DATA=$(echo $DATA | sed "s|\"role\": \"state\"|\"role\": \"state\", \"unit\": \"$4\"|g"); fi 843 | 844 | local RESULT=$(curl -skX 'POST' \ 845 | ${RESTAPI_URL}'/v1/object/'${PRE_DP}${1} \ 846 | -H 'accept: application/json' \ 847 | -H 'authorization: Basic '${TOKEN} \ 848 | -H 'Content-Type: application/json' \ 849 | --data "$DATA" 850 | ) 851 | 852 | #Fehler beim anlegen? 853 | if [[ $RESULT == *"error"* ]]; then local FEHLER_ioB=$(echo ${RESULT} | jq -r '.error') 854 | echo -e "${RE} Fehlermeldung beim Anlegen des Datenpunktes: ${FEHLER_ioB}${WE}\n" 855 | fi 856 | if [ "$RESULT" == "" ]; then echo -e "${RE} Keine Antwort der Rest-API erhalten! Stimmt das Protokoll (http/https), IP-Adresse und der Port?${WE}\n"; fi 857 | 858 | } 859 | 860 | 861 | #gibt es Parameter? 862 | while [ "$1" != "" ]; do 863 | case $1 in 864 | --install ) checker 865 | install 866 | exit 0 867 | ;; 868 | --menu ) menu 869 | exit 0 870 | ;; 871 | --service ) service 872 | exit 0 873 | ;; 874 | --gitup ) checker 875 | main 876 | exit 0 877 | ;; 878 | --patch ) checker 879 | patcher 880 | exit 0 881 | ;; 882 | -h | --help ) usage 883 | exit 0 884 | ;; 885 | * ) echo -e "\n${RE}\"$1\"${WE} wird nicht unterstützt...\n\n" 886 | usage 887 | exit 1 888 | esac 889 | shift 890 | done 891 | 892 | 893 | 894 | checker 895 | main 896 | 897 | -------------------------------------------------------------------------------- /ws_updater.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | UPDATE_VER=V3.5.0 4 | 5 | ### Farbdefinition 6 | GR='\e[1;32m' 7 | GE='\e[1;33m' 8 | WE='\e[1;37m' 9 | BL='\e[1;36m' 10 | RE='\e[1;31m' 11 | 12 | 13 | echo -e "\n\n${BL}" 14 | echo -e ' 15 | _ _______ __ __ __ __ 16 | | | / / ___/ / / / /___ ____/ /___ _/ /____ _____ 17 | | | /| / /\__ \______/ / / / __ \/ __ / __ `/ __/ _ \/ ___/ 18 | | |/ |/ /___/ /_____/ /_/ / /_/ / /_/ / /_/ / /_/ __/ / 19 | |__/|__//____/ \____/ .___/\__,_/\__,_/\__/\___/_/' ${GE}${UPDATE_VER}${BL} 20 | echo -en ' /_/' 21 | echo -e "${WE}\n" 22 | 23 | 24 | #Nicht als root... 25 | if [ $(whoami) = "root" ]; then echo -e "$RE Ausführung als \"root\" nicht möglich...!\n"; exit 1; fi 26 | 27 | #Verzeichnis feststellen + conf lesen 28 | DIR=$(pwd) 29 | if [ -f "${DIR}/wetterstation.conf" ]; then . "${DIR}/wetterstation.conf"; fi 30 | 31 | 32 | #Test ob Datei auf GitHub, sonst Fallback 33 | if [ "$1" = "" ] && ( ! curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh|grep -xq '404: Not Found' ); then 34 | echo -e "$WE Benutze neuste Version ${BL}$(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh|grep -m 1 'UPDATE_VER='|cut -d"=" -f2)${WE} auf GitHub..." 35 | sleep 2 36 | source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --menu 37 | exit 0 38 | fi 39 | 40 | 41 | 42 | checker() { 43 | #Test ob bc, jq, unzip, patch und dc installiert sind / Service im User-Kontext läuft 44 | #installierte Influx-Version 45 | #Rest-Api im ioB läuft 46 | #Service im User-Kontext? 47 | if [ ! $(cat /etc/systemd/system/wetterstation.service|grep User=) ]; then 48 | echo -e "\n$GE Service läuft nicht im User-Kontext sondern unter User ${RE}root${GE}..." 49 | jn_abfrage "\n$WE Soll nun auf User (empfohlen) umgestellt werden?" 50 | if [ -z $antwort ]; then echo -e "\n"; return; fi 51 | echo -e "\n" 52 | sudo sed -i '/\[Service\]/a User='$(whoami)'\nGroup='$(whoami) /etc/systemd/system/wetterstation.service 53 | echo -e "\n Done... Restarte Service...\n" 54 | sudo systemctl daemon-reload 55 | sudo systemctl restart wetterstation 56 | fi 57 | if [ ! -z ${INFLUX_API} ]; then check_prog influx; fi 58 | check_prog bc 59 | check_prog jq 60 | check_prog dc 61 | check_prog unzip 62 | check_prog patch 63 | check_prog restapi 64 | echo -e "\n" 65 | } 66 | 67 | 68 | check_prog() { 69 | if [ $1 == "influx" ]; then 70 | if [ ! $(curl -skL -I "${INFLUX_WEB}://${INFLUX_API}/ping" | grep X-Influxdb-Version | cut -d" " -f2 | grep v2.[0-9].[0-9]) ]; then echo -e "${RE} Offizieller Support nur noch für Influx V2.x!\n\n${WE}"; sleep 5; fi 71 | return 72 | fi 73 | if [ $1 == "restapi" ]; then 74 | if [ "$(nc -vz $(echo "${RESTAPI_URL}" | grep -o '[\.0-9]*') &> /dev/null; echo $?)" -eq "0" ]; then RESTAPI=true 75 | echo -e "\n Zugriff auf $GR'Rest-API'$WE im ioBroker: [$GR✓$WE]" 76 | else 77 | RESTAPI=false 78 | echo -e "\n Zugriff auf $GR'Rest-API'$WE im ioBroker: [$RE✗$WE]" 79 | echo -e " (Dies ist kein Problem, es können nur keine neuen Datenpunkte bei Bedarf automatisch angelegt werden." 80 | echo -e " Dies muss im Fall neuer Datenpunkte per 'wetterstation.js' von Hand im ioBroker erfolgen.)" 81 | fi 82 | return 83 | fi 84 | if [ $(which $1) ]; then 85 | echo -e " $GR'$1'$WE installiert: [$GR✓$WE]" 86 | else 87 | echo -e " $GR'$1'$WE installiert: [$RE✗$WE]" 88 | echo -e "\n\n $RE Bitte zuerst '$1' installieren [sudo apt install $1]\n" 89 | exit 1 90 | fi 91 | } 92 | 93 | backup() { 94 | echo -e "\n Lege Sicherungskopie der wetterstation.conf an..." 95 | cp ./wetterstation.conf ./wetterstation.conf.backup 96 | } 97 | 98 | FEHLER() { 99 | if [ "$UPDATE_VER" == "$VERSION" ]; then echo -e "\n$WE Version ist aktuell, nothing to do...\n"; exit 0; fi 100 | echo -e "\n Updater ist ${RE}nur${WE} für Versionen ab V1.4.0 !\n" 101 | exit 1 102 | } 103 | 104 | patcher() { 105 | echo -en "\n${WE} Soll die ${RE}wetterstation.conf ${WE}nun auf die neue Version ${GE}${UPDATE_VER}${WE} gepatcht werden? [${GR}J/N${WE}]" 106 | read -n 1 -p ": " JN 107 | if [ "$JN" = "J" ] || [ "$JN" = "j" ]; then 108 | echo -e "\n\n\n" 109 | else 110 | echo -e "\n\n\n" 111 | echo -e " $RE Abbruch... ${WE}\n\n\n"; exit 1; 112 | fi 113 | 114 | VERSION_SH=$(cat ./wetterstation.sh|grep "SH_VER"|cut -d"=" -f2|tr -d \") 115 | 116 | while [ "$VERSION_CONF" != "$VERSION_SH" ] 117 | do 118 | VERSION_CONF=$(cat ./wetterstation.conf|grep "### Settings V"|cut -d" " -f3) 119 | 120 | case ${VERSION_CONF} in 121 | V1.4.0) PATCH140 ;; 122 | V1.5.0) PATCH150 ;; 123 | V1.6.0) PATCH160 ;; 124 | V2.0.0) PATCH210 ;; 125 | V2.1.0) PATCH220 ;; 126 | V2.2.0) PATCH230 ;; 127 | V2.3.0) PATCH240 ;; 128 | V2.4.0) PATCH250 ;; 129 | V2.5.0) PATCH260 ;; 130 | V2.6.0) PATCH270 ;; 131 | V2.7.0) PATCH280 ;; 132 | V2.8.0) PATCH2100 ;; 133 | V2.9.0) echo -e "$GE Kein Patch nötig...\n" ;; 134 | V2.10.0) PATCH2110 ;; 135 | V2.11.0) PATCH2111 ;; 136 | V2.11.1) PATCH2120 ;; 137 | V2.12.0) PATCH2121 ;; 138 | V2.12.1) PATCH2130 ;; 139 | V2.13.0) PATCH2140 ;; 140 | V2.14.0) PATCH2150 ;; 141 | V2.15.0) PATCH2160 ;; 142 | V2.16.0) PATCH2170 ;; 143 | V2.17.0) PATCH2180 ;; 144 | V2.18.0) PATCH2190 ;; 145 | V2.19.0) PATCH2200 ;; 146 | V2.20.0) PATCH2210 ;; 147 | V2.21.0) PATCH2220 ;; 148 | V2.22.0) PATCH3000 ;; 149 | V3.0.0) PATCH3010 ;; 150 | V3.1.0) PATCH3011 ;; 151 | V3.1.1) PATCH3020 ;; 152 | V3.2.0) PATCH3030 ;; 153 | V3.3.0) PATCH3040 ;; 154 | V3.4.0) PATCH3050 && service_restart && exit 0;; 155 | V3.5.0) echo -e "$GE Version ist bereits aktuell...\n" && exit 0;; 156 | *) FEHLER 157 | esac 158 | 159 | done 160 | exit 0 161 | } 162 | 163 | main() { 164 | #Wetterstation im Verzeichnis vorhanden 165 | if [ ! -f ./wetterstation.sh ]; then 166 | echo -e "\n$RE Keine Version von WLAN-Wetterstation im aktuellen Verzeichnis gefunden...\n" 167 | exit 1 168 | fi 169 | 170 | #aktuelle Version von GitHub holen 171 | GitHub=$(curl -sH "Accept: application/vnd.github.v3+json" https://api.github.com/repos/SBorg2014/WLAN-Wetterstation/releases/latest) 172 | akt_ver_long=$(echo ${GitHub} | jq -r '.name' | sed -e 's/-/vom/; s/\"//g') 173 | akt_version=$(echo ${GitHub} | jq -r '.tag_name') 174 | info_version=$(echo ${GitHub} | jq -r '.body' | tr -d '*\\') 175 | 176 | echo -e " Aktuelle Version (latest) auf GitHub: ${GR}$akt_ver_long$WE" 177 | VERSION=$(cat ./wetterstation.sh|grep "SH_VER"|cut -d"=" -f2|tr -d \") 178 | echo -e " Version im aktuellen Verzeichnis : ${GR}$VERSION" 179 | 180 | if [ "$VERSION" == "$akt_version" ]; then echo -e "\n$GE Version ist bereits aktuell...\n"; exit 0; fi 181 | 182 | echo -e "\n$WE Informationen zum Release $akt_version:" 183 | echo -e " ─────────────────────────────────────────────────────────────" 184 | echo -e "\n$GE $info_version\n$WE" 185 | 186 | jn_abfrage "\n$WE Soll ein Update von WLAN-Wetterstation durchgeführt werden?" 187 | if [ -z $antwort ]; then echo -e "\n"; exit 0; fi 188 | 189 | #Update 190 | echo -e "\n\n$WE Führe Update aus...\n" 191 | DL_URL=$(echo ${GitHub} | jq -r '.assets | .[].browser_download_url') 192 | curl -LJ ${DL_URL} -o tmp.zip 193 | unzip -o tmp.zip -x wetterstation.conf 194 | sudo chmod +x wetterstation.sh ws_updater.sh 195 | 196 | rm tmp.zip 197 | source ./ws_updater.sh --patch 198 | } 199 | 200 | service_restart() { 201 | jn_abfrage "\n ${WE}Update ausgeführt. Soll der Service nun neu gestartet werden?" 202 | if [ ! -z $antwort ]; then echo -e "\n"; sudo systemctl restart wetterstation.service; fi 203 | } 204 | 205 | ######################################################################################## 206 | #Patch Version V1.4.0 auf V1.5.0 207 | PATCH140() { 208 | backup 209 | echo -e "\n Patche wetterstation.conf auf V1.5.0 ..." 210 | sed -i '/^.#Port der Wetterstation/i \ #Protokoll (HTTP oder HTTPS) \/ default: HTTP\n WEB=HTTP\n\n #User-Authentifizierung falls benutzt; sonst leer lassen\n AUTH_USER=\n AUTH_PASS=\n' ./wetterstation.conf 211 | sed -i 's/### Settings V1.4.0/### Settings V1.5.0/' ./wetterstation.conf 212 | echo -e " Fertig...\n" 213 | } 214 | 215 | 216 | #Patch Version V1.5.0 auf V1.6.0 217 | PATCH150() { 218 | backup 219 | echo -e "\n Patche wetterstation.conf auf V1.6.0 ..." 220 | sed -i 's/### Settings V1.5.0/### Settings V1.6.0/' ./wetterstation.conf 221 | echo -e " Fertig...\n" 222 | } 223 | 224 | 225 | #Patch Version V1.6.0 auf V2.0.0 226 | PATCH160() { 227 | backup 228 | echo -e "\n Patche wetterstation.conf auf V2.0.0 ..." 229 | sed -i '/^.#Protokoll (HTTP oder HTTPS)/i \ #Protokoll der Wetterstation [1/2] \/ 1=Wunderground ; 2=Ecowitt \/ default: 1\n WS_PROTOKOLL=1\n\n #Anzahl der vorhandenen DP50 Sensoren \/ default: 0\n ANZAHL_DP50=0\n\n #HTTP Anzahl der vorhandenen DP100 Sensoren \/ default: 0\n ANZAHL_DP100=0\n' ./wetterstation.conf 230 | sed -i 's/### Settings V1.6.0/### Settings V2.0.0/' ./wetterstation.conf 231 | echo -e " Fertig...\n" 232 | } 233 | 234 | 235 | #Patch Version V2.0.0 auf V2.1.0 236 | PATCH210() { 237 | backup 238 | echo -e "\n Patche wetterstation.conf auf V2.1.0 ..." 239 | sed -i 's/#Protokoll der Wetterstation \[1\/2\] \/ 1=Wunderground ; 2=Ecowitt \/ default: 1/#Protokoll der Wetterstation \[1\/2\/9\] \/ 1=Wunderground ; 2=Ecowitt ; 9=Sainlogic Profi \/ default: 1/' ./wetterstation.conf 240 | sed -i 's/### Settings V2.0.0/### Settings V2.1.0/' ./wetterstation.conf 241 | echo -e " Fertig...\n" 242 | } 243 | 244 | 245 | #Patch Version V2.1.0 auf V2.2.0 246 | PATCH220() { 247 | backup 248 | echo -e "\n Patche wetterstation.conf auf V2.2.0 ..." 249 | sed -i 's/Chillfaktor/gefühlte Temperatur/' ./wetterstation.conf 250 | sed -i 's/### Settings V2.1.0/### Settings V2.2.0/' ./wetterstation.conf 251 | echo -e " Fertig...\n" 252 | } 253 | 254 | 255 | #Patch Version V2.2.0 auf V2.3.0 256 | PATCH230() { 257 | backup 258 | echo -e "\n Patche wetterstation.conf auf V2.3.0 ..." 259 | sed -i '/#Anzahl der vorhandenen DP50/,/ANZAHL_DP100=/c\ #Anzahl der vorhandenen Zusatzsensoren \/ default: 0\n ANZAHL_DP50=0\n ANZAHL_DP60=0\n ANZAHL_DP100=0' ./wetterstation.conf 260 | sed -i '/^.#letztes Regenereignis/i \ #InfluxDB-Konfiguration \/ ohne InfluxDB alles leer lassen\n #IP und Port der API [xxx.xxx.xxx.xxx:xxxxx]\n INFLUX_API=\n #Name, User und Passwort der InfluxDB-Datenbank\n INFLUX_DB=\n INFLUX_USER=\n INFLUX_PASSWORD=\n' ./wetterstation.conf 261 | sed -i 's/### Settings V2.2.0/### Settings V2.3.0/' ./wetterstation.conf 262 | echo -e " Fertig...\n" 263 | echo -e " ${GE}Eventuelle Zusatzsensoren DP50/60/100 müssen neu eingetragen werden!" 264 | echo -e " Neuen Configblock für Influx beachten/konfigurieren!\n" 265 | } 266 | 267 | 268 | #Patch Version V2.3.0 auf V2.4.0 269 | PATCH240() { 270 | backup 271 | echo -e "\n Patche wetterstation.conf auf V2.4.0 ..." 272 | sed -i '/^.*ANZAHL_DP100=.*/a \ ANZAHL_DP200=0' ./wetterstation.conf 273 | sed -i 's/### Settings V2.3.0/### Settings V2.4.0/' ./wetterstation.conf 274 | echo -e " Fertig...\n" 275 | echo -e " ${GE}Eventuelle Zusatzsensoren DP200 müssen eingetragen werden!\n" 276 | } 277 | 278 | 279 | #Patch Version V2.4.0 auf V2.5.0 280 | PATCH250() { 281 | backup 282 | echo -e "\n Patche wetterstation.conf auf V2.5.0 ..." 283 | sed -i '/^.*ANZAHL_DP100=.*/i \ ANZAHL_DP70=0' ./wetterstation.conf 284 | sed -i 's/### Settings V2.4.0/### Settings V2.5.0/' ./wetterstation.conf 285 | echo -e " Fertig...\n" 286 | echo -e " ${GE}Eventuelle Zusatzsensoren DP70 müssen eingetragen werden!\n" 287 | } 288 | 289 | 290 | #Patch Version V2.5.0 auf V2.6.0 291 | PATCH260() { 292 | backup 293 | echo -e "\n Patche wetterstation.conf auf V2.6.0 ..." 294 | patch_260 && patch ./wetterstation.conf < patch 295 | rm patch 296 | echo -e " ${GE}Windy kann nun mittels \033[30m\033[47m./wetterstation.sh --windy_reg\033[0m ${GE}eingerichtet werden !\n" 297 | } 298 | 299 | 300 | #Patch Version V2.6.0 auf V2.7.0 301 | PATCH270() { 302 | backup 303 | echo -e "\n Patche wetterstation.conf auf V2.7.0 ..." 304 | sed -i '/^.*ANZAHL_DP200=.*/a \ ANZAHL_DP250=0' ./wetterstation.conf 305 | sed -i 's/### Settings V2.6.0/### Settings V2.7.0/' ./wetterstation.conf 306 | echo -e " Fertig...\n" 307 | echo -e " ${GE}Eventueller Zusatzsensor DP250/WH45 muss eingetragen werden!\n" 308 | } 309 | 310 | 311 | #Patch Version V2.7.0 auf V2.8.0 312 | PATCH280() { 313 | backup 314 | echo -e "\n Patche wetterstation.conf auf V2.8.0 ..." 315 | sed -i '/^.*SONNENSCHEIN_TXTFORMAT=.*/a \ \n\n #Daten an Wetter.com senden (leer lassen falls nicht gewünscht)?\n WETTERCOM_ID=\n WETTERCOM_PW=' ./wetterstation.conf 316 | sed -i 's/### Settings V2.7.0/### Settings V2.8.0/' ./wetterstation.conf 317 | echo -e " Fertig...\n" 318 | echo -e " ${GE}Falls die Übertragung der Wetterdaten an wetter.com erfolgen soll, nun aktivieren durch eintragen von User-ID und Passwort!\n" 319 | } 320 | 321 | 322 | #Patch Version V2.8.0 auf V2.10.0 323 | PATCH2100() { 324 | backup 325 | echo -e "\n Patche wetterstation.conf auf V2.10.0 ..." 326 | patch_2100 && patch ./wetterstation.conf < patch.dat 327 | rm patch.dat 328 | echo -e " Fertig...\n" 329 | echo -e " ${GE}Eventuelle Zusatzsensoren DP300/WS68, DP40/WH32 oder WH25/WH31 müssen eingetragen werden!\n" 330 | } 331 | 332 | 333 | #Patch Version V2.10.0 auf V2.11.0 334 | PATCH2110() { 335 | backup 336 | echo -e "\n Patche wetterstation.conf auf V2.11.0 ..." 337 | sed -i 's/### Settings V2.10.0/### Settings V2.11.0/' ./wetterstation.conf 338 | sed -i '/^.*debug=.*/a \ \n #Verhalten bei Kommunikationsfehler [true/false] / default: false / Soll der Datenpunkt automatisch resettet werden?\n RESET_KOMFEHLER=false' ./wetterstation.conf 339 | echo -e " Fertig...\n" 340 | echo -e " ${GE}Parameter für Kommunikationsfehler ggf. ändern. Per Default verbleibt er im Zustand 'true' bei einem Fehler.\n" 341 | } 342 | 343 | 344 | #Patch Version V2.11.0 auf V2.11.1 345 | PATCH2111() { 346 | backup 347 | echo -e "\n Patche wetterstation.conf auf V2.11.1 ..." 348 | sed -i 's/### Settings V2.11.0/### Settings V2.11.1/' ./wetterstation.conf 349 | sed -i 's/Sainlogic Profi/DNS/' ./wetterstation.conf 350 | echo -e " Fertig...\n" 351 | } 352 | 353 | 354 | #Patch Version V2.11.1 auf V2.12.0 355 | PATCH2120() { 356 | backup 357 | echo -e "\n Patche wetterstation.conf auf V2.12.0 ..." 358 | sed -i 's/### Settings V2.11.1/### Settings V2.12.0/' ./wetterstation.conf 359 | sed -i '/^.*WETTERCOM_PW=.*/a \ \n #Fix aktivieren bei fehlerhafter Außentemperatur [true/false] / default: false\n #Bei unplausiblem Messwert wird kein Datenpaket an den ioB geschickt\n FIX_AUSSENTEMP=false' ./wetterstation.conf 360 | echo -e " Fertig...\n" 361 | echo -e " ${GE}Parameter für FIX_AUSSENTEMP ggf. ändern. Per Default werden auch unplausible Messwerte an den ioB geschickt.\n" 362 | } 363 | 364 | 365 | #Patch Version V2.12.0 auf V2.12.1 366 | PATCH2121() { 367 | backup 368 | echo -e "${WE}\n Patche wetterstation.conf auf V2.12.1 ..." 369 | sed -i 's/### Settings V2.12.0/### Settings V2.12.1/' ./wetterstation.conf 370 | echo -e "${WE} Fertig...\n" 371 | } 372 | 373 | 374 | #Patch Version V2.12.1 auf V2.13.0 375 | PATCH2130() { 376 | backup 377 | echo -e "${WE}\n Patche wetterstation.conf auf V2.13.0 ..." 378 | sed -i 's/### Settings V2.12.1/### Settings V2.13.0/' ./wetterstation.conf 379 | sed -i '/^.*ANZAHL_WH31=.*/a \ ANZAHL_DP35=0' ./wetterstation.conf 380 | echo -e "${WE} Fertig...\n" 381 | echo -e " ${GE}Eventuelle Zusatzsensoren DP35 müssen eingetragen werden!\n" 382 | } 383 | 384 | 385 | #Patch Version V2.13.0 auf V2.14.0 386 | PATCH2140() { 387 | backup 388 | echo -e "${WE}\n Patche wetterstation.conf auf V2.14.0 ..." 389 | sed -i 's/### Settings V2.13.0/### Settings V2.14.0/' ./wetterstation.conf 390 | sed -i '/^.*WEB=HTTP.*/a \\n #Ignoriere Zertifikatsfehler bei der Simple-Restful-API [true/false] / default: false / nötig bei eigenen Zertifikaten\n WEB_IGN_SSL_ERROR=false' ./wetterstation.conf 391 | echo -e "${WE} Fertig...\n" 392 | } 393 | 394 | 395 | #Patch Version V2.14.0 auf V2.15.0 396 | PATCH2150() { 397 | backup 398 | echo -e "${WE}\n Patche wetterstation.conf auf V2.15.0 ..." 399 | sed -i 's/### Settings V2.14.0/### Settings V2.15.0/' ./wetterstation.conf 400 | sed -i '/^.*WETTERCOM_PW=.*/a \\n\n #Daten an Wunderground.com senden? [true/false] / default: false\n #Nur nötig und sinnvoll bei WS_PROTOKOLL=9 (DNS) wenn trotzdem auch Daten weiterhin an Wunderground.com gesendet werden sollen.\n WUNDERGROUND_UPDATE=false' ./wetterstation.conf 401 | sed -i 's/#InfluxDB-Konfiguration/#InfluxDB-Konfiguration für Influx V1.x.x/' ./wetterstation.conf 402 | echo -e "${WE} Fertig...\n" 403 | echo -e " ${GE}Die Datenübertragung an Wunderground.com kann nun aktiviert werden!\n" 404 | } 405 | 406 | 407 | #Patch Version V2.15.0 auf V2.16.0 408 | PATCH2160() { 409 | backup 410 | echo -e "${WE}\n Patche wetterstation.conf auf V2.16.0 ..." 411 | sed -i 's/### Settings V2.15.0/### Settings V2.16.0/' ./wetterstation.conf 412 | sed -i '/^.*IPP=.*/a \\n #Protokoll, ioBroker-IP und Port der Rest-API [http(s)://xxx.xxx.xxx.xxx:xxxxx] / leer lassen falls nicht benutzt\n RESTAPI_URL=\n RESTAPI_USER=\n RESTAPI_PW=' ./wetterstation.conf 413 | echo -e "${WE} Fertig...\n" 414 | echo -e " ${GE}Die Rest-API kann nun durch Eingabe der URL und den Zugangsdaten aktiviert werden!\n" 415 | } 416 | 417 | 418 | #Patch Version V2.16.0 auf V2.17.0 419 | PATCH2170() { 420 | backup 421 | echo -e "${WE}\n Patche wetterstation.conf auf V2.17.0 ..." 422 | sed -i 's/### Settings V2.16.0/### Settings V2.17.0/' ./wetterstation.conf 423 | sed -i '/^.*WUNDERGROUND_UPDATE=.*/a \\n #Windrichtung und -geschwindigkeit der letzten 10 Minuten anstelle aktueller Werte an\n #windy/OpenSenseMap/wetter.com übertragen? [true/false] / default: false\n USE_AVG_WIND=false' ./wetterstation.conf 424 | if [ ${RESTAPI} == "true" ]; then make_objects ".Aussentemperatur_Trend" "Trend der Aussentemperatur der letzten Stunde" "number" "°C"; fi 425 | echo -e "${WE} Fertig...\n" 426 | echo -e " ${GE}Die alternative Datenübertragung von Windrichtung und -geschwindigkeit der letzten\n 10 Minuten an windy/OpenSenseMap/wetter.com kann nun aktiviert werden!" 427 | echo -e " Einstellung dafür in der wetterstation.conf: ${BL}USE_AVG_WIND=true\n${WE}" 428 | } 429 | 430 | 431 | #Patch Version V2.17.0 auf V2.18.0 432 | PATCH2180() { 433 | backup 434 | echo -e "${WE}\n Patche wetterstation.conf auf V2.18.0 ..." 435 | sed -i 's/### Settings V2.17.0/### Settings V2.18.0/' ./wetterstation.conf 436 | sed -i '/^.*ANZAHL_DP35=.*/i \ ANZAHL_DP10=0' ./wetterstation.conf 437 | if [ ${RESTAPI} == "true" ]; then 438 | make_objects ".Info.Wolkenbasis" "Höhe der Wolkenbasis" "number" "m" 439 | make_objects ".Info.Shellscriptversion" "Versionsnummer des Scriptes" "string" 440 | make_objects ".Windrichtung_Text_10min" "Windrichtung Durchschnitt 10 Minuten als Text" "string" 441 | fi 442 | echo -e "${WE} Fertig...\n" 443 | echo -e " ${GE}Eventuelle Zusatzsensoren DP10/WN35 können nun eingetragen werden!\n${WE}" 444 | } 445 | 446 | 447 | #Patch Version V2.18.0 auf V2.19.0 448 | PATCH2190() { 449 | backup 450 | echo -e "${WE}\n Patche wetterstation.conf auf V2.19.0 ..." 451 | sed -i 's/### Settings V2.18.0/### Settings V2.19.0/' ./wetterstation.conf 452 | sed -i '/^.*ANZAHL_WH31=.*/a \ ANZAHL_WS90=0' ./wetterstation.conf 453 | if [ ${RESTAPI} == "true" ]; then make_objects ".Info.Wetterwarnung" "mögliche Wetterereignisse" "string" 454 | # #Abfrage starten zum Anlegen der DPs des WS90 455 | # jn_abfrage "${WE} Sollen nun Datenpunkte für den WS90 angelegt werden...(nur sinnvoll wenn man auch einen hat ;-))?" 456 | # if [ ! -z $antwort ]; then 457 | # make_objects ".WS90" "WS90 Wittboy" "folder" 458 | # make_objects ".WS90.1.aktuelle_Regenrate" "WS90 Kanal 1 aktuelle Regenrate" "number" "mm/h" 459 | # fi 460 | fi 461 | echo -e "\n${WE} Fertig...\n" 462 | echo -e " ${GE}Eventueller Zusatzsensor WS90 kann nun eingetragen werden!${WE}" 463 | # if [ ${RESTAPI} != "true" ] || [ -z $antwort ]; then echo -e " ${GE}Dazu noch 'wetterstation.js' im ioB ersetzen, konfigurieren und einmalig ausführen.\n${WE}"; fi 464 | echo -e " ${GE}Dazu noch 'wetterstation.js' im ioB ersetzen, konfigurieren und einmalig ausführen.\n${WE}" 465 | } 466 | 467 | 468 | #Patch Version V2.19.0 auf V2.20.0 469 | PATCH2200(){ 470 | backup 471 | echo -e "${WE}\n Patche wetterstation.conf auf V2.20.0 ..." 472 | sed -i 's/### Settings V2.19.0/### Settings V2.20.0/' ./wetterstation.conf 473 | echo -e "\n${WE} Fertig...\n" 474 | } 475 | 476 | 477 | #Patch Version V2.20.0 auf V2.21.0 478 | PATCH2210(){ 479 | backup 480 | echo -e "${WE}\n Patche wetterstation.conf auf V2.21.0 ..." 481 | sed -i 's/### Settings V2.20.0/### Settings V2.21.0/' ./wetterstation.conf 482 | sed -i '/^.*Ende Usereinstellungen.*/i \\n #############################################################################################\n ### AWEKAS - Einstellungen (nur nötig falls AWEKAS benutzt werden soll) ###\n #############################################################################################' ./wetterstation.conf 483 | sed -i '/^.*Ende Usereinstellungen.*/i \\n #AWEKAS aktivieren [true/false] / default: false\n use_awekas=false\n\ 484 | #AWEKAS Login Username und Passwort\n AWEKAS_USER=\n AWEKAS_PW=\n\ 485 | #############################################################################################\ 486 | ### AWEKAS - Ende der Einstellungen ###################################################\ 487 | #############################################################################################\n' ./wetterstation.conf 488 | if [ ${RESTAPI} == "true" ]; then 489 | make_objects ".Info.Awekas_at" "Datenübertragung an AWEKAS.at erfolgreich" "boolean" 490 | fi 491 | echo -e "\n${WE} Fertig...\n" 492 | echo -e " ${GE}Die Datenübertragung kann nun (optional) in der wetterstaion.conf nach Eintragung der Zugangsdaten aktiviert werden.${WE}" 493 | } 494 | 495 | 496 | #Patch Version V2.21.0 auf V2.22.0 497 | PATCH2220(){ 498 | backup 499 | echo -e "${WE}\n Patche wetterstation.conf auf V2.22.0 ..." 500 | sed -i 's/### Settings V2.21.0/### Settings V2.22.0/' ./wetterstation.conf 501 | sed -i 's/Anzahl der vorhandenen Zusatzsensoren/Anzahl der vorhandenen Zusatzsensoren Froggit, Ecowitt und Bresser/' ./wetterstation.conf 502 | sed -i '/^.*ANZAHL_DP300=.*/a \ ANZAHL_7009999=0' ./wetterstation.conf 503 | echo -e "\n${WE} Fertig...\n" 504 | echo -e " ${GE}Eventuelle Zusatzsensoren Bresser #7009999 können nun eingetragen werden!${WE}" 505 | echo -e " ${GE}Dazu noch 'wetterstation.js' im ioB ersetzen, konfigurieren und einmalig ausführen.\n${WE}" 506 | } 507 | 508 | 509 | #Patch Version V2.22.0 auf V3.0.0 510 | PATCH3000(){ 511 | echo -e "${RE}"' 512 | ___ __ __ __ 513 | / | _____/ /_ / /___ ______ ____ _ / / 514 | / /| |/ ___/ __ \/ __/ / / / __ \/ __ `/ / / 515 | / ___ / /__/ / / / /_/ /_/ / / / / /_/ / /_/ 516 | /_/ |_\___/_/ /_/\__/\__,_/_/ /_/\__, / (_) 517 | /____/'"${WE}" 518 | 519 | echo -e "\n${GE} ┌──────────────────────────────────────────────────────┐" 520 | echo -e " │ V3.0.0 ist ein Breaking-Release! │" 521 | echo -e " │ Es wird zwingend bei der Nutzung der Influx-Features │" 522 | echo -e " │ InfluxDB mindestens in der Version 2.x oder höher │" 523 | echo -e " │ benötigt ! │" 524 | echo -e " └──────────────────────────────────────────────────────┘${WE}\n" 525 | 526 | jn_abfrage "${WE}\n Möchten Sie ${BL}WLAN-Wetterstation${WE} auf Version V3.0.0 updaten?" 527 | if [ -z $antwort ]; then echo -e "\n ${RE}Abbruch...${WE}\n\n"; exit 1; fi 528 | unset antwort 529 | 530 | backup 531 | echo -e "${WE}\n Patche wetterstation.conf auf V3.0.0 ..." 532 | sed -i 's/### Settings V2.22.0/### Settings V3.0.0/' ./wetterstation.conf 533 | sed -i 's/#Name, User und Passwort der InfluxDB-Datenbank/#Bucket, Token und Organisation der InfluxDB/' ./wetterstation.conf 534 | sed -i 's/INFLUX_DB=/INFLUX_BUCKET=/' ./wetterstation.conf 535 | sed -i 's/INFLUX_USER=.*/INFLUX_TOKEN=/' ./wetterstation.conf 536 | sed -i 's/INFLUX_PASSWORD=.*/INFLUX_ORG=/' ./wetterstation.conf 537 | sed -i '/^.*#InfluxDB-Konfiguration \/ ohne InfluxDB alles leer lassen.*/a \ #Protokoll (HTTP oder HTTPS) / default: HTTP\n INFLUX_WEB=HTTP' ./wetterstation.conf 538 | echo -e "\n${WE} Fertig...\n" 539 | echo -e " ${GE}InfluxDB in Version 2.x kann nun in der Konfiguration aktiviert werden.\n${WE}" 540 | } 541 | 542 | 543 | #Patch Version V3.0.0 auf V3.1.0 544 | PATCH3010(){ 545 | backup 546 | echo -e "${WE}\n Patche wetterstation.conf auf V3.1.0 ..." 547 | sed -i 's/### Settings V3.0.0/### Settings V3.1.0/' ./wetterstation.conf 548 | echo -e "\n${WE} Fertig...\n" 549 | } 550 | 551 | 552 | #Patch Version V3.1.0 auf V3.1.1 553 | PATCH3011(){ 554 | backup 555 | echo -e "${WE}\n Patche wetterstation.conf auf V3.1.1 ..." 556 | sed -i 's/### Settings V3.1.0/### Settings V3.1.1/' ./wetterstation.conf 557 | echo -e "\n${WE} Fertig...\n" 558 | } 559 | 560 | 561 | patch_260() { 562 | cat <patch 563 | --- wetterstation.conf_250 2021-05-13 13:45:06.297750501 +0200 564 | +++ wetterstation.conf 2021-05-12 18:39:24.358821394 +0200 565 | @@ -1,4 +1,4 @@ 566 | -### Settings V2.5.0 ----------------------------------------------------------- 567 | +### Settings V2.6.0 ----------------------------------------------------------- 568 | #Debuging einschalten [true/false] / default: false / Ausgabe der Messwerte 569 | debug=false 570 | 571 | @@ -112,5 +112,42 @@ 572 | ############################################################################################# 573 | 574 | 575 | + 576 | + ############################################################################################# 577 | + ### Windy - Einstellungen (nur nötig falls Windy benutzt werden soll) ### 578 | + ############################################################################################# 579 | + 580 | + #Windy aktivieren [true/false] / default: false 581 | + use_windy=false 582 | + 583 | + #Windy API-Key 584 | + windy_APIKey= 585 | + 586 | + #Station [number: 0 - 2147483647] / default: 0 587 | + windy_Station= 588 | + 589 | + #Name der Station [Text] 590 | + windy_Name= 591 | + 592 | + #Latitude/Breitengrad der Station 593 | + windy_Latitude= 594 | + 595 | + #Longitude/Längengrad der Station 596 | + windy_Longitude= 597 | + 598 | + #Elevation/Höhe ÜNN 599 | + windy_Elevation= 600 | + 601 | + #Montagehöhe Temperatursensor über Boden 602 | + windy_Tempheight= 603 | + 604 | + #Montagehöhe Windsensor über Boden 605 | + windy_Windheight= 606 | + 607 | + ############################################################################################# 608 | + ### Windy - Ende der Einstellungen #################################################### 609 | + ############################################################################################# 610 | + 611 | + 612 | ### Ende Usereinstellungen 613 | ###EoF 614 | EoD 615 | } 616 | 617 | patch_2100() { 618 | cat <patch.dat 619 | --- wetterstation.org 2021-10-26 20:01:56.772982845 +0200 620 | +++ wetterstation.conf 2021-10-26 20:04:21.625615091 +0200 621 | @@ -1,7 +1,10 @@ 622 | -### Settings V2.8.0 ----------------------------------------------------------- 623 | +### Settings V2.10.0 ----------------------------------------------------------- 624 | #Debuging einschalten [true/false] / default: false / Ausgabe der Messwerte 625 | debug=false 626 | 627 | + #Logging einschalten [true/false] / default: false / schreibt die Datenstrings der Station in eine Datei 628 | + logging=false 629 | + 630 | #ioBroker-IP und Port der Simple-Restful-API [xxx.xxx.xxx.xxx:xxxxx] 631 | IPP=192.168.1.3:8087 632 | 633 | @@ -9,12 +12,15 @@ 634 | WS_PROTOKOLL=1 635 | 636 | #Anzahl der vorhandenen Zusatzsensoren / default: 0 637 | + ANZAHL_WH31=0 638 | + ANZAHL_DP40=0 639 | ANZAHL_DP50=0 640 | ANZAHL_DP60=0 641 | ANZAHL_DP70=0 642 | ANZAHL_DP100=0 643 | ANZAHL_DP200=0 644 | ANZAHL_DP250=0 645 | + ANZAHL_DP300=0 646 | 647 | #Protokoll (HTTP oder HTTPS) / default: HTTP 648 | WEB=HTTP 649 | EofP 650 | } 651 | 652 | 653 | #Patch Version V3.1.1 auf V3.2.0 654 | PATCH3020(){ 655 | backup 656 | echo -e "${WE}\n Patche wetterstation.conf auf V3.2.0 ..." 657 | sed -i 's/### Settings V3.1.1/### Settings V3.2.0/' ./wetterstation.conf 658 | sed -i '/^.*Ende Usereinstellungen.*/i \\n\n #############################################################################################\n ### WOW - Einstellungen (nur nötig falls WOW benutzt werden soll) ###\n #############################################################################################' ./wetterstation.conf 659 | sed -i '/^.*Ende Usereinstellungen.*/i \\n #WOW aktivieren [true/false] / default: false\n use_wow=false\n\ 660 | #WOW Site ID und Authentication Key\n WOW_SITEID=\n WOW_AUTHKEY=\n\ 661 | #############################################################################################\ 662 | ### WOW - Ende der Einstellungen ######################################################\ 663 | #############################################################################################\n' ./wetterstation.conf 664 | if [ ${RESTAPI} == "true" ]; then 665 | make_objects ".Info.WOW" "Datenübertragung WOW erfolgreich" "boolean" 666 | fi 667 | echo -e "\n${WE} Fertig...\n" 668 | echo -e " ${GE}Die Datenübertragung kann nun (optional) in der wetterstaion.conf nach Eintragung der Zugangsdaten und Aktivierung erfolgen.${WE}" 669 | } 670 | 671 | 672 | #Patch Version V3.2.0 auf V3.3.0 673 | PATCH3030(){ 674 | backup 675 | echo -e "${WE}\n Patche wetterstation.conf auf V3.3.0 ..." 676 | sed -i 's/### Settings V3.2.0/### Settings V3.3.0/' ./wetterstation.conf 677 | echo -e "\n${WE} Fertig...\n" 678 | } 679 | 680 | 681 | #Patch Version V3.3.0 auf V3.4.0 682 | PATCH3040(){ 683 | backup 684 | echo -e "${WE}\n Patche wetterstation.conf auf V3.4.0 ..." 685 | sed -i 's/### Settings V3.3.0/### Settings V3.4.0/' ./wetterstation.conf 686 | echo -e "\n${WE} Fertig...\n" 687 | } 688 | 689 | 690 | #Patch Version V3.4.0 auf V3.5.0 691 | PATCH3050(){ 692 | backup 693 | echo -e "${WE}\n Patche wetterstation.conf auf V3.5.0 ..." 694 | sed -i 's/### Settings V3.4.0/### Settings V3.5.0/' ./wetterstation.conf 695 | if [ ${RESTAPI} == "true" ]; then 696 | make_objects ".Sättigungsdefizit" "(Wasserdampf-)Drucksättigungsdefizit VPD" "number" "kPa" 697 | fi 698 | echo -e "\n${WE} Fertig...\n" 699 | } 700 | 701 | 702 | jn_abfrage() { 703 | echo -en "\n$1 ${WE}[${GR}J/N${WE}]" 704 | read -n 1 -p ": " JN 705 | if [ "$JN" = "J" ] || [ "$JN" = "j" ]; then 706 | antwort=true 707 | else 708 | unset antwort 709 | fi 710 | 711 | } 712 | 713 | install() { 714 | #WLAN-Wetterstation Installationsroutine 715 | jn_abfrage "${WE}\n Möchten Sie ${BL}WLAN-Wetterstation${WE} im aktuellen Verzeichnis installieren?" 716 | if [ -z $antwort ]; then echo -e "\n ${RE}Abbruch...${WE}\n\n"; exit 1; fi 717 | unset antwort 718 | 719 | #aktuelle Version feststellen, downloaden und entpacken 720 | echo -e "\n\n\n Hole Daten von GitHub..." 721 | GitHub=$(curl -sH "Accept: application/vnd.github.v3+json" https://api.github.com/repos/SBorg2014/WLAN-Wetterstation/releases/latest) 722 | akt_version=$(echo ${GitHub} | jq -r '.name' | sed -e 's/-/vom/; s/\"//g') 723 | echo -e " Aktuelle Version: ${GR}${akt_version}${WE}" 724 | DL_URL=$(echo ${GitHub} | jq -r '.assets | .[].browser_download_url') 725 | echo -e " Lade Datei von GitHub herunter...\n" 726 | curl -LJ ${DL_URL} -o tmp.zip 727 | echo -e "\n Entpacke Dateien...\n" 728 | unzip -n tmp.zip 729 | 730 | echo -e "\n Lösche Dateidownload..." 731 | rm tmp.zip 732 | 733 | echo -e "\n Dateien ausführbar setzen..." 734 | chmod +x ws_updater.sh wetterstation.sh 735 | 736 | jn_abfrage "\n${WE} Soll WLAN-Wetterstation nun als Service eingerichtet werden?" 737 | if [ ! -z $antwort ]; then service; fi 738 | 739 | #Konfiguration öffnen 740 | jn_abfrage "\n${WE} Konfiguration nun öffnen?" 741 | if [ ! -z $antwort ]; then 742 | if [ ! -f ~/.selected_editor ]; then update-alternatives --config editor; fi 743 | $(cat ~/.selected_editor | grep SELECTED_EDITOR | cut -d"=" -f2 | tr -d \") wetterstation.conf 744 | fi 745 | 746 | #DPs im ioB anlegen... 747 | jn_abfrage "\n${BL} Nun mittels des Javascriptes ${GE}'wetterstation.js'${BL} die Datenpunkte im ioBroker anlegen! Fertig [\e[101m Nein=Abbruch \e[0m${BL}]?" 748 | if [ -z $antwort ]; then echo -e "\n"; exit 1; fi 749 | unset antwort 750 | 751 | #Testlauf starten 752 | jn_abfrage "\n${WE} Einmaligen Testdurchlauf im Debug-Modus starten...(empfiehlt sich)?" 753 | if [ ! -z $antwort ]; then ./wetterstation.sh --debug; fi 754 | 755 | #enable Service 756 | jn_abfrage "\n${WE} WLAN-Wetterstation Service nun starten?" 757 | if [ ! -z $antwort ]; then sudo systemctl start wetterstation.service; fi 758 | 759 | echo -e "\n\n Fertig..." 760 | echo -e " Wenn der Testlauf ausgeführt wurde und erfolgreich verlief, sollten nun aktuelle Daten\n der Wetterstation im ioBroker in den Datenpunkten stehen ;-)\n" 761 | } 762 | 763 | service() { 764 | #existiert der Service schon? 765 | if [ -f /etc/systemd/system/wetterstation.service ]; then 766 | echo -e "\n\n ${RE}Wetterstation-Service existiert bereits!${WE}\n" 767 | return 0 768 | fi 769 | 770 | sudo tee -a /etc/systemd/system/wetterstation.service > /dev/null <<-EoD 771 | [Unit] 772 | Description=Service für ioBroker Wetterstation 773 | 774 | [Service] 775 | User=$(whoami) 776 | Group=$(whoami) 777 | ExecStart=${DIR}/wetterstation.sh 778 | 779 | [Install] 780 | WantedBy=multi-user.target 781 | EoD 782 | 783 | echo -e "\n Aktiviere den Service nun..." 784 | sudo systemctl daemon-reload 785 | sudo systemctl enable wetterstation.service 786 | echo -e "\n ${GE}Der Service kann nun mittels ${GR}systemctl start wetterstation${GE} gestartet werden..." 787 | 788 | } 789 | 790 | usage() { 791 | echo -e "\nusage: ws_updater [[--install] | [--patch] | [--service] | [-h|--help]]\n" 792 | echo -e " --install\tinstalliert WLAN-Wetterstation im aktuellen Verzeichnis" 793 | echo -e " --patch\tpatcht die 'wetterstation.conf' auf eine neue Version" 794 | echo -e " --service\trichtet WLAN-Wetterstation als Service ein" 795 | echo -e " -h | --help\tdieses Hilfemenue\n" 796 | } 797 | 798 | menu() { 799 | clear 800 | echo -e "$WE\n\n\n" 801 | echo -e "\t Auswahlmenü für WLAN-Wetterstation:" 802 | echo -e "\t_____________________________________\n\n" 803 | echo -e "\t [${BL}1${WE}] im aktuellen Verzeichnis installieren\n" 804 | echo -e "\t [${BL}2${WE}] als Service einrichten\n" 805 | echo -e "\t [${BL}3${WE}] Konfigurationsdatei patchen\n" 806 | echo -e "\t [${BL}4${WE}] Update ausführen\n\n" 807 | echo -e "\t [${BL}E${WE}] Exit\n\n\n" 808 | echo -en "\t Ihre Auswahl: [${GR}1-4,E${WE}]" 809 | 810 | read -n 1 -p ": " MENU_AUSWAHL 811 | echo -e "\n" 812 | case $MENU_AUSWAHL in 813 | 1) source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --install 814 | exit 0 ;; 815 | 2) source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --service 816 | exit 0 ;; 817 | 3) source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --patch 818 | exit 0 ;; 819 | 4) source <(curl -s https://raw.githubusercontent.com/SBorg2014/WLAN-Wetterstation/master/ws_updater.sh) --gitup 820 | exit 0 ;; 821 | e|E) exit 0 ;; 822 | *) menu 823 | esac 824 | } 825 | 826 | make_objects(){ 827 | #1: ID 828 | #2: name 829 | #3: type 830 | #4: unit 831 | 832 | echo -e "\n ${WE}Lege neues Object im ioBroker an: $BL${PRE_DP}$1$WE" 833 | local TOKEN=$(echo -n ${RESTAPI_USER}:${RESTAPI_PW} | base64) 834 | 835 | #build Data-String 836 | local DATA=$(cat <<-EOD 837 | { 838 | "_id": "${PRE_DP}$1", 839 | "type": "state", 840 | "common": { 841 | "name": "$2", 842 | "type": "$3", 843 | "role": "state" 844 | }, 845 | "native": { 846 | "name": "$2", 847 | "type": "$3", 848 | "role": "state" 849 | } 850 | } 851 | EOD 852 | ) 853 | 854 | #Check 4 Units 855 | if [ "$4" != "" ]; then DATA=$(echo $DATA | sed "s|\"role\": \"state\"|\"role\": \"state\", \"unit\": \"$4\"|g"); fi 856 | 857 | local RESULT=$(curl -skX 'POST' \ 858 | ${RESTAPI_URL}'/v1/object/'${PRE_DP}${1} \ 859 | -H 'accept: application/json' \ 860 | -H 'authorization: Basic '${TOKEN} \ 861 | -H 'Content-Type: application/json' \ 862 | --data "$DATA" 863 | ) 864 | 865 | #Fehler beim anlegen? 866 | if [[ $RESULT == *"error"* ]]; then local FEHLER_ioB=$(echo ${RESULT} | jq -r '.error') 867 | echo -e "${RE} Fehlermeldung beim Anlegen des Datenpunktes: ${FEHLER_ioB}${WE}\n" 868 | fi 869 | if [ "$RESULT" == "" ]; then echo -e "${RE} Keine Antwort der Rest-API erhalten! Stimmt das Protokoll (http/https), IP-Adresse und der Port?${WE}\n"; fi 870 | 871 | } 872 | 873 | 874 | #gibt es Parameter? 875 | while [ "$1" != "" ]; do 876 | case $1 in 877 | --install ) checker 878 | install 879 | exit 0 880 | ;; 881 | --menu ) menu 882 | exit 0 883 | ;; 884 | --service ) service 885 | exit 0 886 | ;; 887 | --gitup ) checker 888 | main 889 | exit 0 890 | ;; 891 | --patch ) checker 892 | patcher 893 | exit 0 894 | ;; 895 | -h | --help ) usage 896 | exit 0 897 | ;; 898 | * ) echo -e "\n${RE}\"$1\"${WE} wird nicht unterstützt...\n\n" 899 | usage 900 | exit 1 901 | esac 902 | shift 903 | done 904 | 905 | 906 | 907 | checker 908 | main 909 | 910 | --------------------------------------------------------------------------------