Python service to consume Ambient Weather API data
Continuing from the last post (Handling data from Ambient Weather WS-2902C to MQTT), we have a working script that reads the data coming from the Ambient Weather WS-2902 base station (Ambient Weather API) and sends it to a MQTT broker. In this post, we will turn that script into a Linux service that starts at boot and runs forever. This type of thing is perfect for Linux. Non-server Windows versions aren’t really appropriate for this since they reboot often with updates and such. If you want to run Windows Server, more power to you, you probably don’t need this guide. We will thus be focusing on Linux for consuming the Ambient Weather API. A Raspberry Pi is a perfect device for this (plenty of power, as big as a credit card, and less than $100).Linux Services
Linux is made up of many individual components. Each component is designed to handle a single task (more or less). This differs from Windows where there are large executables/processes that handle many tasks. We will be taking advantage of Linux’s single task theory to add a new service that will run the Python script for ingesting and consuming the Ambient Weather API. In this instance for Austin’s Nerdy Things, the weather data is being provided by the Ambient Weather WS-2902C weather station.Creating the service
For Ubuntu/Debian based distributions, service files live under /etc/systemd/system. Here is a list of services on the container I’m utilizing. List command:ls -1 /etc/systemd/system
dbus-org.freedesktop.resolve1.service dbus-org.freedesktop.timesync1.service default.target.wants getty.target.wants graphical.target.wants multi-user.target.wants socket.target.wants sockets.target.wants sshd.service sys-kernel-debug.mount sysinit.target.wants syslog.service timers.target.wantsSince this is a LXC container, there aren’t many services. On a standard Raspbian or Ubuntu full install, there will be 100+. We will be creating a new service file using the nano text editor:
nano /etc/systemd/system/ambient-weather-api.serviceIn this file we need to define our service. The After lines mean don’t start this up until the listed services are running. The rest is pretty straight forward. I’m not 100% sure what the WantedBy line is for but it’s present in most of my service files. The contents of ambient-weather-api.service are as follows:
[Unit] Description=Python script to ingest Ambient Weather API data After=syslog.target After=network.target [Service] Type=simple User=root Group=root ExecStart=/usr/bin/python3 /srv/ambient-weather-api/main.py ExecStartPre=/bin/sleep 5 Restart=always RestartSec=5s # Give the script some time to startup TimeoutSec=10 [Install] WantedBy=multi-user.targetSave the file. The service definition is looking for Python at /usr/bin/python3 and the python script at /srv/ambient-weather-api/main.py. You will probably be fine with the Python executable, but be sure to mv or cp the main.py file to /srv/ambient-weather-api/main.py. We will need to reload the service definitions:
systemctl daemon-reloadNow we can start the service:
systemctl start ambient-weather-api.serviceAnd verify it is running:
systemctl status ambient-weather-api.service

#print(f"Sent {msg} to topic {topic}")
Disclosure: When you click on links to various merchants in this post and make a purchase, this can result in this site earning a commission. Affiliate programs and affiliations include, but are not limited to, the eBay Partner Network.
