#!/usr/bin/env python3 # -*- coding: utf-8 -*- """全局配置。敏感项从同目录 .env 读取,真实环境变量(如 cron 注入)优先。""" import os BASE_DIR = os.path.dirname(os.path.abspath(__file__)) def _load_dotenv(path): """极简零依赖 .env 加载器:把 KEY=VALUE 写入 os.environ。 已存在的真实环境变量优先(不覆盖),故 cron/命令行注入仍可压过 .env。 支持 # 注释、空行、行内 KEY=VALUE,值两侧成对的单/双引号会被去掉。""" try: with open(path, "r", encoding="utf-8") as fp: for raw in fp: line = raw.strip() if not line or line.startswith("#") or "=" not in line: continue key, _, val = line.partition("=") key, val = key.strip(), val.strip() if len(val) >= 2 and val[0] == val[-1] and val[0] in "\"'": val = val[1:-1] if key: os.environ.setdefault(key, val) except FileNotFoundError: pass _load_dotenv(os.path.join(BASE_DIR, ".env")) # ---- Zectrix 极趣云平台 API ---- API_BASE = "https://cloud.zectrix.com/open/v1" API_KEY = os.environ.get("ZECTRIX_API_KEY", "") # 目标设备 ID(硬件 MAC)。必填——直接据此调推送接口,不再获取设备列表。 DEVICE_ID = os.environ.get("ZECTRIX_DEVICE_ID", "") # 推送参数 PAGE_ID = "1" # 持久化页面编号 1-5 DITHER = False # 纯黑白点阵图用硬阈值最锐利;设备无真灰阶,勿开抖动 # ---- 画布 ---- WIDTH, HEIGHT = 400, 300 # ---- 资源路径 ---- FONT_PATH = os.path.join(BASE_DIR, "fonts", "fusion-pixel-12px-proportional-zh_hans.otf") OUTPUT_DIR = os.path.join(BASE_DIR, "output") OUTPUT_PATH = os.path.join(OUTPUT_DIR, "dashboard.png") # ---- 橘喵 jm-devops 后端(今日经营 / 近30天趋势 数据源)---- # 鉴权方式:设备密钥授权(grant_type=client_secret,免验证码)。 # 用 CLIENT_ID + CLIENT_SECRET 调 /auth/login 换 token,再带 Bearer 调统计接口(详见 jm_api.py)。 # CLIENT_SECRET 等价于长期凭证,务必走 HTTPS、优先用环境变量覆盖、可在后端 sys_client 轮换。 BASE_API = os.environ.get("JM_BASE_API", "https://admin.jumiaotandian.com/prod-api") CLIENT_ID = os.environ.get("JM_CLIENT_ID", "") CLIENT_SECRET = os.environ.get("JM_CLIENT_SECRET", "") GRANT_TYPE = os.environ.get("JM_GRANT_TYPE", "client_secret") TENANT_ID = os.environ.get("JM_TENANT_ID", "000000") # ---- 和风天气(QWeather)数据源 ---- # 专属 API Host 与 Key 在 https://console.qweather.com/setting 查看,须用环境变量配置; # 未配置时天气区显示占位 "--",不影响其余渲染与推送。 QWEATHER_HOST = os.environ.get("QWEATHER_HOST", "") # 用户专属 API Host QWEATHER_KEY = os.environ.get("QWEATHER_KEY", "") # 定位固定为南京·秦淮区。和风经纬度格式为「经度,纬度」 WEATHER_LOCATION = os.environ.get("WEATHER_LOCATION", "118.788,32.014") WEATHER_LOC_NAME = "南京·秦淮" # 天气缓存:业务数据每分钟刷新,但天气 15 分钟才重新拉一次(cron 每次独立进程,缓存须落盘)。 WEATHER_TTL = int(os.environ.get("WEATHER_TTL", "900")) # 秒,默认 900=15 分钟 WEATHER_CACHE_PATH = os.path.join(BASE_DIR, ".weather_cache.json") # 近30天趋势缓存:recent-days 每天只更新一次,按日期为 key 缓存,当天命中即不再请求。 TREND_CACHE_PATH = os.path.join(BASE_DIR, ".trend_cache.json")