aboutsummaryrefslogtreecommitdiffstats
path: root/internal/weather/config.go
blob: 6450da4fc5f3e32a443870ce3e4c8a75f3443b12 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package weather

import (
	"time"
)

// PublisherConfig configuration for the publisher
type PublisherConfig struct {
	// FMI API
	FMIEndpoint string `env:"FMI_ENDPOINT"`

	// Observation
	StationID     int           `env:"STATION_ID"`
	ObsPollEvery  time.Duration `env:"OBS_POLL_EVERY"`
	ObsSafetyLag  time.Duration `env:"OBS_SAFETY_LAG"`
	ObsTimestep   int           `env:"OBS_TIMESTEP"`
	WatermarkFile string        `env:"WATERMARK_FILE"`

	// Forecast
	FcPollEvery time.Duration `env:"FC_POLL_EVERY"`
	HelLat      float64       `env:"HEL_LAT"`
	HelLon      float64       `env:"HEL_LON"`

	// MQTT
	MQTTBroker     string        `env:"MQTT_BROKER"`
	MQTTClientID   string        `env:"MQTT_CLIENT_ID"`
	MQTTUsername   string        `env:"MQTT_USERNAME"`
	MQTTPassword   string        `env:"MQTT_PASSWORD"`
	MQTTKeepAlive  time.Duration `env:"MQTT_KEEP_ALIVE"`
	MQTTSessionExp time.Duration `env:"MQTT_SESSION_EXP"`

	// Application
	LogLevel    string        `env:"LOG_LEVEL"`
	HTTPTimeout time.Duration `env:"HTTP_TIMEOUT"`
}

// SubscriberConfig configuration for the subscriber
type SubscriberConfig struct {
	// MQTT Configuration
	MQTTBroker     string        `env:"MQTT_BROKER"`
	MQTTClientID   string        `env:"MQTT_CLIENT_ID"`
	MQTTUsername   string        `env:"MQTT_USERNAME"`
	MQTTPassword   string        `env:"MQTT_PASSWORD"`
	MQTTKeepAlive  time.Duration `env:"MQTT_KEEP_ALIVE"`
	MQTTSessionExp time.Duration `env:"MQTT_SESSION_EXP"`

	// Subscription Configuration
	Topics []string `env:"SUBSCRIBE_TOPICS"`
	QoS    int      `env:"SUBSCRIBE_QOS"`

	// Application
	LogLevel    string `env:"LOG_LEVEL"`
	EnableDebug bool   `env:"ENABLE_DEBUG"`
}

// LoadPublisherConfig loads publisher configuration from environment
func LoadPublisherConfig() *PublisherConfig {
	cfg := &PublisherConfig{
		FMIEndpoint:    GetEnv("FMI_ENDPOINT", "https://opendata.fmi.fi/wfs"),
		StationID:      ParseInt(GetEnv("STATION_ID", "100968")),
		ObsPollEvery:   ParseDuration(GetEnv("OBS_POLL_EVERY", "5m")),
		ObsSafetyLag:   ParseDuration(GetEnv("OBS_SAFETY_LAG", "2m")),
		ObsTimestep:    ParseInt(GetEnv("OBS_TIMESTEP", "60")),
		WatermarkFile:  GetEnv("WATERMARK_FILE", "obs_watermark.txt"),
		FcPollEvery:    ParseDuration(GetEnv("FC_POLL_EVERY", "1h")),
		HelLat:         ParseFloat(GetEnv("HEL_LAT", "60.1699")),
		HelLon:         ParseFloat(GetEnv("HEL_LON", "24.9384")),
		MQTTBroker:     GetEnv("MQTT_BROKER", "tcp://localhost:1883"),
		MQTTClientID:   GetEnv("MQTT_CLIENT_ID", "fmi-publisher"),
		MQTTUsername:   GetEnv("MQTT_USERNAME", ""),
		MQTTPassword:   GetEnv("MQTT_PASSWORD", ""),
		MQTTKeepAlive:  ParseDuration(GetEnv("MQTT_KEEP_ALIVE", "60s")),
		MQTTSessionExp: ParseDuration(GetEnv("MQTT_SESSION_EXP", "1h")),
		LogLevel:       GetEnv("LOG_LEVEL", "info"),
		HTTPTimeout:    ParseDuration(GetEnv("HTTP_TIMEOUT", "30s")),
	}

	return cfg
}

// LoadSubscriberConfig loads subscriber configuration from environment
func LoadSubscriberConfig() *SubscriberConfig {
	qos := ParseInt(GetEnv("SUBSCRIBE_QOS", "1"))
	if qos < 0 || qos > 2 {
		qos = 1
	}

	cfg := &SubscriberConfig{
		MQTTBroker:     GetEnv("MQTT_BROKER", "tcp://localhost:1883"),
		MQTTClientID:   GetEnv("MQTT_CLIENT_ID", "fmi-subscriber"),
		MQTTUsername:   GetEnv("MQTT_USERNAME", ""),
		MQTTPassword:   GetEnv("MQTT_PASSWORD", ""),
		MQTTKeepAlive:  ParseDuration(GetEnv("MQTT_KEEP_ALIVE", "60s")),
		MQTTSessionExp: ParseDuration(GetEnv("MQTT_SESSION_EXP", "1h")),
		Topics:         ParseTopics(GetEnv("SUBSCRIBE_TOPICS", "")),
		QoS:            qos,
		LogLevel:       GetEnv("LOG_LEVEL", "info"),
		EnableDebug:    GetEnv("ENABLE_DEBUG", "false") == "true",
	}

	return cfg
}