mirror of
https://github.com/gSpotx2f/luci-app-internet-detector.git
synced 2025-12-07 12:06:54 +03:00
mod_led_control: LED actions
This commit is contained in:
18
README.md
18
README.md
@@ -19,15 +19,15 @@ Internet-detector is an application for checking the availability of the Interne
|
|||||||
**OpenWrt >= 21.02:**
|
**OpenWrt >= 21.02:**
|
||||||
|
|
||||||
opkg update
|
opkg update
|
||||||
wget --no-check-certificate -O /tmp/internet-detector_1.0-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector_1.0-0_all.ipk
|
wget --no-check-certificate -O /tmp/internet-detector_1.0-1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/internet-detector_1.0-1_all.ipk
|
||||||
opkg install /tmp/internet-detector_1.0-0_all.ipk
|
opkg install /tmp/internet-detector_1.0-1_all.ipk
|
||||||
rm /tmp/internet-detector_1.0-0_all.ipk
|
rm /tmp/internet-detector_1.0-1_all.ipk
|
||||||
/etc/init.d/internet-detector start
|
/etc/init.d/internet-detector start
|
||||||
/etc/init.d/internet-detector enable
|
/etc/init.d/internet-detector enable
|
||||||
|
|
||||||
wget --no-check-certificate -O /tmp/luci-app-internet-detector_1.0-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-internet-detector_1.0-0_all.ipk
|
wget --no-check-certificate -O /tmp/luci-app-internet-detector_1.0-1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-app-internet-detector_1.0-1_all.ipk
|
||||||
opkg install /tmp/luci-app-internet-detector_1.0-0_all.ipk
|
opkg install /tmp/luci-app-internet-detector_1.0-1_all.ipk
|
||||||
rm /tmp/luci-app-internet-detector_1.0-0_all.ipk
|
rm /tmp/luci-app-internet-detector_1.0-1_all.ipk
|
||||||
/etc/init.d/rpcd restart
|
/etc/init.d/rpcd restart
|
||||||
|
|
||||||
Email notification:
|
Email notification:
|
||||||
@@ -36,9 +36,9 @@ Email notification:
|
|||||||
|
|
||||||
i18n-ru:
|
i18n-ru:
|
||||||
|
|
||||||
wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_1.0-0_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-i18n-internet-detector-ru_1.0-0_all.ipk
|
wget --no-check-certificate -O /tmp/luci-i18n-internet-detector-ru_1.0-1_all.ipk https://github.com/gSpotx2f/packages-openwrt/raw/master/current/luci-i18n-internet-detector-ru_1.0-1_all.ipk
|
||||||
opkg install /tmp/luci-i18n-internet-detector-ru_1.0-0_all.ipk
|
opkg install /tmp/luci-i18n-internet-detector-ru_1.0-1_all.ipk
|
||||||
rm /tmp/luci-i18n-internet-detector-ru_1.0-0_all.ipk
|
rm /tmp/luci-i18n-internet-detector-ru_1.0-1_all.ipk
|
||||||
|
|
||||||
**[OpenWrt 19.07](https://github.com/gSpotx2f/luci-app-internet-detector/tree/19.07)**
|
**[OpenWrt 19.07](https://github.com/gSpotx2f/luci-app-internet-detector/tree/19.07)**
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
|
|||||||
|
|
||||||
PKG_NAME:=internet-detector
|
PKG_NAME:=internet-detector
|
||||||
PKG_VERSION:=1.0
|
PKG_VERSION:=1.0
|
||||||
PKG_RELEASE:=0
|
PKG_RELEASE:=1
|
||||||
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>
|
PKG_MAINTAINER:=gSpot <https://github.com/gSpotx2f/luci-app-internet-detector>
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|||||||
@@ -11,12 +11,15 @@ local Module = {
|
|||||||
runInterval = 5,
|
runInterval = 5,
|
||||||
sysLedsDir = "/sys/class/leds",
|
sysLedsDir = "/sys/class/leds",
|
||||||
ledName = nil,
|
ledName = nil,
|
||||||
|
ledAction1 = 2,
|
||||||
|
ledAction2 = 1,
|
||||||
status = nil,
|
status = nil,
|
||||||
_enabled = false,
|
_enabled = false,
|
||||||
_ledDir = nil,
|
_ledDir = nil,
|
||||||
_ledMaxBrightnessFile = nil,
|
_ledMaxBrightnessFile = nil,
|
||||||
_ledBrightnessFile = nil,
|
_ledBrightnessFile = nil,
|
||||||
_ledMaxBrightness = nil,
|
_ledMaxBrightness = nil,
|
||||||
|
_ledTriggerFile = nil,
|
||||||
_counter = 0,
|
_counter = 0,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,12 +41,17 @@ function Module:init(t)
|
|||||||
if not self.ledName then
|
if not self.ledName then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
self.ledAction1 = tonumber(t.led_action_1)
|
||||||
|
self.ledAction2 = tonumber(t.led_action_2)
|
||||||
self._ledDir = string.format("%s/%s", self.sysLedsDir, self.ledName)
|
self._ledDir = string.format("%s/%s", self.sysLedsDir, self.ledName)
|
||||||
self._ledMaxBrightnessFile = string.format("%s/max_brightness", self._ledDir)
|
self._ledMaxBrightnessFile = string.format("%s/max_brightness", self._ledDir)
|
||||||
self._ledBrightnessFile = string.format("%s/brightness", self._ledDir)
|
self._ledBrightnessFile = string.format("%s/brightness", self._ledDir)
|
||||||
self._ledMaxBrightness = self.readValue(self._ledMaxBrightnessFile) or 1
|
self._ledMaxBrightness = self.readValue(self._ledMaxBrightnessFile) or 1
|
||||||
|
self._ledTriggerFile = string.format("%s/trigger", self._ledDir)
|
||||||
|
|
||||||
if (not unistd.access(self._ledDir, "r") or
|
if (not unistd.access(self._ledDir, "r") or
|
||||||
not unistd.access(self._ledBrightnessFile, "rw")) then
|
not unistd.access(self._ledBrightnessFile, "rw") or
|
||||||
|
not unistd.access(self._ledTriggerFile, "rw")) then
|
||||||
self._enabled = false
|
self._enabled = false
|
||||||
self.syslog("warning", string.format(
|
self.syslog("warning", string.format(
|
||||||
"%s: LED '%s' is not available", self.name, self.ledName))
|
"%s: LED '%s' is not available", self.name, self.ledName))
|
||||||
@@ -54,6 +62,31 @@ function Module:init(t)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Module:SetTriggerTimer()
|
||||||
|
self.writeValue(self._ledTriggerFile, "timer")
|
||||||
|
end
|
||||||
|
|
||||||
|
function Module:SetTriggerNone()
|
||||||
|
self.writeValue(self._ledTriggerFile, "none")
|
||||||
|
end
|
||||||
|
|
||||||
|
function Module:getCurrentTrigger()
|
||||||
|
local trigger = self.readValue(self._ledTriggerFile)
|
||||||
|
if trigger and trigger:match("%[timer%]") then
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function Module:on()
|
||||||
|
self:SetTriggerNone()
|
||||||
|
self.writeValue(self._ledBrightnessFile, self._ledMaxBrightness)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Module:off()
|
||||||
|
self:SetTriggerNone()
|
||||||
|
self.writeValue(self._ledBrightnessFile, 0)
|
||||||
|
end
|
||||||
|
|
||||||
function Module:getCurrentState()
|
function Module:getCurrentState()
|
||||||
local state = self.readValue(self._ledBrightnessFile)
|
local state = self.readValue(self._ledBrightnessFile)
|
||||||
if state and tonumber(state) > 0 then
|
if state and tonumber(state) > 0 then
|
||||||
@@ -61,33 +94,42 @@ function Module:getCurrentState()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function Module:on()
|
|
||||||
self.writeValue(self._ledBrightnessFile, self._ledMaxBrightness)
|
|
||||||
end
|
|
||||||
|
|
||||||
function Module:off()
|
|
||||||
self.writeValue(self._ledBrightnessFile, 0)
|
|
||||||
end
|
|
||||||
|
|
||||||
function Module:run(currentStatus, lastStatus, timeDiff)
|
function Module:run(currentStatus, lastStatus, timeDiff)
|
||||||
if not self._enabled then
|
if not self._enabled then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if self._counter == 0 or self._counter >= self.runInterval or currentStatus ~= lastStatus then
|
if self._counter == 0 or self._counter >= self.runInterval or currentStatus ~= lastStatus then
|
||||||
|
|
||||||
if currentStatus == 0 then
|
if currentStatus == 0 then
|
||||||
if not self:getCurrentState() then
|
if self.ledAction1 == 1 then
|
||||||
self:on()
|
if self:getCurrentState() or self:getCurrentTrigger() then
|
||||||
end
|
|
||||||
else
|
|
||||||
if self:getCurrentState() then
|
|
||||||
self:off()
|
self:off()
|
||||||
end
|
end
|
||||||
|
elseif self.ledAction1 == 2 then
|
||||||
|
if not self:getCurrentState() or self:getCurrentTrigger() then
|
||||||
|
self:on()
|
||||||
|
end
|
||||||
|
elseif self.ledAction1 == 3 then
|
||||||
|
if not self:getCurrentTrigger() then
|
||||||
|
self:SetTriggerTimer()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if self.ledAction2 == 1 then
|
||||||
|
if self:getCurrentState() or self:getCurrentTrigger() then
|
||||||
|
self:off()
|
||||||
|
end
|
||||||
|
elseif self.ledAction2 == 2 then
|
||||||
|
if not self:getCurrentState() or self:getCurrentTrigger() then
|
||||||
|
self:on()
|
||||||
|
end
|
||||||
|
elseif self.ledAction2 == 3 then
|
||||||
|
if not self:getCurrentTrigger() then
|
||||||
|
self:SetTriggerTimer()
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
self._counter = 0
|
self._counter = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
self._counter = self._counter + timeDiff
|
self._counter = self._counter + timeDiff
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_VERSION:=1.0-0
|
PKG_VERSION:=1.0-1
|
||||||
LUCI_TITLE:=LuCI support for internet-detector
|
LUCI_TITLE:=LuCI support for internet-detector
|
||||||
LUCI_DEPENDS:=+internet-detector
|
LUCI_DEPENDS:=+internet-detector
|
||||||
LUCI_PKGARCH:=all
|
LUCI_PKGARCH:=all
|
||||||
|
|||||||
@@ -194,7 +194,6 @@ return view.extend({
|
|||||||
|
|
||||||
if(!this.inetStatus || !this.inetStatus.instances || this.inetStatus.instances.length === 0) {
|
if(!this.inetStatus || !this.inetStatus.instances || this.inetStatus.instances.length === 0) {
|
||||||
let label = E('span', { 'class': 'id-label-status id-undefined' }, _('Undefined'))
|
let label = E('span', { 'class': 'id-label-status id-undefined' }, _('Undefined'))
|
||||||
|
|
||||||
if(this.currentAppMode !== '0' && this.appStatus !== 'stoped') {
|
if(this.currentAppMode !== '0' && this.appStatus !== 'stoped') {
|
||||||
label.classList.add('spinning');
|
label.classList.add('spinning');
|
||||||
};
|
};
|
||||||
@@ -251,7 +250,6 @@ return view.extend({
|
|||||||
]).then(stat => {
|
]).then(stat => {
|
||||||
let curAppStatus = (stat[0].code === 0) ? stat[0].stdout.trim() : null;
|
let curAppStatus = (stat[0].code === 0) ? stat[0].stdout.trim() : null;
|
||||||
let inetStatData = this.inetStatusFromJson(stat[1]);
|
let inetStatData = this.inetStatusFromJson(stat[1]);
|
||||||
|
|
||||||
this.appStatus = curAppStatus;
|
this.appStatus = curAppStatus;
|
||||||
this.inetStatus = inetStatData;
|
this.inetStatus = inetStatData;
|
||||||
this.setInternetStatus();
|
this.setInternetStatus();
|
||||||
@@ -273,9 +271,11 @@ return view.extend({
|
|||||||
|
|
||||||
return fs.exec(this.execPath, [ 'poll' ]).then(res => {
|
return fs.exec(this.execPath, [ 'poll' ]).then(res => {
|
||||||
let inetStatData = this.inetStatusFromJson(res);
|
let inetStatData = this.inetStatusFromJson(res);
|
||||||
|
|
||||||
if(inetStatData.instances[0]) {
|
if(inetStatData.instances[0]) {
|
||||||
this.uiPollState = inetStatData.instances[0].inet;
|
this.uiPollState = inetStatData.instances[0].inet;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.inetStatus = inetStatData;
|
this.inetStatus = inetStatData;
|
||||||
this.setInternetStatus();
|
this.setInternetStatus();
|
||||||
});
|
});
|
||||||
@@ -330,6 +330,7 @@ return view.extend({
|
|||||||
|
|
||||||
renderWidget: function(section_id, option_index, cfgvalue) {
|
renderWidget: function(section_id, option_index, cfgvalue) {
|
||||||
this.ctx.setInternetStatus();
|
this.ctx.setInternetStatus();
|
||||||
|
|
||||||
return E([
|
return E([
|
||||||
E('label', { 'class': 'cbi-value-title', 'for': 'inetStatusArea' },
|
E('label', { 'class': 'cbi-value-title', 'for': 'inetStatusArea' },
|
||||||
_('Internet status')
|
_('Internet status')
|
||||||
@@ -652,6 +653,7 @@ return view.extend({
|
|||||||
'hosts', _('Hosts'),
|
'hosts', _('Hosts'),
|
||||||
_('Hosts to check Internet availability. Hosts are polled (in list order) until at least one of them responds.')
|
_('Hosts to check Internet availability. Hosts are polled (in list order) until at least one of them responds.')
|
||||||
);
|
);
|
||||||
|
//o.datatype = 'or(host,hostport)';
|
||||||
o.datatype = 'or(or(host,hostport),ipaddrport(1))';
|
o.datatype = 'or(or(host,hostport),ipaddrport(1))';
|
||||||
o.default = this.defaultHosts;
|
o.default = this.defaultHosts;
|
||||||
o.rmempty = false;
|
o.rmempty = false;
|
||||||
@@ -755,11 +757,12 @@ return view.extend({
|
|||||||
o = ss.taboption('led_control', form.DummyValue, '_dummy');
|
o = ss.taboption('led_control', form.DummyValue, '_dummy');
|
||||||
o.rawhtml = true;
|
o.rawhtml = true;
|
||||||
o.default = '<div class="cbi-section-descr">' +
|
o.default = '<div class="cbi-section-descr">' +
|
||||||
_('<abbr title="Light Emitting Diode">LED</abbr> is on when Internet is available.') +
|
_('<abbr title="Light Emitting Diode">LED</abbr> indicates the Internet status.') +
|
||||||
'</div>';
|
'</div>';
|
||||||
o.modalonly = true;
|
o.modalonly = true;
|
||||||
|
|
||||||
if(this.leds.length > 0) {
|
if(this.leds.length > 0) {
|
||||||
|
this.leds.sort((a, b) => a.name > b.name);
|
||||||
|
|
||||||
// enabled
|
// enabled
|
||||||
o = ss.taboption('led_control', form.Flag, 'mod_led_control_enabled',
|
o = ss.taboption('led_control', form.Flag, 'mod_led_control_enabled',
|
||||||
@@ -772,8 +775,27 @@ return view.extend({
|
|||||||
_('<abbr title="Light Emitting Diode">LED</abbr> Name'));
|
_('<abbr title="Light Emitting Diode">LED</abbr> Name'));
|
||||||
o.depends({ mod_led_control_enabled: '1' });
|
o.depends({ mod_led_control_enabled: '1' });
|
||||||
o.modalonly = true;
|
o.modalonly = true;
|
||||||
this.leds.sort((a, b) => a.name > b.name);
|
|
||||||
this.leds.forEach(e => o.value(e.name));
|
this.leds.forEach(e => o.value(e.name));
|
||||||
|
|
||||||
|
// led_action_1
|
||||||
|
o = ss.taboption('led_control', form.ListValue, 'mod_led_control_led_action_1',
|
||||||
|
_('Action when connected'));
|
||||||
|
o.depends({ mod_led_control_enabled: '1' });
|
||||||
|
o.modalonly = true;
|
||||||
|
o.value(1, _('Off'));
|
||||||
|
o.value(2, _('On'));
|
||||||
|
o.value(3, _('Blink'));
|
||||||
|
o.default = '2';
|
||||||
|
|
||||||
|
// led_action_2
|
||||||
|
o = ss.taboption('led_control', form.ListValue, 'mod_led_control_led_action_2',
|
||||||
|
_('Action when disconnected'));
|
||||||
|
o.depends({ mod_led_control_enabled: '1' });
|
||||||
|
o.modalonly = true;
|
||||||
|
o.value(1, _('Off'));
|
||||||
|
o.value(2, _('On'));
|
||||||
|
o.value(3, _('Blink'));
|
||||||
|
o.default = '1';
|
||||||
} else {
|
} else {
|
||||||
o = ss.taboption('led_control', form.DummyValue, '_dummy');
|
o = ss.taboption('led_control', form.DummyValue, '_dummy');
|
||||||
o.rawhtml = true;
|
o.rawhtml = true;
|
||||||
|
|||||||
@@ -20,9 +20,14 @@ msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> control"
|
|||||||
msgstr "Управление <abbr title=\"Светодиод\">LED</abbr>"
|
msgstr "Управление <abbr title=\"Светодиод\">LED</abbr>"
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"<abbr title=\"Light Emitting Diode\">LED</abbr> is on when Internet is "
|
"<abbr title=\"Light Emitting Diode\">LED</abbr> indicates the Internet status."
|
||||||
"available."
|
msgstr "<abbr title=\"Светодиод\">LED</abbr> отображает статус Интернет."
|
||||||
msgstr "<abbr title=\"Светодиод\">LED</abbr> включен если Интернет доступен."
|
|
||||||
|
msgid "Action when connected"
|
||||||
|
msgstr "Действие при подключении"
|
||||||
|
|
||||||
|
msgid "Action when disconnected"
|
||||||
|
msgstr "Действие при отключении"
|
||||||
|
|
||||||
msgid "Add instance"
|
msgid "Add instance"
|
||||||
msgstr "Добавить экземпляр"
|
msgstr "Добавить экземпляр"
|
||||||
@@ -44,6 +49,9 @@ msgstr "Произошла ошибка"
|
|||||||
msgid "Big: 248 bytes"
|
msgid "Big: 248 bytes"
|
||||||
msgstr "Большой: 248 байт"
|
msgstr "Большой: 248 байт"
|
||||||
|
|
||||||
|
msgid "Blink"
|
||||||
|
msgstr "Мигать"
|
||||||
|
|
||||||
msgid "Check type"
|
msgid "Check type"
|
||||||
msgstr "Тип проверки"
|
msgstr "Тип проверки"
|
||||||
|
|
||||||
@@ -291,6 +299,12 @@ msgstr "Сеть будет перезапущена при отключении
|
|||||||
msgid "No <abbr title=\"Light Emitting Diode\">LED</abbr>s available..."
|
msgid "No <abbr title=\"Light Emitting Diode\">LED</abbr>s available..."
|
||||||
msgstr "Нет доступных <abbr title=\"Светодиод\">LED</abbr>..."
|
msgstr "Нет доступных <abbr title=\"Светодиод\">LED</abbr>..."
|
||||||
|
|
||||||
|
msgid "Off"
|
||||||
|
msgstr "Выключить"
|
||||||
|
|
||||||
|
msgid "On"
|
||||||
|
msgstr "Включить"
|
||||||
|
|
||||||
msgid "One of the following:"
|
msgid "One of the following:"
|
||||||
msgstr "Одно из следующих значений:"
|
msgstr "Одно из следующих значений:"
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,13 @@ msgid "<abbr title=\"Light Emitting Diode\">LED</abbr> control"
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"<abbr title=\"Light Emitting Diode\">LED</abbr> is on when Internet is "
|
"<abbr title=\"Light Emitting Diode\">LED</abbr> indicates the Internet status."
|
||||||
"available."
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Action when connected"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Action when disconnected"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Add instance"
|
msgid "Add instance"
|
||||||
@@ -32,6 +37,9 @@ msgstr ""
|
|||||||
msgid "Big: 248 bytes"
|
msgid "Big: 248 bytes"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Blink"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Check type"
|
msgid "Check type"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@@ -261,6 +269,12 @@ msgstr ""
|
|||||||
msgid "No <abbr title=\"Light Emitting Diode\">LED</abbr>s available..."
|
msgid "No <abbr title=\"Light Emitting Diode\">LED</abbr>s available..."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Off"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "On"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "One of the following:"
|
msgid "One of the following:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user