Enigma2Events

From JoBaPedia
Revision as of 01:04, 19 December 2023 by Joachim (talk | contribs) (→‎Enigma2 Events)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Enigma2 Events

the VTi images used by vu-uno and vuzero run scripts on the following events:

  • DBTASK_CANCEL
  • DBTASK_FINISH
  • DBTASK_START
  • E2START
  • GUI_REBOOT
  • PVRDESCRAMBLE_START
  • PVRDESCRAMBLE_STOP
  • REBOOT
  • RECORD_REMIND
  • RECORD_START
  • RECORD_STOP
  • RECORD_WAKEUP
  • SERVICE_START
  • SERVICE_STOP
  • SHUTDOWN
  • STANDBY_ENTER
  • STANDBY_LEAVE
  • STBBOOT
  • TASK_CANCEL
  • TASK_FINISH
  • TASK_START

I use them to switch the AV receiver on and off. At first a http request was sent to a tasmota switch. The commands for the different events are in /etc/enigma2/events. E.g. STANDBY_ENTER.sh:

#!/bin/sh

OUT=`wget -O- -q 'http://nous4/cm?cmnd=Power%20Off' 2>&1`
echo "${0##*/}: $OUT" > /dev/udp/192.168.1.4/514

exit 0

Now I use my mqtt-to-serial rx-v1600 gateway with my /etc/enigma2/events/rxv-toggle.py. It also switches the av input and handles fast stb toggling much better.

#!/usr/bin/python

# Send commands to switch RX-V1600 on or off
# Requires https://github.com/joba-1/Joba_RxV1600/tree/master/examples/Mqtt_RxV1600
# (c) Joachim Banzhaf, 2023

pid_file = '/var/run/rxv-toggle.pid'
cmd_topic = 'Mqtt_RxV1600/2/cmd'
syslog_server = 'job4'
mqtt_broker = 'job4'


# Register signal handlers for signals TERM and INT to allow atexit to do its job

import signal

def signal_exit(signum, frame):
  exit(0)

signal.signal(signal.SIGTERM, signal_exit)
signal.signal(signal.SIGINT, signal_exit)


# Kill earlier incarnation of us, if any

try:
  with open(pid_file, 'r') as f:
    pid = int(f.read())
    os.kill(pid, signal.SIGTERM)
except Exception:
  pass


# Register atexit handler to remove our pid file

import atexit
import os
import sys
import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger()
logger.addHandler(SysLogHandler(address=(syslog_server, 514)))
logger.setLevel(logging.INFO)

def atexit_cleanup():
  try:
    os.remove(pid_file)
  except OSError:
    pass
  finally:
    logger.info('{}: ended'.format(sys.argv[0]))                             

atexit.register(atexit_cleanup)


# Write our pid file and log a start message

with open(pid_file, 'w') as f:
  f.write(str(os.getpid()))

logger.info('{}: start'.format(sys.argv[0]))


# Finally send RX-V1600 commands

import paho.mqtt.client as mqtt
import time

def on_connect(client, userdata, flags, rc):
  logger.info('{}: mqtt connected with rc={}'.format(sys.argv[0], str(rc)))

mc = mqtt.Client()
mc.on_connect = on_connect

mc.connect(mqtt_broker)
mc.loop_start()

if len(sys.argv) > 1 and sys.argv[1].lower() == 'on':
  mc.publish(cmd_topic, "MainZonePower_On").wait_for_publish()
  time.sleep(5)

  mc.publish(cmd_topic, "SpeakerRelayB_Off").wait_for_publish()
  time.sleep(0.1)

  mc.publish(cmd_topic, "Input_Dtv").wait_for_publish()
  time.sleep(0.1)

  mc.publish(cmd_topic, "SpeakerRelayA_On").wait_for_publish()
  time.sleep(0.1)
else:
  mc.publish(cmd_topic, "MainZonePower_Off").wait_for_publish()
  time.sleep(0.1)

where the evens scripts just contain

#!/bin/sh
exec "${0%/*}/rxv-toggle.py" on|off


see VTi Image 14.x.x Update Infos

MQTT with Python

recently I added the ability to publish mqtt topics:

  • download python module paho mqtt from github as zip (vu-uno python has no pip)
  • copy zip to the vu-uno
cat /home/joachim/Downloads/paho.mqtt.python-master.zip | ssh vu-uno 'cat >/home/joachim/paho.zip'
ssh root@vu-uno
opkg update
opkg install py-compile
cd /home/joachim
unzip paho.zip
cd paho.mqtt.python-master
python setup.py install
  • fix bug about missing pre connect callback (v1.6.1 as of Nov 2023)
    • vi /usr/lib/python2.7/site-packages/paho_mqtt-1.6.1-py2.7.egg/paho/mqtt/client.py
    • search for self._on_disconnect (in class Client)
    • add similar line nearby: self._on_pre_connect = None

Now you can publish mqtt topics with this simple python code:

#!/usr/bin/python
import paho.mqtt.publish as publish
publish.single("some/topic", "some-value", hostname="your-mqtt-broker")