From 61f93bcc111e417948c58a485bf319abb91ced56 Mon Sep 17 00:00:00 2001 From: Maaike Date: Wed, 16 Oct 2024 09:47:36 +0200 Subject: [PATCH] various fixes (#119) * remove reference to username.wis2.training * use return instead of exit in setup_student_vm.sh * make GDC exercise wording more generic, don't use local IP used in Fiji * add explicit login and exit commands to avoid confusion * updated wording regarding required stations update --- .../assets/img/edit-stations-add-topics.png | Bin 0 -> 38094 bytes .../automating-data-ingestion.en.md | 4 +- .../datasets-with-access-control.md | 47 +++++++++++------- .../discovering-datasets-from-wis2-gdc.md | 11 ++-- .../downloading-data-from-wis2.en.md | 20 +++++++- .../initializing-wis2box.en.md | 2 +- .../README.md | 32 ++++++------ .../subscribe_and_republish.py | 10 +--- .../wis2nodes.json | 29 +++++++++++ environment/fake-global-broker/README.md | 15 ------ .../fake-global-services/wis2nodes.json | 6 --- environment/setup_student_vm.sh | 8 +-- .../data-ingest-exercises/csv-aws-example.csv | 2 + 13 files changed, 110 insertions(+), 76 deletions(-) create mode 100644 documentation/docs/assets/img/edit-stations-add-topics.png rename environment/{fake-global-services => fake-global-broker-and-cache}/README.md (54%) rename environment/{fake-global-services => fake-global-broker-and-cache}/subscribe_and_republish.py (95%) create mode 100644 environment/fake-global-broker-and-cache/wis2nodes.json delete mode 100644 environment/fake-global-broker/README.md delete mode 100644 environment/fake-global-services/wis2nodes.json create mode 100644 exercise-materials/data-ingest-exercises/csv-aws-example.csv diff --git a/documentation/docs/assets/img/edit-stations-add-topics.png b/documentation/docs/assets/img/edit-stations-add-topics.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba4dd521b945cfa99bb0d236180d26fd7044eaa GIT binary patch literal 38094 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 ``` Login using the credentials defined in `wis2box-ftp.env` for the `FTP_USER` and `FTP_PASS` environment variables, and then create a directory and upload a file as follows: diff --git a/documentation/docs/practical-sessions/datasets-with-access-control.md b/documentation/docs/practical-sessions/datasets-with-access-control.md index cc13869b..8f53c4d2 100644 --- a/documentation/docs/practical-sessions/datasets-with-access-control.md +++ b/documentation/docs/practical-sessions/datasets-with-access-control.md @@ -24,7 +24,7 @@ Make sure you are connected to the MQTT broker of your wis2box instance using MQ Ensure you have a web browser open with the wis2box-webapp for your instance by going to `http:///wis2box-webapp`. -## create a new dataset with data policy 'recommended' +## Exercise 1: create a new dataset with data policy 'recommended' Go to the 'dataset editor' page in the wis2box-webapp and create a new dataset. Use the same centre-id as in the previous practical sessions and use the template='surface-weather-observations/synop'. @@ -36,20 +36,17 @@ Click 'OK' to proceed. In the dataset editor, set the data policy to 'recommended' (note that this will update the identifier and replace 'core' with 'reco') and fill all the required fields. -Ensure the dataset is published and the WIS2 Notification Message announcing the new Discovery Metadata record is published. +Submit the dataset and check that the new dataset is created in the wis2box-webapp. -Add the following stations to your "recommended" dataset to ensure the test data can be ingested and published: +Check MQTT-explorer to see that you receive the WIS2 Notification Message announcing the new Discovery Metadata record on the topic `origin/a/wis2//metadata`. -- 0-20000-0-60351 -- 0-20000-0-60355 -- 0-20000-0-60360 - -## add an access token to the dataset +## Exercise 2: add an access token to the dataset Login to the wis2box-management container, ```bash -docker exec -it wis2box-management bash +cd ~/wis2box-1.0b8 +python3 wis2box-ctl.py login ``` From command line inside the container you can secure a dataset using the `wis2box auth add-token` command, using the flag `-mdi` to specify the metadata-identifier of the dataset and the access token as an argument. @@ -57,10 +54,16 @@ From command line inside the container you can secure a dataset using the `wis2b For example, to add the access token `S3cr3tT0k3n` to the dataset with metadata-identifier `urn:wmo:md:not-my-centre:core.surface-based-observations.synop`: ```bash -wis2box auth add-token -mdi urn:wmo:md:not-my-centre:core.surface-based-observations.synop S3cr3tT0k3n +wis2box auth add-token -mdi urn:wmo:md:not-my-centre:reco.surface-based-observations.synop S3cr3tT0k3n +``` + +Exit the wis2box-management container: + +```bash +exit ``` -## publish some data to the dataset +## Exercise 3: publish some data to the dataset Copy the file `exercise-materials/access-control-exercises/aws-example2.csv` to the directory defined by `WIS2BOX_HOST_DATADIR` in your `wis2box.env`: @@ -68,7 +71,17 @@ Copy the file `exercise-materials/access-control-exercises/aws-example2.csv` to cp ~/exercise-materials/access-control-exercises/aws-example2.csv ~/wis2box-data ``` -Then login to the **wis2box-management** container: +Then use WinSCP or a command line editor to edit the file `aws-example2.csv` and update the WIGOS-station-identifiers in the input-data to match the stations you have in your wis2box instance. + +Next, go to the station-editor in the wis2box-webapp. For each station you used in `aws-example2.csv`, update the 'topic' field to match the 'topic' of the dataset you created in the previous exercise. + +This station will now be associated to 2 topics, one for the 'core' dataset and one for the 'recommended' dataset: + +edit-stations-add-topics + +You will need to use your token for `collections/stations` to save the updated station data. + +Next, login to the wis2box-management container: ```bash cd ~/wis2box-1.0b8 @@ -78,16 +91,16 @@ python3 wis2box-ctl.py login From the wis2box command line we can ingest the sample data file `aws-example2.csv` into a specific dataset as follows: ```bash -wis2box data ingest -p /data/wis2box/aws-example2.csv --metadata-id urn:wmo:md:not-my-centre:core.surface-based-observations.synop +wis2box data ingest -p /data/wis2box/aws-example2.csv --metadata-id urn:wmo:md:not-my-centre:reco.surface-based-observations.synop ``` -Make sure to provide the correct metadata-identifier for your dataset and check that you receive WIS2 data-notifications in MQTT Explorer. +Make sure to provide the correct metadata-identifier for your dataset and **check that you receive WIS2 data-notifications in MQTT Explorer**, on the topic `origin/a/wis2//data/recommended/surface-based-observations/synop`. Check the canonical link in the WIS2 Notification Message and copy/paste the link to the browser to try and download the data. You should see a 403 Forbidden error. -## add the access token to HTTP headers to access the dataset +## Exercise 5: add the access token to HTTP headers to access the dataset In order to demonstrate that the access token is required to access the dataset we will reproduce the error you saw in the browser using the command line function `wget`. @@ -107,10 +120,6 @@ wget --header="Authorization: Bearer S3cr3tT0k3n" Now the data should be downloaded successfully. -## clean up - -Delete the dataset using the dataset editor. - ## Conclusion !!! success "Congratulations!" diff --git a/documentation/docs/practical-sessions/discovering-datasets-from-wis2-gdc.md b/documentation/docs/practical-sessions/discovering-datasets-from-wis2-gdc.md index 1deb65cc..ae5f1f6c 100644 --- a/documentation/docs/practical-sessions/discovering-datasets-from-wis2-gdc.md +++ b/documentation/docs/practical-sessions/discovering-datasets-from-wis2-gdc.md @@ -8,7 +8,7 @@ title: Discovering datasets from the WIS2 Global Discovery Catalogue By the end of this practical session, you will be able to: - - use pywiscat to discover datasets from the Global Discovery Catalogue + - use pywiscat to discover datasets from the Global Discovery Catalogue (GDC) ## Introduction @@ -20,7 +20,8 @@ At the moment, the following GDCs are available: - China Meteorological Administration: - Deutscher Wetterdienst: -For this exercise, we will use the WIS2 GDC setup as part of the training, found at . + +During local training sessions, a local GDC is set up to allow participants to query the GDC for the metadata they published from their wis2box-instances. In this case the trainers will provide the URL to the local GDC. ## Preparation @@ -39,7 +40,7 @@ pip3 install pywiscat If you encounter the following error: ``` - WARNING: The script pywiscat is installed in '/home/tkralidis/.local/bin' which is not on PATH. + WARNING: The script pywiscat is installed in '/home/username/.local/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. ``` @@ -62,7 +63,7 @@ pywiscat --version By default, pywiscat connects to Canada's Global Discovery Catalogue. Let's configure pywiscat to query the training GDC by setting the `PYWISCAT_GDC_URL` environment variable: ```bash -export PYWISCAT_GDC_URL=http://192.168.7.153 +export PYWISCAT_GDC_URL=http:// ``` Let's use [pywiscat](https://github.com/wmo-im/pywiscat) to query the GDC setup as part of the training. @@ -82,7 +83,7 @@ pywiscat search How many records are returned from the search? ??? success "Click to reveal answer" - There should be over 40 records returned + The number of records depends on the GDC you are querying. When using the local training GDC, you should see that the number of records is equal to the number of datasets that have been ingested into the GDC during the other practical sessions. Let's try querying the GDC with a keyword: diff --git a/documentation/docs/practical-sessions/downloading-data-from-wis2.en.md b/documentation/docs/practical-sessions/downloading-data-from-wis2.en.md index ca0cfa60..dd10ac29 100644 --- a/documentation/docs/practical-sessions/downloading-data-from-wis2.en.md +++ b/documentation/docs/practical-sessions/downloading-data-from-wis2.en.md @@ -120,7 +120,11 @@ To add this subscription, use the following command: wis2downloader add-subscription --topic cache/a/wis2/de-dwd-gts-to-wis2/# ``` -Then exit the **wis2downloader** container by typing `exit`. +Then exit the **wis2downloader** container by typing `exit`: + +```bash +exit +``` Check the wis2downloader dashboard in Grafana to see the new subscription added. Wait a few minutes and you should see the first downloads starting. Go to he next exercise once you have confirmed that the downloads are starting. @@ -136,12 +140,24 @@ Note that the downloaded data is stored in directories named after the topic the ## Exercise 5: removing subscriptions from the wis2downloader -Next, log in to the wis2downloader container and remove the subscription you made from the wis2downloader, using the following command: +Next, log back in to the wis2downloader container: + +```bash +python3 wis2box-ctl.py login wis2downloader +``` + +and remove the subscription you made from the wis2downloader, using the following command: ```bash wis2downloader remove-subscription --topic cache/a/wis2/de-dwd-gts-to-wis2/# ``` +And exit the wis2downloader container by typing `exit`: + +```bash +exit +``` + Check the wis2downloader dashboard in Grafana to see the subscription removed. You should see the downloads stopping. ## Exercise 6: subscribe to the wis2training-broker and setup a new subscription diff --git a/documentation/docs/practical-sessions/initializing-wis2box.en.md b/documentation/docs/practical-sessions/initializing-wis2box.en.md index cf7a2762..72ae8258 100644 --- a/documentation/docs/practical-sessions/initializing-wis2box.en.md +++ b/documentation/docs/practical-sessions/initializing-wis2box.en.md @@ -69,7 +69,7 @@ The directory /home/username/wis2box-data has been created. Next, you will be asked to enter the URL for your wis2box. This is the URL that will be used to access the wis2box web application, API and UI. -Please use `http://` as the URL. Remember that your hostname is defined by your `username.wis2.training` +Please use `http://` as the URL. ```{.copy} Please enter the URL of the wis2box: diff --git a/environment/fake-global-services/README.md b/environment/fake-global-broker-and-cache/README.md similarity index 54% rename from environment/fake-global-services/README.md rename to environment/fake-global-broker-and-cache/README.md index 244412eb..a7e9be2e 100644 --- a/environment/fake-global-services/README.md +++ b/environment/fake-global-broker-and-cache/README.md @@ -1,24 +1,28 @@ +# fake-global-broker-and-cache + +To run a local MQTT broker and a local cache that can be used to simulate the global broker and cache in the WIS2 environment during WIS2 training sessions. + +# NOTE + +If you want to use a wis2box-instance to serve the purpose of the fake global cache and fake global broker, the following changes are required on the services included by the wis2box-stack: + +* Update acf.conf in the "mosquitto" container to allow the wis2box-user to publish on cache/a/wis2/# (restart the container after making changes) +* create the bucket "cache" in the "wis2box-minio" container and set the access policy to public + # Environment variables +Define these in a local ``.env`` file or in the environment of the VM. + * ``MINIO_HOST`` - MINIO host and port used to act as the fake global cache, e.g. ``instructor.wis2.training:9000`` -* ``MINIO_KEY`` - MINIO access key / user ID for writing to the fake cache, e.g. ``wis2box`` -* ``MINIO_SECRET`` - MINIO secret for writing to the fake cache -* ``GC_URL`` - Base URL used to access files on the fake cache, e.g. ``http://instructor.wis2.training`` +* ``MINIO_KEY`` - MINIO access key / user ID for writing to the fake cache, e.g. ``wis2box`` when using wis2box +* ``MINIO_SECRET`` - MINIO secret for writing to the fake cache, corresponds to WIS2BOX_STORAGE_PASSWORD when using wis2box +* ``GC_URL`` - Base URL used to access files on the fake cache, e.g. ``http://instructor.wis2.training:9000`` * ``GB_HOST`` - Host name of the MQTT broker to republish to, e.g. ``instructor.wis2.training`` -* ``GB_UID`` - User ID used for publishing, e.g. ``wis2box`` -* ``GB_PWD`` - Password used for publishing - -You can define these in a local ``.env`` file or in the environment of the VM. +* ``GB_UID`` - User ID used for publishing, e.g. ``wis2box`` when using wis2box +* ``GB_PWD`` - Password used for publishing, corresponds to WIS2BOX_BRIDGE_PASSWORD when using wis2box # Usage In the VM run: ``python subscribe_and_republish.py`` - -# NOTE - -If you want to use a wis2box-instance to serve the purpose of the fake global cache and fake global broker, the following changes are required on the services included by the wis2box-stack: - -* Update acf.conf in the "mosquitto" container to allow the wis2box-user to publish on cache/a/wis2/# (restart the container after making changes) -* create the bucket "cache" in the "wis2box-minio" container and set the access policy to public \ No newline at end of file diff --git a/environment/fake-global-services/subscribe_and_republish.py b/environment/fake-global-broker-and-cache/subscribe_and_republish.py similarity index 95% rename from environment/fake-global-services/subscribe_and_republish.py rename to environment/fake-global-broker-and-cache/subscribe_and_republish.py index 91466c1f..6012915a 100644 --- a/environment/fake-global-services/subscribe_and_republish.py +++ b/environment/fake-global-broker-and-cache/subscribe_and_republish.py @@ -52,12 +52,6 @@ def on_message(client, userdata, msg): else: print(f"Not republishing data with topic {msg.topic}") return - pub.single( - topic = msg.topic, - payload = json.dumps(payload), - hostname = GB_HOST, - auth={"username": GB_UID, "password": GB_PWD} - ) # if topic contains data/core or metadata, download to cache if 'data/core' in msg.topic: print("Downloading core data") @@ -88,7 +82,7 @@ def on_message(client, userdata, msg): print("Downloading") http = urllib3.PoolManager() response = http.request("GET", canonical) - # save to temporaray file + # save to tempory file temp = tempfile.NamedTemporaryFile(mode="w") print(f"Saving to {temp.name}") with open(temp.name, "wb") as fh: @@ -96,7 +90,7 @@ def on_message(client, userdata, msg): print("Data written, now putting to minio") # connect to MinIO try: - minio_client = Minio(MINIO_BUCKET, access_key=MINIO_KEY, + minio_client = Minio(MINIO_HOST, access_key=MINIO_KEY, secret_key=MINIO_SECRET, secure=False) except Exception as e: print("Error connecting to Minio") diff --git a/environment/fake-global-broker-and-cache/wis2nodes.json b/environment/fake-global-broker-and-cache/wis2nodes.json new file mode 100644 index 00000000..5a541204 --- /dev/null +++ b/environment/fake-global-broker-and-cache/wis2nodes.json @@ -0,0 +1,29 @@ +[ + {"host": "192.168.7.122", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.123", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.124", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.125", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.126", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.127", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.128", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.129", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.130", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.131", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.132", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.133", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.134", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.135", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.137", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.146", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.139", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.140", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.141", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.142", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.143", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.144", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.145", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.147", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.148", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.149", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, + {"host": "192.168.7.151", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"} +] \ No newline at end of file diff --git a/environment/fake-global-broker/README.md b/environment/fake-global-broker/README.md deleted file mode 100644 index 54f0fb77..00000000 --- a/environment/fake-global-broker/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Environment variables - -* ``MINIO_HOST`` - MINIO host and port used to act as the fake global cache, e.g. ``instructor.wis2.training:9000`` -* ``MINIO_KEY`` - MINIO access key / user ID for writing to the fake cache, e.g. ``wis2box`` -* ``MINIO_SECRET`` - MINIO secret for writing to the fake cache -* ``GC_URL`` - Base URL used to access files on the fake cache, e.g. ``http://instructor.wis2.training`` -* ``GB_HOST`` - Host name of the MQTT broker to republish to, e.g. ``instructor.wis2.training`` -* ``GB_UID`` - User ID used for publishing, e.g. ``wis2box`` -* ``GB_PWD`` - Password used for publishing - -# Usage - -In the VM run: - -``python subscribe_and_republish.py`` \ No newline at end of file diff --git a/environment/fake-global-services/wis2nodes.json b/environment/fake-global-services/wis2nodes.json deleted file mode 100644 index 7172a987..00000000 --- a/environment/fake-global-services/wis2nodes.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - {"host": "haddouch.wis2.training", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, - {"host": "mlimper.wis2.training", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, - {"host": "dberry.wis2.training", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"}, - {"host": "tkralidis.wis2.training", "port": 1883, "pwd": "everyone", "uid": "everyone", "protocol": "tcp"} -] \ No newline at end of file diff --git a/environment/setup_student_vm.sh b/environment/setup_student_vm.sh index 96853f62..8090f068 100644 --- a/environment/setup_student_vm.sh +++ b/environment/setup_student_vm.sh @@ -7,7 +7,7 @@ if [ $# -eq 0 ] then echo "No arguments supplied" echo "Usage: ./setup_student_vm.sh " - exit 1 + return 1 fi # first argument of the script is the username @@ -16,9 +16,9 @@ USERNAME=$1 HOST_IP=$2 echo "USERNAME=`echo $USERNAME`" -read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1 +read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || return 1 echo "HOST_IP=`echo $HOST_IP`" -read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || exit 1 +read -p "Continue? (Y/N): " confirm && [[ $confirm == [yY] || $confirm == [yY][eE][sS] ]] || return 1 # execute commands over ssh @@ -37,7 +37,7 @@ ssh -o StrictHostKeyChecking=no wmo_admin@`echo $HOST_IP` "sudo unzip -o /tmp/wi ssh -o StrictHostKeyChecking=no wmo_admin@`echo $HOST_IP` "rm -rf /tmp/wis2box-setup-1.0b8.zip" # copy the latest exercise materials to the student-vm -ssh -o StrictHostKeyChecking=no wmo_admin@`echo $HOST_IP` "wget https://training.wis2box.wis2dev.io/exercise-materials.zip -O /tmp/exercise-materials.zip" +ssh -o StrictHostKeyChecking=no wmo_admin@`echo $HOST_IP` "wget https://training.wis2box.wis.wmo.int/exercise-materials.zip -O /tmp/exercise-materials.zip" # unzip the exercise-materials.zip ssh -o StrictHostKeyChecking=no wmo_admin@`echo $HOST_IP` "sudo unzip -o /tmp/exercise-materials.zip -d /home/`echo $USERNAME`/" # remove the exercise-materials.zip diff --git a/exercise-materials/data-ingest-exercises/csv-aws-example.csv b/exercise-materials/data-ingest-exercises/csv-aws-example.csv new file mode 100644 index 00000000..5e81f3fa --- /dev/null +++ b/exercise-materials/data-ingest-exercises/csv-aws-example.csv @@ -0,0 +1,2 @@ +wsi_series,wsi_issuer,wsi_issue_number,wsi_local,wmo_block_number,wmo_station_number,station_type,year,month,day,hour,minute,latitude,longitude,station_height_above_msl,barometer_height_above_msl,station_pressure,msl_pressure,geopotential_height,thermometer_height,air_temperature,dewpoint_temperature,relative_humidity,method_of_ground_state_measurement,ground_state,method_of_snow_depth_measurement,snow_depth,precipitation_intensity,anemometer_height,time_period_of_wind,wind_direction,wind_speed,maximum_wind_gust_direction_10_minutes,maximum_wind_gust_speed_10_minutes,maximum_wind_gust_direction_1_hour,maximum_wind_gust_speed_1_hour,maximum_wind_gust_direction_3_hours,maximum_wind_gust_speed_3_hours,rain_sensor_height,total_precipitation_1_hour,total_precipitation_3_hours,total_precipitation_6_hours,total_precipitation_12_hours,total_precipitation_24_hours +0,20000,0,60355,15,15,1,2023,3,31,1,0,47.77706163,23.94046026,503,,100940,101040,1448,5,298.15,294.55,80,3,1,1,0,0.004,10,-10,30,3,30,5,40,9,20,11,2,4.7,5.3,7.9,9.5,11.4 \ No newline at end of file