Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. [SOLVED] GatewayESP8266MQTTClient - Recovery failure after gateway outage

[SOLVED] GatewayESP8266MQTTClient - Recovery failure after gateway outage

Scheduled Pinned Locked Moved Troubleshooting
4 Posts 3 Posters 2.1k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • cimba007C Offline
    cimba007C Offline
    cimba007
    wrote on last edited by cimba007
    #1

    Hello,

    I am using the "GatewayESP8266MQTTClient" and "LightSensor" Sketch with default settings.

    My System: MySensorsNet 2.0.0, Arduino IDE 1.6.10 hourly (22.07.2016), Windows 8.1 64bit

    I tried to find out how robust this setup is so i forcefully reset the Gateway (power off) and waited until the "Light Sensor" node entered failure state:

    **
    "Light Sensor"-Node**

    !TSP:SEND:TNR<\n>
    Send failed!<\r><\n>
    !TSP:SEND:TNR<\n>
    vcc: 3280<\r><\n>
    511, 1017<\r><\n>
    !TSP:SEND:TNR<\n>
    Send failed!<\r><\n>
    !TSP:SEND:TNR<\n>
    vcc: 3280<\r><\n>
    511, 1015<\r><\n>
    !TSP:SEND:TNR<\n>
    Send failed!<\r><\n>
    !TSP:SEND:TNR<\n>
    vcc: 3280<\r><\n>
    511, 1017<\r><\n>
    !TSP:SEND:TNR<\n>
    Send failed!<\r><\n>
    !TSP:SEND:TNR<\n>
    vcc: 3280<\r><\n>
    511, 1015<\r><\n>
    !TSP:SEND:TNR<\n>
    Send failed!<\r><\n>
    TSM:FPAR<\n>
    TSP:MSG:SEND 10-10-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:<\n>
    !TSP:SEND:TNR<\n>
    vcc: 3280<\r><\n>
    511, 1018<\r><\n>
    !TSP:SEND:TNR<\n>
    Send failed!<\r><\n>
    !TSP:SEND:TNR<\n>
    vcc: 3280<\r><\n>
    511, 1017<\r><\n>
    !TSP:SEND:TNR<\n>
    Send failed!<\r><\n>
    !TSP:SEND:TNR
    

    After the Gateway is up again the "Light Sensor"-Node still can't find back the Gateway

    And the gateways is somehow doing nothing .. at least I do not understand what it is doing.

    .scandone<\n>
    state: 0 -> 2 (b0)<\n>
    state: 2 -> 3 (0)<\n>
    state: 3 -> 5 (10)<\n>
    add 0<\n>
    aid 1<\n>
    cnt <\n>
    <\n>
    connected with FRITZ!Box Fon WLAN 7390, channel 11<\n>
    dhcp client start...<\n>
    .............ip:192.168.178.67,mask:255.255.255.0,gw:192.168.178.1<\n>
    .IP: 192.168.178.67<\r><\n>
    0;255;3;0;9;No registration required<\n>
    0;255;3;0;9;Init complete, id=0, parent=0, distance=0, registration=1<\n>
    IP: 192.168.178.67<\r><\n>
    0;255;3;0;9;Attempting MQTT connection...<\n>
    0;255;3;0;9;MQTT connected<\n>
    0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:<\n>
    0;255;3;0;9;TSP:MSG:BC<\n>
    0;255;3;0;9;TSP:MSG:FPAR REQ (sender=10)<\n>
    0;255;3;0;9;TSP:CHKUPL:OK (FLDCTRL)<\n>
    0;255;3;0;9;TSP:MSG:GWL OK<\n>
    0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
    pm open,type:2 0<\n>
    0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:<\n>
    0;255;3;0;9;TSP:MSG:BC<\n>
    0;255;3;0;9;TSP:MSG:FPAR REQ (sender=10)<\n>
    0;255;3;0;9;TSP:CHKUPL:OK<\n>
    0;255;3;0;9;TSP:MSG:GWL OK<\n>
    0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
    0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:<\n>
    0;255;3;0;9;TSP:MSG:BC<\n>
    0;255;3;0;9;TSP:MSG:FPAR REQ (sender=10)<\n>
    0;255;3;0;9;TSP:CHKUPL:OK<\n>
    0;255;3;0;9;TSP:MSG:GWL OK<\n>
    0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
    0;255;3;0;9;TSP:SANCHK:OK<\n>
    0;255;3;0;9;TSP:SANCHK:OK<\n>
    0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:<\n>
    0;255;3;0;9;TSP:MSG:BC<\n>
    0;255;3;0;9;TSP:MSG:FPAR REQ (sender=10)<\n>
    0;255;3;0;9;TSP:CHKUPL:OK<\n>
    0;255;3;0;9;TSP:MSG:GWL OK<\n>
    0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
    0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:
    

    I can see that the gateway is receiving some messages from the node but it "fails?!" to respond accordingly?!

    Anybody could enlighten me?

    Gatewaycode = 99,99% vanilla except credentials and mqtt broker (mosquitto)

    "light sensor" node code only for completenss, ignore the stuff that is commented out

    #define MY_NODE_ID 10 <--- manual node id is set!

    #include <Streaming.h>
    
    
    /**
     * The MySensors Arduino library handles the wireless radio link and protocol
     * between your home built sensors/actuators and HA controller of choice.
     * The sensors forms a self healing radio network with optional repeaters. Each
     * repeater and gateway builds a routing tables in EEPROM which keeps track of the
     * network topology allowing messages to be routed to nodes.
     *
     * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
     * Copyright (C) 2013-2015 Sensnology AB
     * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
     *
     * Documentation: http://www.mysensors.org
     * Support Forum: http://forum.mysensors.org
     *
     * This program is free software; you can redistribute it and/or
     * modify it under the terms of the GNU General Public License
     * version 2 as published by the Free Software Foundation.
     *
     *******************************
     *
     * REVISION HISTORY
     * Version 1.0 - Henrik EKblad
     * 
     * DESCRIPTION
     * Example sketch showing how to measue light level using a LM393 photo-resistor 
     * http://www.mysensors.org/build/light
     */
    
    #define MY_NODE_ID 10
    #define MY_BAUD_RATE 9600
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    #include <SPI.h>
    #include <MySensors.h>  
    
    #define CHILD_ID_LIGHT 0
    #define LIGHT_SENSOR_ANALOG_PIN A3
    
    unsigned long SLEEP_TIME = 1000; // Sleep time between reads (in milliseconds)
    
    MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
    int lastLightLevel;
    
    //#include "WatchdogAVR.h"
    //typedef WatchdogAVR WatchdogType;
    //WatchdogType Watchdog;
    
    void setup()
    {
      //Watchdog.disable();
      //int countdownMS = Watchdog.enable();
      
      //Serial.print("Enabled the watchdog with max countdown of ");
      //Serial.print(countdownMS, DEC);
      //Serial.println(" milliseconds!");
      //Serial.println();
      
      //Serial.begin(57600);
      Serial.println("setup() begin");
        // LightSensor
      pinMode(A3,INPUT_PULLUP);
      pinMode(A2,OUTPUT);
      digitalWrite(A2,LOW);
    }
    void presentation()  {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Light Sensor", "1.0");
    
      // Register all sensors to gateway (they will be created as child devices)
      present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
    }
    
    void loop()      
    {     
      static long vcc = readVcc();
      static int vccpercent = map(vcc,2400,3007,0,100);
      sendBatteryLevel(max(min(vccpercent,100),0),false);
      Serial << "vcc: " << vcc << endl;
      // Required for ack
      //wait(100);
      
      analogRead(LIGHT_SENSOR_ANALOG_PIN);
      int lightLevel_raw = analogRead(LIGHT_SENSOR_ANALOG_PIN);
      int lightLevel = (1023-lightLevel_raw)/10.23; // as of 1023 !!
      lightLevel = 511;
      Serial.print(lightLevel);
      Serial.print(", ");
      Serial.println(lightLevel_raw);
      //if (lightLevel != lastLightLevel) {
          if(!send(msg.set(lightLevel),true))
            Serial.println("Send failed!");
          lastLightLevel = lightLevel;
      //}
      //Serial.print("RETR=");
      //Serial.println((0x0F & RF24_retrycount()));
      wait(100);
      sleep(SLEEP_TIME);
    }
    // https://forum.mysensors.org/topic/3463/m_ack_variable-or-m_set_variable/2
    void receive(const MyMessage &message) {
      if (message.isAck()) {
          Serial.println("This is an ack from gateway");
          //Serial.println("Reset Watchdog!");
          //Watchdog.reset();
          }
    }
    

    I got headache from this line:

    0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
    

    After the node requsts a parent .. isn't the node supposed to listen for the response? Where should this happen in the code?!

    T 1 Reply Last reply
    0
    • cimba007C cimba007

      Hello,

      I am using the "GatewayESP8266MQTTClient" and "LightSensor" Sketch with default settings.

      My System: MySensorsNet 2.0.0, Arduino IDE 1.6.10 hourly (22.07.2016), Windows 8.1 64bit

      I tried to find out how robust this setup is so i forcefully reset the Gateway (power off) and waited until the "Light Sensor" node entered failure state:

      **
      "Light Sensor"-Node**

      !TSP:SEND:TNR<\n>
      Send failed!<\r><\n>
      !TSP:SEND:TNR<\n>
      vcc: 3280<\r><\n>
      511, 1017<\r><\n>
      !TSP:SEND:TNR<\n>
      Send failed!<\r><\n>
      !TSP:SEND:TNR<\n>
      vcc: 3280<\r><\n>
      511, 1015<\r><\n>
      !TSP:SEND:TNR<\n>
      Send failed!<\r><\n>
      !TSP:SEND:TNR<\n>
      vcc: 3280<\r><\n>
      511, 1017<\r><\n>
      !TSP:SEND:TNR<\n>
      Send failed!<\r><\n>
      !TSP:SEND:TNR<\n>
      vcc: 3280<\r><\n>
      511, 1015<\r><\n>
      !TSP:SEND:TNR<\n>
      Send failed!<\r><\n>
      TSM:FPAR<\n>
      TSP:MSG:SEND 10-10-255-255 s=255,c=3,t=7,pt=0,l=0,sg=0,ft=0,st=bc:<\n>
      !TSP:SEND:TNR<\n>
      vcc: 3280<\r><\n>
      511, 1018<\r><\n>
      !TSP:SEND:TNR<\n>
      Send failed!<\r><\n>
      !TSP:SEND:TNR<\n>
      vcc: 3280<\r><\n>
      511, 1017<\r><\n>
      !TSP:SEND:TNR<\n>
      Send failed!<\r><\n>
      !TSP:SEND:TNR
      

      After the Gateway is up again the "Light Sensor"-Node still can't find back the Gateway

      And the gateways is somehow doing nothing .. at least I do not understand what it is doing.

      .scandone<\n>
      state: 0 -> 2 (b0)<\n>
      state: 2 -> 3 (0)<\n>
      state: 3 -> 5 (10)<\n>
      add 0<\n>
      aid 1<\n>
      cnt <\n>
      <\n>
      connected with FRITZ!Box Fon WLAN 7390, channel 11<\n>
      dhcp client start...<\n>
      .............ip:192.168.178.67,mask:255.255.255.0,gw:192.168.178.1<\n>
      .IP: 192.168.178.67<\r><\n>
      0;255;3;0;9;No registration required<\n>
      0;255;3;0;9;Init complete, id=0, parent=0, distance=0, registration=1<\n>
      IP: 192.168.178.67<\r><\n>
      0;255;3;0;9;Attempting MQTT connection...<\n>
      0;255;3;0;9;MQTT connected<\n>
      0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:<\n>
      0;255;3;0;9;TSP:MSG:BC<\n>
      0;255;3;0;9;TSP:MSG:FPAR REQ (sender=10)<\n>
      0;255;3;0;9;TSP:CHKUPL:OK (FLDCTRL)<\n>
      0;255;3;0;9;TSP:MSG:GWL OK<\n>
      0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
      pm open,type:2 0<\n>
      0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:<\n>
      0;255;3;0;9;TSP:MSG:BC<\n>
      0;255;3;0;9;TSP:MSG:FPAR REQ (sender=10)<\n>
      0;255;3;0;9;TSP:CHKUPL:OK<\n>
      0;255;3;0;9;TSP:MSG:GWL OK<\n>
      0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
      0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:<\n>
      0;255;3;0;9;TSP:MSG:BC<\n>
      0;255;3;0;9;TSP:MSG:FPAR REQ (sender=10)<\n>
      0;255;3;0;9;TSP:CHKUPL:OK<\n>
      0;255;3;0;9;TSP:MSG:GWL OK<\n>
      0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
      0;255;3;0;9;TSP:SANCHK:OK<\n>
      0;255;3;0;9;TSP:SANCHK:OK<\n>
      0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:<\n>
      0;255;3;0;9;TSP:MSG:BC<\n>
      0;255;3;0;9;TSP:MSG:FPAR REQ (sender=10)<\n>
      0;255;3;0;9;TSP:CHKUPL:OK<\n>
      0;255;3;0;9;TSP:MSG:GWL OK<\n>
      0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
      0;255;3;0;9;TSP:MSG:READ 10-10-255 s=255,c=3,t=7,pt=0,l=0,sg=0:
      

      I can see that the gateway is receiving some messages from the node but it "fails?!" to respond accordingly?!

      Anybody could enlighten me?

      Gatewaycode = 99,99% vanilla except credentials and mqtt broker (mosquitto)

      "light sensor" node code only for completenss, ignore the stuff that is commented out

      #define MY_NODE_ID 10 <--- manual node id is set!

      #include <Streaming.h>
      
      
      /**
       * The MySensors Arduino library handles the wireless radio link and protocol
       * between your home built sensors/actuators and HA controller of choice.
       * The sensors forms a self healing radio network with optional repeaters. Each
       * repeater and gateway builds a routing tables in EEPROM which keeps track of the
       * network topology allowing messages to be routed to nodes.
       *
       * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
       * Copyright (C) 2013-2015 Sensnology AB
       * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
       *
       * Documentation: http://www.mysensors.org
       * Support Forum: http://forum.mysensors.org
       *
       * This program is free software; you can redistribute it and/or
       * modify it under the terms of the GNU General Public License
       * version 2 as published by the Free Software Foundation.
       *
       *******************************
       *
       * REVISION HISTORY
       * Version 1.0 - Henrik EKblad
       * 
       * DESCRIPTION
       * Example sketch showing how to measue light level using a LM393 photo-resistor 
       * http://www.mysensors.org/build/light
       */
      
      #define MY_NODE_ID 10
      #define MY_BAUD_RATE 9600
      
      // Enable debug prints to serial monitor
      #define MY_DEBUG 
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      
      #include <SPI.h>
      #include <MySensors.h>  
      
      #define CHILD_ID_LIGHT 0
      #define LIGHT_SENSOR_ANALOG_PIN A3
      
      unsigned long SLEEP_TIME = 1000; // Sleep time between reads (in milliseconds)
      
      MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
      int lastLightLevel;
      
      //#include "WatchdogAVR.h"
      //typedef WatchdogAVR WatchdogType;
      //WatchdogType Watchdog;
      
      void setup()
      {
        //Watchdog.disable();
        //int countdownMS = Watchdog.enable();
        
        //Serial.print("Enabled the watchdog with max countdown of ");
        //Serial.print(countdownMS, DEC);
        //Serial.println(" milliseconds!");
        //Serial.println();
        
        //Serial.begin(57600);
        Serial.println("setup() begin");
          // LightSensor
        pinMode(A3,INPUT_PULLUP);
        pinMode(A2,OUTPUT);
        digitalWrite(A2,LOW);
      }
      void presentation()  {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Light Sensor", "1.0");
      
        // Register all sensors to gateway (they will be created as child devices)
        present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
      }
      
      void loop()      
      {     
        static long vcc = readVcc();
        static int vccpercent = map(vcc,2400,3007,0,100);
        sendBatteryLevel(max(min(vccpercent,100),0),false);
        Serial << "vcc: " << vcc << endl;
        // Required for ack
        //wait(100);
        
        analogRead(LIGHT_SENSOR_ANALOG_PIN);
        int lightLevel_raw = analogRead(LIGHT_SENSOR_ANALOG_PIN);
        int lightLevel = (1023-lightLevel_raw)/10.23; // as of 1023 !!
        lightLevel = 511;
        Serial.print(lightLevel);
        Serial.print(", ");
        Serial.println(lightLevel_raw);
        //if (lightLevel != lastLightLevel) {
            if(!send(msg.set(lightLevel),true))
              Serial.println("Send failed!");
            lastLightLevel = lightLevel;
        //}
        //Serial.print("RETR=");
        //Serial.println((0x0F & RF24_retrycount()));
        wait(100);
        sleep(SLEEP_TIME);
      }
      // https://forum.mysensors.org/topic/3463/m_ack_variable-or-m_set_variable/2
      void receive(const MyMessage &message) {
        if (message.isAck()) {
            Serial.println("This is an ack from gateway");
            //Serial.println("Reset Watchdog!");
            //Watchdog.reset();
            }
      }
      

      I got headache from this line:

      0;255;3;0;9;!TSP:MSG:SEND 0-0-10-10 s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=fail:0<\n>
      

      After the node requsts a parent .. isn't the node supposed to listen for the response? Where should this happen in the code?!

      T Offline
      T Offline
      tekka
      Admin
      wrote on last edited by
      #2

      @cimba007 I assume

      wait(100)
      sleep(SLEEP_TIME)
      

      is too short to fully reconnect.

      Try this code instead (this prevents the node from sleeping if transport is not operational)

      if(isTransportOK()){
          wait(100);
          sleep(SLEEP_TIME);
        } 
        else {
          wait(SLEEP_TIME);
        }
      
      cimba007C 1 Reply Last reply
      1
      • T tekka

        @cimba007 I assume

        wait(100)
        sleep(SLEEP_TIME)
        

        is too short to fully reconnect.

        Try this code instead (this prevents the node from sleeping if transport is not operational)

        if(isTransportOK()){
            wait(100);
            sleep(SLEEP_TIME);
          } 
          else {
            wait(SLEEP_TIME);
          }
        
        cimba007C Offline
        cimba007C Offline
        cimba007
        wrote on last edited by
        #3

        @tekka I will try it at once! I was thinking about something like this too. Thanks for pointing out that using isTransportOK() might be the solution.

        A quick first test is looking very good. :relieved:

        Is it possible to include this wait in the send-function? The self-healing feature of the network would be completly transparent to the enduser. Maybe add some configurable timeout function or another paremeter to send?

        1 Reply Last reply
        0
        • solaS Offline
          solaS Offline
          sola
          wrote on last edited by
          #4

          I have the exact same problem: the node never reconnects to gateway after a gateway outage.

          In my case it is an ethernet MQTTClientGateway and a humidity node.

          I have experimented with your suggestion and found that 1000ms was still not enough for a full reconnect before the node goes to sleep, so I made it 3000ms. This seems to allow a reconnect all the time (at least in my environment).

            // @TODO remove after testing gateway outage
            if (!isTransportOK()) {
              #ifdef MY_DEBUG
              Serial.print("Transport ERROR. Waiting for a proper transport reconnect");
              #endif
              wait(3000);
            }
          
            // Sleep for a while to save energy
            sleep(UPDATE_INTERVAL); 
          

          I am unsure why MySensors doesn't have this self-healing element built-in. Maybe it is only a bug, maybe it has some deeper reason.

          1 Reply Last reply
          0

          Hello! It looks like you're interested in this conversation, but you don't have an account yet.

          Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

          With your input, this post could be even better 💗

          Register Login
          Reply
          • Reply as topic
          Log in to reply
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes


          14

          Online

          12.0k

          Users

          11.2k

          Topics

          113.4k

          Posts


          Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
          • Login

          • Don't have an account? Register

          • Login or register to search.
          • First post
            Last post
          0
          • MySensors
          • OpenHardware.io
          • Categories
          • Recent
          • Tags
          • Popular