Sonoff теряет связь

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
havenofear
Сообщения: 120
Зарегистрирован: Чт янв 30, 2014 7:18 am
Благодарил (а): 4 раза
Поблагодарили: 3 раза

Sonoff теряет связь

Сообщение havenofear » Пт фев 17, 2017 4:53 am

Добрый день! У меня стоит Sonoff на прошивке Node MCU, скрипт на LUA и бывает что он теряет связь (раз в неделю - две), в скрипте есть проверка соединения и реконнект, но это не помогает. То есть перестаёт работать переключение по сети, с кнопки реле переключается. Помогает только - вытащить из розетки и воткнуть обратно. Не подскажите, что можно придумать, чтобы решить проблему, никто не сталкивался? Может как-то можно при 10 попытках реконнекта, чтобы он перезагружался? Скрипт у меня вот такой:
СпойлерПоказать
WIFI_SSID = ""
WIFI_PASS = ""
MQTT_BrokerIP = ""
MQTT_BrokerPort = 1883
MQTT_ClientID = "esp-001"
MQTT_Client_user = "user"
MQTT_Client_password = "password"
MQTT_RelayTopicPath = "/ESP/Relays/"
MQTT_Relay_ID = "001"
RELAY_PIN = 6
LED_PIN = 7
BUTTON_PIN = 3
DHT_PIN = 4

gpio.mode(RELAY_PIN, gpio.OUTPUT)
gpio.mode(LED_PIN, gpio.OUTPUT)
gpio.mode(BUTTON_PIN, gpio.INPUT)
gpio.write(RELAY_PIN, gpio.HIGH)
gpio.write(LED_PIN, gpio.HIGH)
wifi.setmode(wifi.STATION)
wifi.sta.config(WIFI_SSID, WIFI_PASS)
wifi.sta.connect()

local wifi_status_old = 0
local RelayState_old = 0
local ButtonState_old = 0

local function switchRelay(id, state)
if (id == MQTT_Relay_ID) then
if (state == 0) or (state == "0") or (string.lower(state) == "off") then
if (RelayState_old == 1) then
RelayState_old = 0
gpio.write(RELAY_PIN, gpio.LOW)
gpio.write(LED_PIN, gpio.HIGH)
--print("RELAY OFF")
if (m ~= nil) then
m:publish(MQTT_RelayTopicPath..MQTT_Relay_ID, "0", 0, 1, function(conn)
--print("Relay state sent")
end)
end
end
else
if (RelayState_old == 0) then
RelayState_old = 1
gpio.write(RELAY_PIN, gpio.HIGH)
gpio.write(LED_PIN, gpio.LOW)
--print("RELAY ON")
if (m ~= nil) then
m:publish(MQTT_RelayTopicPath..MQTT_Relay_ID, "1", 0, 1, function(conn)
--print("Relay state sent")
end)
end
end
end
end
end

-- Сканирование состояния кнопки из таймера 2
tmr.alarm(2, 100, tmr.ALARM_AUTO, function()
local ButtonState = gpio.read(BUTTON_PIN)

-- Нажатие кнопки (задний фронт на gpio0)
if (ButtonState == 0) and (ButtonState_old == 1) then
print("Button pressed")
if (RelayState_old == 0) then
switchRelay(MQTT_Relay_ID, 1)
else
switchRelay(MQTT_Relay_ID, 0)
end
end
ButtonState_old = ButtonState
end)

tmr.alarm(0, 5000, 1, function()
print("tmr0 "..wifi_status_old.." "..wifi.sta.status())

if wifi.sta.status() == 5 then -- подключение есть
if wifi_status_old ~= 5 then -- Произошло подключение к Wifi, IP получен
print(wifi.sta.getip())

m = mqtt.Client(MQTT_ClientID, 120, MQTT_Client_user, MQTT_Client_password)

-- Определяем обработчики событий от клиента MQTT
m:on("connect", function(client) print ("connected") end)
m:on("offline", function(client)
tmr.stop(1)
print ("offline")
end)
m:on("message", function(client, topic, data)
--print(topic .. ":" )
if data ~= nil then
--print(data)
end

local _, RelayPos = string.find(topic, MQTT_RelayTopicPath.."(%w)")
local Relay = string.sub(topic, RelayPos)
--print(Relay)
if data ~= nil then
switchRelay(Relay, data)
end
end)

m:connect(MQTT_BrokerIP, MQTT_BrokerPort, 0, 1, function(conn)
print("connected")

-- Подписываемся на топики если нужно
m:subscribe(MQTT_RelayTopicPath.."#",0, function(conn)
print("Subscribed!")
end)

tmr.alarm(1, 3000, 1, function()
-- Делаем измерения, публикуем их на брокере
--local status,temp,humi,temp_decimal,humi_decimal = dht.read(DHT_PIN)

--if (status == dht.OK) then
-- print("Temp: "..temp.."."..temp_decimal.." C")
-- print("Hum: "..humi.."."..humi_decimal.." %")
-- m:publish("/ESP/DHT/TEMP", temp.."."..temp_decimal, 0, 0, function(conn) print("sent") end)
-- m:publish("/ESP/DHT/HUM", humi.."."..humi_decimal, 0, 0, function(conn) print("sent") end)
--end
end)
end)
else
-- подключение есть и не разрывалось, ничего не делаем
end
else
print("Reconnect "..wifi_status_old.." "..wifi.sta.status())
tmr.stop(1)
wifi.sta.connect()
end

-- Запоминаем состояние подключения к Wifi для следующего такта таймера
wifi_status_old = wifi.sta.status()
end)
Аватара пользователя
Delovoj
Сообщения: 4
Зарегистрирован: Ср фев 15, 2017 9:47 pm
Откуда: Russia
Благодарил (а): 8 раз
Поблагодарили: 0

Re: Sonoff теряет связь

Сообщение Delovoj » Пт фев 17, 2017 11:54 am

проблема только в одном модуле? есть вариант проверить на других?
если проблема в конкретном модуле - просто поменяй, стоит же копейки.
havenofear
Сообщения: 120
Зарегистрирован: Чт янв 30, 2014 7:18 am
Благодарил (а): 4 раза
Поблагодарили: 3 раза

Re: Sonoff теряет связь

Сообщение havenofear » Пн фев 20, 2017 8:19 am

Delovoj писал(а):проблема только в одном модуле? есть вариант проверить на других?
если проблема в конкретном модуле - просто поменяй, стоит же копейки.
Он пока единственный, который постоянно получает питание. Остальные работают через физическое выключение, поэтому периодически перезагружаются... А лишних для проверки сейчас нет
dens96
Сообщения: 15
Зарегистрирован: Сб сен 23, 2017 10:50 pm
Благодарил (а): 14 раз
Поблагодарили: 0

Re: Sonoff теряет связь

Сообщение dens96 » Ср ноя 29, 2017 9:26 pm

havenofear писал(а):
Delovoj писал(а):проблема только в одном модуле? есть вариант проверить на других?
если проблема в конкретном модуле - просто поменяй, стоит же копейки.
Он пока единственный, который постоянно получает питание. Остальные работают через физическое выключение, поэтому периодически перезагружаются... А лишних для проверки сейчас нет
Удалось победить проблему с потерей связи? У меня такая же проблема. Подозреваю, что в mqtt затык, так как пинг до Sonoff не пропадает и с кнопки он, как вы и говорите, продолжает включать/выключать реле.
smart_g
Сообщения: 292
Зарегистрирован: Вт окт 17, 2017 11:29 am
Откуда: Украина, Киев
Благодарил (а): 15 раз
Поблагодарили: 33 раза

Re: Sonoff теряет связь

Сообщение smart_g » Чт ноя 30, 2017 10:38 am

Такая же проблема. Скипт Lua доработанный из https://www.youtube.com/watch?v=4O-2dJwRQtg. Добавлены датчики, изменены тайминги. Потеря связи через 4ре недели. Когда то видел в инете статью об очистке памяти при модульной структуре Lua. Теперь не могу ее найти.
Ubuntu Server 16.04 LTS, OpenWRT 1-wire, SonOFF, MYSensors, MiHome, Yeelight, MiFlower
Ответить