my/go/l17.go
2026-07-12 14:16:22 +03:00

139 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"strconv"
"strings"
"time"
mqtt "github.com/eclipse/paho.mqtt.golang"
"github.com/joho/godotenv"
)
type OpenWeather struct {
City string `json:"name"`
Main struct {
Temp float64 `json:"temp"`
FeelLike float64 `json:"feels_like"`
} `json:"main"`
Weather []struct {
MainWeather string `json:"main"`
Description string `json:"description"`
} `json:"weather"`
Wind struct {
Speed float64 `json:"speed"`
} `json:"wind"`
}
func WeatherReq() (string, float64, string, float64, float64, string) {
err := godotenv.Load()
if err != nil {
log.Fatalf("upload your .env file %v\n", err)
}
api := os.Getenv("openweathermap")
if api == "" {
log.Fatalf("add your openweathermap api in .env file\n")
}
city := os.Getenv("city_openweather")
if city == "" {
log.Fatalf("add your city for openweathermap in .env file\n")
}
client := &http.Client{
Timeout: 20 * time.Second,
}
lin := "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&units=metric&appid=" + api + "&lang=ru"
url := strings.ReplaceAll(lin, " ", "%20")
req, err := http.NewRequest("GET", url, nil)
if err != nil {
log.Fatalf("%v\n", err)
}
resp, err := client.Do(req)
if err != nil {
log.Fatalf("%v\n", err)
}
if resp.StatusCode != 200 {
log.Fatalf("openweathermap return %d\n", resp.StatusCode)
}
defer resp.Body.Close()
var WeatherData OpenWeather
err = json.NewDecoder(resp.Body).Decode(&WeatherData)
if err != nil {
log.Fatalf("%v\n", err)
}
return WeatherData.City, WeatherData.Main.Temp, WeatherData.Weather[0].MainWeather, WeatherData.Wind.Speed, WeatherData.Main.FeelLike, WeatherData.Weather[0].Description
}
func Send(client mqtt.Client, topic string) {
city, temp, main, speed, feel, description := WeatherReq()
payload := fmt.Sprintf("Город: %s, Температура: %.2f°C, Ощущается %.2f°C\nПогода: %s, %s, Ветер %.2fm/s", city, temp, feel, main, description, speed)
token := client.Publish(topic, 2, false, payload)
token.Wait()
if err := token.Error(); err != nil {
log.Fatalf("%v\n", token.Error())
} else {
fmt.Println("Sent in", topic)
}
}
func main() {
opts := mqtt.NewClientOptions()
err := godotenv.Load()
if err != nil {
log.Fatalf("%v\n", err)
}
broker := os.Getenv("broker_mqtt")
if broker == "" {
log.Fatalf("add yout broker in .env file\n")
}
ClientID := os.Getenv("clientid_mqtt")
if ClientID == "" {
log.Fatalf("add your client id in .env file")
}
topic := os.Getenv("topic_mqtt")
if topic == "" {
log.Fatalf("add your topic in .env file")
}
username := os.Getenv("login_mqtt")
if username != "" {
opts.SetUsername(username)
}
password := os.Getenv("password_mqtt")
if password != "" {
opts.SetPassword(password)
}
TimeHour := os.Getenv("TimeHourSendMQTT")
opts.AddBroker(broker)
opts.SetClientID(ClientID)
opts.SetConnectTimeout(5 * time.Second)
client := mqtt.NewClient(opts)
if token := client.Connect(); token.Wait() && token.Error() != nil {
log.Fatalf("%v\n", token.Error())
}
defer client.Disconnect(250)
fmt.Println("Connect to a broker")
var ticker *time.Ticker
if TimeHour != "" {
ReallyTimeHour, err := strconv.Atoi(TimeHour)
if err != nil {
log.Fatalf("%s\n", err)
}
ticker = time.NewTicker(time.Duration(ReallyTimeHour) * time.Hour)
} else {
ticker = time.NewTicker(2 * time.Hour)
}
defer ticker.Stop()
Send(client, topic)
for range ticker.C {
Send(client, topic)
}
}