Weewx to Mastodon/ActivityPub?

357 views
Skip to first unread message

Chris Alemany

unread,
Dec 15, 2022, 9:24:49 AM12/15/22
to weewx...@googlegroups.com
Hi all,

Has anyone had a go at having weewx post to Mastodon/Fediverse, either to an existing @user@server or as an independent instance?

There is at least one fellow who has written some Python to do it from his cumulus based system. I will share his GitHub project if someone thinks they can do it.

Cheers
Chris

Sent from my iPhone

Chris Alemany

unread,
Dec 18, 2022, 6:40:31 PM12/18/22
to weewx...@googlegroups.com
Here is the promised link to the fellow who created a Python script from cumulus on Mac to Mastodon/ActivityPubhttps://github.com/buffaloseven/CumulusMX-Customizations/tree/main/integrations

Sent from my iPhone

On Dec 15, 2022, at 6:24 AM, Chris Alemany <chri...@gmail.com> wrote:

Hi all,

Chris Alemany

unread,
Dec 20, 2022, 4:58:34 PM12/20/22
to weewx-user
The snowy weather here on Vancouver Island has given me some unexpected time to work on this.  I now have a working template file and python script that will produce and post weewx data to a Mastodon account.
Just setup an account on your favourite Mastodon server, 
mark it as a bot, 
create an API/Client Key (under development in your account's preferences)
install the template file to one of your skins (I just added it to the Standard skin.
put the python file somewhere it can be run with cron
run the python file with a command like this:

sudo python3  weewx_to_mastodon.py --server https://mstdn.ca --wxdata https://mywebpage.com/mastodon.json --api_key biglongstring234fssdf

I've attached my working files if anyone is itching to have it, excuse the messy code but it should be fairly self explanatory. You should only really need to modify the values in the json.tmpl file.


weewx_to_mastodon.py
mastodon.json.tmpl

Glenn McKechnie

unread,
Dec 21, 2022, 2:45:51 AM12/21/22
to weewx...@googlegroups.com
Hi Chris,

Nothing like finding a day where you can plunge, guilt free, into the
ToDo list. I didn't have a Snow day, but I borrowed yours!

I started re-purposing Matthew Walls twitter extension (which runs
uses RestX - [StdRESTful] ) and have had good success with it in the
half day or so that it's been runnng. Still some work to do on it
(phttt) but the text part works well enough.

Your use of the template is interesting - that gives it a bit of flexibility.

I'll mull that one over while I continue down the media (image) path.

Alpha is at ...
https://github.com/glennmckechnie/weewx-mastodon
> --
> You received this message because you are subscribed to the Google Groups
> "weewx-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to weewx-user+...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/weewx-user/aa08bcaa-6e19-4e39-b0bc-16093034a910n%40googlegroups.com.
>


--


Cheers
Glenn

rorpi - read only raspberry pi & various weewx addons
https://github.com/glennmckechnie

Mark Fraser

unread,
Dec 21, 2022, 9:16:34 AM12/21/22
to weewx...@googlegroups.com
I've been posting to Mastodon for a while now and I've done it a bit
differently.

In skin.conf of what ever skin you are using (Seasons for me) I added:
[[MastodonHourly]]
encoding = strict_ascii
template = mastodon.out.tmpl

mastodon.out.tmpl contains:
Temp: $current.outTemp Humidity: $current.outHumidity\nPressure:
$current.barometer\nWind: $current.windDir.ordinal_compass,
$current.windSpeed (ave), $current.windGust (gust)\nRain Rate:
$current.rainRate Rain Total: $day.rain.sum\nSolar Radiation:
$current.radiation UV: $current.UV\nSoil Moisture: $current.soilMoist1

Lastly I have this python script run hourly from a Crontab using
Mastodon.py and I can upload an image from my webcam at the same time:

#!/usr/bin/env python3
from mastodon import Mastodon
from datetime import datetime

# Set up Mastodon
mastodon = Mastodon(
access_token = '',
api_base_url = ''
)

photo_path = '/var/www/html/webcam.jpg'
now = datetime.now()
spoiler = 'Live weather for #Yeovil at ' + now.strftime('%d/%m/%y %H.00')

f = open('/var/www/html/weewx/mastodon.out','r')
media = mastodon.media_post(photo_path)
content = f.read()
tweet = content.replace("\\n","\n")
mastodon.status_post(tweet, media_ids=media, spoiler_text=spoiler)
f.close()

DaveStLou

unread,
Dec 21, 2022, 9:35:07 AM12/21/22
to weewx-user
Very interesting. Temporarily I've been duplicating my Twitter posts to Mastodon using IFTTT but plan to make the change to native support.
Would you mind posting a link to your Mastodon profile so we can see the results?

Mark Fraser

unread,
Dec 21, 2022, 9:50:35 AM12/21/22
to weewx...@googlegroups.com

Ian Millard

unread,
Dec 21, 2022, 10:10:09 AM12/21/22
to weewx...@googlegroups.com
Intrigued that webcam pictures of Somerset skies above Yeovil are deemed to be “Sensitive content” :-)

Sent from my iPad.

> On 21 Dec 2022, at 14:50, Mark Fraser <mfr...@gmail.com> wrote:
> --
> You received this message because you are subscribed to the Google Groups "weewx-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+...@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/msgid/weewx-user/d63a23e7-7c8c-95b7-6359-e1715f1719a4%40gmail.com.

Chris Alemany

unread,
Dec 21, 2022, 12:08:45 PM12/21/22
to weewx...@googlegroups.com
Oh! Elegant solution.

My “bot” is at @Alberniw...@mstdn.ca
Note, the instance has been extremely busy lately so don’t be surprised if the connection times out.

Cheers
Chris

-- 
You received this message because you are subscribed to the Google Groups "weewx-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to weewx-user+...@googlegroups.com.

Glenn McKechnie

unread,
Dec 27, 2022, 7:48:51 AM12/27/22
to weewx...@googlegroups.com
Okay,

https://github.com/glennmckechnie/weewx-mastodon

The rough edges have been filed smooth. You shouldn't need to wear
gloves anymore!

To see it in action...
https://mastodon.au/@BroomfieldWeatherBot



On 22/12/2022, Chris Alemany <chri...@gmail.com> wrote:
> Oh! Elegant solution.
>
> My “bot” is at @Alberniw...@mstdn.ca
> http://mstdn.ca/@alberniweatherBot
>> <mailto:weewx-user+...@googlegroups.com>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/weewx-user/f10a6d44-4c5a-dcd7-0104-46db15126088%40gmail.com.
>
> --
> You received this message because you are subscribed to the Google Groups
> "weewx-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to weewx-user+...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/weewx-user/1A47A3FC-A12C-4094-8955-79215048B871%40gmail.com.

Chris Alemany

unread,
Dec 27, 2022, 11:19:00 AM12/27/22
to weewx...@googlegroups.com

Jarmo Seppänen

unread,
May 5, 2023, 4:00:27 AM5/5/23
to weewx-user
After installation I'm getting the following error to logs:
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__: Caught unrecoverable exception:
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****  'unit_system'
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****  Traceback (most recent call last):
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****    File "/home/weewx/bin/weewxd", line 148, in main
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****      engine = weewx.engine.StdEngine(config_dict)
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 93, in __init__
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****      self.loadServices(config_dict)
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****    File "/home/weewx/bin/weewx/engine.py", line 161, in loadServices
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****      obj = weeutil.weeutil.get_object(svc)(self, config_dict)
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****    File "/home/weewx/bin/user/wxtoot.py", line 290, in __init__
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****      usn = config_dict['StdReport']['Defaults']['unit_system']
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****    File "/usr/lib/python3/dist-packages/configobj.py", line 554, in __getitem__
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****      val = dict.__getitem__(self, key)
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****  KeyError: 'unit_system'
May  5 10:57:35 raspi3b weewx[19058] CRITICAL __main__:     ****  Exiting.

Any hints?

Also the parameter: server_url_mastodon = 'replace_me' confuses me. What is this exactly?

Glenn McKechnie

unread,
May 5, 2023, 5:37:39 AM5/5/23
to weewx...@googlegroups.com
It's looking for the unit_system section in your weewx.conf file.
In the default weewx.conf for Weewx 4.10.2 it appears as follows...
[StdReport]
[...]
[[Defaults]]
[...]
unit_system = us

Do you have an entry for unit_system in your weewx.conf file?
If it's missing, then put one in and see if that fixes that hiccup
(and I'll rethink if that's the best place to discover the
unit_system, or what to do if it goes missing)

Which leads to...
What version of weewx are you running,
What's the version of wxtoot.py (at line 177)
Have you edited the weewx.conf file and removed that entry?

> Also the parameter: server_url_mastodon = 'replace_me' confuses me. What is
> this exactly?

See the README, but to recap, it is as follows.

You are going to post to a Mastodon server. It lives somewhere and has
an address.
So, which one? What is its address? URL, IP?

That information replaces the place-holder 'replace_me' within your
weewx.conf file, as follows.

[StdRESTful]
[...]
[Mastodon]
[...]
server_url_mastodon = 'replace_me'

You will also need a 'key_access_token' which you can only get by
following the instructions on that server. It's available from your
account there.

Review the README.md , in particular the last section, after 'Options'

https://github.com/glennmckechnie/weewx-mastodon

If you are still having problems then attach the log and a sanitised
(password free) copy of weewx.conf to your next post, or send it
directly to me.

Jarmo Seppänen

unread,
May 7, 2023, 5:17:16 AM5/7/23
to weewx-user
Thank you Glen for the hints.
I got it working.
When I added unit_system = METRICWX to StdReport the error disappeared.
Perhaps the best place for it would be in
[StdRESTful]
[[Mastodon]]
...
unit_system = US, METRIC, METRICWX
if that is possible as that way one could configure it for Mastodon only.

The server part was actually the mastodon server URL that I signed in to i.e. 'mas.to' in my case. The confusion I had was because I thought I can find the server info from the same place where key_access_token can be retrieved and I thought it's something funny like dev.mastodon.com or similar where the API would reside.

Oh, one thing I discovered when trying to report the UV readings.
I got an error:
weewx[30835] CRITICAL weewx.restx: Mastodon: Thread terminating. Reason: can only concatenate str (not "NoneType") to str
After digging around I noticed that in file
/home/weewx/bin/user/wxtoot.py in line 481
'uv_index': 'None', was causing the issue.
I changed it to:
'uv_index': '',
As I'm a lousy developer I don't know if this breaks something else but at least "it works for me" :)
Perhaps you can take a look at that too for the coming releases.

But thanks again for instructions you provided and creating this addon. It's an excellent replacement for Twitter.

jaMO

Glenn McKechnie

unread,
May 7, 2023, 6:50:50 AM5/7/23
to weewx...@googlegroups.com
On 07/05/2023, Jarmo Seppänen <jarmo.t....@gmail.com> wrote:
> Thank you Glen for the hints.
> I got it working.
> When I added unit_system = METRICWX to StdReport the error disappeared.
> Perhaps the best place for it would be in
> [StdRESTful]
> [[Mastodon]]
> ...
> unit_system = US, METRIC, METRICWX
> if that is possible as that way one could configure it for Mastodon only.

Yep. Sounds like a good fallback solution.
I'll still keep the original as it should be there in a standard
install , and it still exists in that location with Weewx v5; but I
will set that location as a 'report specific' option - which it
probably should have anyway.

[...]

> Oh, one thing I discovered when trying to report the UV readings.
> I got an error:
> weewx[30835] CRITICAL weewx.restx: Mastodon: Thread terminating. Reason:
> can only concatenate str (not "NoneType") to str
> After digging around I noticed that in file
> /home/weewx/bin/user/wxtoot.py in line 481
> 'uv_index': 'None', was causing the issue.
> I changed it to:
> 'uv_index': '',

You are correct. There is no unit for UV so '"" covers it.

> As I'm a lousy developer I don't know if this breaks something else but at
> least "it works for me" :)

It is the fix, and consider yourself a value adding bug reporter. :)
That feedback is always appreciated.

> Perhaps you can take a look at that too for the coming releases.

Indeed I will.
Reply all
Reply to author
Forward
0 new messages