Organizes 11 projects for Cerbo GX/Venus OS into a single repository: - axiom-nmea: Raymarine LightHouse protocol decoder - dbus-generator-ramp: Generator current ramp controller - dbus-lightning: Blitzortung lightning monitor - dbus-meteoblue-forecast: Meteoblue weather forecast - dbus-no-foreign-land: noforeignland.com tracking - dbus-tides: Tide prediction from depth + harmonics - dbus-vrm-history: VRM cloud history proxy - dbus-windy-station: Windy.com weather upload - mfd-custom-app: MFD app deployment package - venus-html5-app: Custom Victron HTML5 app fork - watermaker: Watermaker PLC control UI Adds root README, .gitignore, project template, and per-project .gitignore files. Sensitive config files excluded via .gitignore with .example templates provided. Made-with: Cursor
132 lines
3.8 KiB
Python
Executable File
132 lines
3.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Venus OS D-Bus service template.
|
|
|
|
To create a new service:
|
|
1. Copy the _template/ directory and rename it to dbus-<your-service-name>/
|
|
2. Rename this file to match your service (e.g. your_service.py)
|
|
3. Update config.py with your service name, product ID, etc.
|
|
4. Update service/run to point to your renamed script
|
|
5. Update install.sh with your service name
|
|
6. Update build-package.sh with your file list
|
|
"""
|
|
|
|
import logging
|
|
import os
|
|
import signal
|
|
import sys
|
|
import time
|
|
|
|
sys.path.insert(1, os.path.join(os.path.dirname(__file__), 'ext', 'velib_python'))
|
|
|
|
from vedbus import VeDbusService # noqa: E402
|
|
from settingsdevice import SettingsDevice # noqa: E402
|
|
import dbus # noqa: E402
|
|
from gi.repository import GLib # noqa: E402
|
|
|
|
from config import ( # noqa: E402
|
|
SERVICE_NAME,
|
|
DEVICE_INSTANCE,
|
|
PRODUCT_NAME,
|
|
PRODUCT_ID,
|
|
FIRMWARE_VERSION,
|
|
CONNECTED,
|
|
MAIN_LOOP_INTERVAL_MS,
|
|
LOG_LEVEL,
|
|
VERSION,
|
|
)
|
|
|
|
logger = logging.getLogger('dbus-template')
|
|
|
|
|
|
class TemplateService:
|
|
"""Main service class. Rename to match your service."""
|
|
|
|
def __init__(self):
|
|
self._running = False
|
|
self._dbusservice = None
|
|
self._settings = None
|
|
|
|
def start(self):
|
|
"""Initialize D-Bus service and start the main loop."""
|
|
bus = dbus.SystemBus()
|
|
|
|
self._dbusservice = VeDbusService(
|
|
SERVICE_NAME, bus=bus, register=False
|
|
)
|
|
|
|
# Mandatory D-Bus paths
|
|
self._dbusservice.add_path('/Mgmt/ProcessName', __file__)
|
|
self._dbusservice.add_path('/Mgmt/ProcessVersion', VERSION)
|
|
self._dbusservice.add_path('/Mgmt/Connection', 'local')
|
|
self._dbusservice.add_path('/DeviceInstance', DEVICE_INSTANCE)
|
|
self._dbusservice.add_path('/ProductId', PRODUCT_ID)
|
|
self._dbusservice.add_path('/ProductName', PRODUCT_NAME)
|
|
self._dbusservice.add_path('/FirmwareVersion', FIRMWARE_VERSION)
|
|
self._dbusservice.add_path('/Connected', CONNECTED)
|
|
|
|
# --- Add your custom D-Bus paths here ---
|
|
# self._dbusservice.add_path('/YourPath', initial_value)
|
|
|
|
# Settings (stored in Venus OS localsettings, persist across reboots)
|
|
settings_path = '/Settings/Template'
|
|
supported_settings = {
|
|
'enabled': [settings_path + '/Enabled', 1, 0, 1],
|
|
# 'your_setting': [settings_path + '/YourSetting', default, min, max],
|
|
}
|
|
self._settings = SettingsDevice(
|
|
bus, supported_settings, self._on_setting_changed
|
|
)
|
|
|
|
self._dbusservice.register()
|
|
logger.info('Service registered on D-Bus as %s', SERVICE_NAME)
|
|
|
|
self._running = True
|
|
GLib.timeout_add(MAIN_LOOP_INTERVAL_MS, self._update)
|
|
|
|
def _update(self):
|
|
"""Called every MAIN_LOOP_INTERVAL_MS. Return True to keep running."""
|
|
if not self._running:
|
|
return False
|
|
|
|
# --- Add your main loop logic here ---
|
|
|
|
return True
|
|
|
|
def _on_setting_changed(self, setting, old, new):
|
|
"""Called when a Venus OS setting changes."""
|
|
logger.info('Setting %s changed: %s -> %s', setting, old, new)
|
|
|
|
def stop(self):
|
|
"""Clean shutdown."""
|
|
self._running = False
|
|
logger.info('Service stopped')
|
|
|
|
|
|
def main():
|
|
logging.basicConfig(
|
|
level=getattr(logging, LOG_LEVEL, logging.INFO),
|
|
format='%(asctime)s %(name)s %(levelname)s %(message)s',
|
|
datefmt='%Y-%m-%d %H:%M:%S',
|
|
)
|
|
logger.info('Starting dbus-template v%s', VERSION)
|
|
|
|
service = TemplateService()
|
|
|
|
def shutdown(signum, frame):
|
|
logger.info('Received signal %d, shutting down...', signum)
|
|
service.stop()
|
|
sys.exit(0)
|
|
|
|
signal.signal(signal.SIGTERM, shutdown)
|
|
signal.signal(signal.SIGINT, shutdown)
|
|
|
|
service.start()
|
|
|
|
mainloop = GLib.MainLoop()
|
|
mainloop.run()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|