Sterowanie routerem Mikrotik z poziomu SUPLA - Kontrola rodzicielska

User avatar
Duch__
Posts: 2199
Joined: Wed Aug 24, 2016 7:26 pm
Location: Opole
Been thanked: 6 times

Post

Hej.

Dzisiaj wrzucam kawałek kodu który powstał z potrzeby.

Moja córeczka, prawie 3 latka, mała cwaniara, czasami ogląda bajki na YT Kids na TV. Zorientowała się już że jak kochany tatuś odłączy kabelek LAN od TV (bo już za długo ogląda) to za chwilę bajek nie będzie i każe mi to naprawić :lol: W celu rozwiązania tego problemu powstał prosty kod na ESP z virtual_relay który ma za zadanie "po cichu" odłączyć przewód LAN poprzez zablokowanie portu w samym Mikrotiku wykorzystując do tego API wbudowane w Mikrotika. I wtedy mogę zwalić że mama nie opłaciła internetu :D :roll:

Potrzebny jest goły dowolny procesor np. ESP8266 i parę linijek kodu.
Soft testowany na RB4011 z firmware 7.20.5
Poniżej przykład dla portu "ether08".

Code: Select all

/*
  Copyright (C) AC SOFTWARE SP. Z O.O.

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

const char* mt_ip   = "192.168.1.1";      	//Adres IP mikrotika
const int   mt_port = 8728;			//Port API
const char* mt_user = "admin";			//Login
const char* mt_pass = "pass";			//Hasło
// w programie wpisany jest port LAN "ether08", należy go zmienić na własny.

bool poprzedni_stan_vrelay_mikrotik = 1;
bool stan_vrelay_mikrotik = 0; 

unsigned long poprzedni_czas;

#define STATUS_LED_GPIO 2

#include <SuplaDevice.h>
#include <supla/network/esp_wifi.h>
#include <supla/device/status_led.h>
#include <supla/storage/littlefs_config.h>
#include <supla/network/esp_web_server.h>
#include <supla/network/html/device_info.h>
#include <supla/network/html/protocol_parameters.h>
#include <supla/network/html/status_led_parameters.h>
#include <supla/network/html/wifi_parameters.h>
#include <supla/control/virtual_relay.h>
Supla::Control::VirtualRelay *vrelay_mikrotik = nullptr;
#include <supla/storage/eeprom.h>

WiFiClient client;
Supla::Eeprom eeprom;

Supla::ESPWifi wifi;
Supla::LittleFsConfig configSupla;

Supla::Device::StatusLed statusLed(STATUS_LED_GPIO, true); // inverted state
Supla::EspWebServer suplaServer;

void setup() {
  Serial.begin(115200);

  // HTML www component
  new Supla::Html::DeviceInfo(&SuplaDevice);
  new Supla::Html::WifiParameters;
  new Supla::Html::ProtocolParameters;
  new Supla::Html::StatusLedParameters;

  // Channel #0 Virtual Relay
  vrelay_mikrotik = new Supla::Control::VirtualRelay();
  vrelay_mikrotik->setDefaultFunction(SUPLA_CHANNELFNC_POWERSWITCH);
  // Enable state restore after device restart:
  vrelay_mikrotik->setDefaultStateRestore();
  vrelay_mikrotik->setInitialCaption("PORT 8"); 

  SuplaDevice.setInitialMode(Supla::InitialMode::StartInCfgMode);
  SuplaDevice.setName("MIKROTIK");
  SuplaDevice.begin();
}

void loop() {
  SuplaDevice.iterate();
  Steruj_portami_w_Mikrotik();
}

void Steruj_portami_w_Mikrotik(){
  if(millis() - poprzedni_czas >= 1000){
    poprzedni_czas = millis();
    if (Supla::Network::IsReady()) { 
      byte stan_vrelay_mikrotik = 0; 
      if(vrelay_mikrotik->isOn()){
        stan_vrelay_mikrotik = 1;
      } 
      if(poprzedni_stan_vrelay_mikrotik != stan_vrelay_mikrotik){ 
        poprzedni_stan_vrelay_mikrotik = stan_vrelay_mikrotik; 
        if(stan_vrelay_mikrotik == 1){ 
          enablePort("ether08"); 
          Serial.println("Enable port 8"); 
        }else{ 
          disablePort("ether08"); 
          Serial.println("Disable port 8"); 
        } 
      } 
    }
  }
}

void enablePort(const String& iface) {
  if (!mtLogin()) return;

  writeWord("/interface/ethernet/set");
  writeWord("=numbers=" + iface);
  writeWord("=disabled=no");      // WŁĄCZ port
  client.write((uint8_t)0x00);
  delay(100);
  if (client.connected()) client.stop(); //Mikrotik Logout
}

void disablePort(const String& iface) {
  if (!mtLogin()) return;

  writeWord("/interface/ethernet/set");
  writeWord("=numbers=" + iface);
  writeWord("=disabled=yes");
  client.write((uint8_t)0x00);
  delay(100);
  if (client.connected()) client.stop(); //Mikrotik Logout
}

void writeWord(const String& word) {
  int len = word.length();
  client.write((uint8_t)len);
  client.print(word);
}

bool mtLogin() {
  if (!client.connect(mt_ip, mt_port)) {
    Serial.println("Brak połączenia z MikroTik");
    return false;
  }

  writeWord("/login");
  writeWord("=name=" + String(mt_user));
  writeWord("=password=" + String(mt_pass));
  client.write((uint8_t)0x00);

  delay(200);
  while (client.available()) client.read();
  return true;
}
W stanie włączonym port będzie tak wyświetlany:
stan on.png
W stanie wyłączonym port będzie tak wyświetlany:
stan off.png
Może komuś się przyda.

Pozdrawiam, Duch__
You do not have the required permissions to view the files attached to this post.
User avatar
lesny8
Posts: 3132
Joined: Mon Dec 11, 2017 9:43 pm
Has thanked: 10 times
Been thanked: 9 times

Post

Fajnie, fajnie ;)
Takie już cwane są te nasze maluchy :)
Ja u siebie mam reguły na firewallu dla różnych urządzeń, które aktywuję przez apke mikrotika, jak chcę po cichu zablokować Internet młodym na jakimś urządzeniu. Innym razem, jak jest potrzebne wyciąć ruch do samego YT, aktywuje grupę na pi-hole. Tam mam dodane do niej wszystkie tv, telefony, komputery z których młodzi mogą korzystać.
SOP 2023 :heavy_check_mark:
SOP 2024 :heavy_check_mark:
Czekam na kolejne Supla Offline Party :upside_down_face:
🧩: 🔑cz->b ⛴️+ila
User avatar
Duch__
Posts: 2199
Joined: Wed Aug 24, 2016 7:26 pm
Location: Opole
Been thanked: 6 times

Post

lesny8 wrote: Sat Dec 06, 2025 9:35 am Fajnie, fajnie ;)
Takie już cwane są te nasze maluchy :)
Ja u siebie mam reguły na firewallu dla różnych urządzeń, które aktywuję przez apke mikrotika, jak chcę po cichu zablokować Internet młodym na jakimś urządzeniu. Innym razem, jak jest potrzebne wyciąć ruch do samego YT, aktywuje grupę na pi-hole. Tam mam dodane do niej wszystkie tv, telefony, komputery z których młodzi mogą korzystać.
Chciałem by to było proste do obsługi dla użytkownika końcowego (mojej żony). Jakoś nie widzi mi się by grzebała mi w konfigu MT.

API od MT umożliwia dużo więcej. Korzystam też w jednym rozwiązaniu gdzie Supla w porozumieniu z protokołem integracji centrali Satel Integra wyłącza mi POE w RB4011 na ether10, z którego zasilany jest dodatkowy AP. Nie ma mnie w domu (uzbrojony) to oszczędzaj prąd.
User avatar
klimasstudio
Posts: 1273
Joined: Wed Aug 28, 2019 9:35 pm
Location: localhost

Post

Sam o tym myslałem... Mamy w domu nastolatka który notorycznie tiktokami wykorzystywał nawet 300gb mobilnego internetu w zaledwie kilka dni.. Niestety mam OpenWrt wiec tam skrypt ktory chciałem jak na Mikrotiku zrobić nie znalazłem na tamten moment Z pomocą przyszła instalacja AdGuarda i wycinanie usług.

Na pewno się przyda poradnik ale fajnie jakby była strona www z konfiguracja do wklejenia aby nie trzeba kompilowac za kazdym razem.. Ja wiem ze to sie raz robi ale...

Itak + za skrypt
Więc chodź OSUPLUJE Ci dom :mrgreen:

Druk 3D - > https://klimastech.eu.org/druk-3d

Return to “Projekty użytkowników”