Pomoc s WLED

Integrace a HACS
Jezinka
Začínající autor
Začínající autor
Příspěvky: 40
Registrován: 06. leden 2022, 09:34
Dal poděkování: 2 poděkování
Dostal poděkování: 1 poděkování

Re: Pomoc s WLED

Příspěvek od Jezinka »

Super kod!
Tak jsem si nahrál tvůj kod a funguje perfektně pro ověřování. OU a já se s tím trápím už od doby co jsem napsal.. denně v tom ležím, manželka nešťastná a já taky.

Zjistil jsem několik poznatků. Pokud světla najíždějí, tak já je mohu kdykoliv přerušit a zhasnout pomocí příkazu 0.
Pokud světla zhasínají, tak je mohu rozsvítit pouze pokud je změněn řádek 51 na

Kód: Vybrat vše

if ((previousUserVar0 == 1 && userVar0 == 2) || (previousUserVar0 == 2 && userVar0 == 1)) wipeState = 0;

Ale pouze v protisměru to funguje. Pokud přidám podmínky aby cokoliv je větší než 0 spouštělo wipeState = 0 tak pak nejde nic... A to mi nedává smysl. Musí být v kodu něco níž co to omezuje ale nenašel jsem to.

Pokud provedu zhasínání a do toho znovu rozsvícení v protisměru, tak se ve výpisu vůbec neobjeví wipeState = 0 přestože jí vlastně nastavuje v podmínce. To je také divné.

Jezinka
Začínající autor
Začínající autor
Příspěvky: 40
Registrován: 06. leden 2022, 09:34
Dal poděkování: 2 poděkování
Dostal poděkování: 1 poděkování

Re: Pomoc s WLED

Příspěvek od Jezinka »

Ještě jak si psal, že při vypínání vidíš změnu na 1, tak já to vidím tedy ať už z 1 nebo z 2 na 0, pak na chvilku na zpět na ty hodnoty 1 nbo dva a pak zpět na 0. Nevím

Jinak jak si psal že je logika divoká tak mě se zdá takto od začátku (ale to bude proto že tomu zdaleka nerozumím jako ty). Nicméně myslím si že pro mě by bylo nejlepší řešení, pokud by existovali 4 příkazy:
U0 = 1 - rozsviť jedním směrem
U0 = 2 - rozsviť druhým směrem
U0 = 3 - zhasni jedním směrem
U0 = 4 - zhasni druhým směrem

Ale možná to je nesmysl a bylo by to složitější. Ale takto bych to asi programoval já. Nemuselo by se tam složitě vymýšlet přepínaní stavů atd.

Případně ponechat příkazy jak jsou jen s tím rozdílem, že 1 a 2 by uměli rozsvítit kdykoliv, tedy i v procesu zhasínání.

Jezinka
Začínající autor
Začínající autor
Příspěvky: 40
Registrován: 06. leden 2022, 09:34
Dal poděkování: 2 poděkování
Dostal poděkování: 1 poděkování

Re: Pomoc s WLED

Příspěvek od Jezinka »

Tak jsem upravil kod na řádku 51 na toto:

Kód: Vybrat vše

    if ((previousUserVar0 == 1 && userVar0 == 2) || (previousUserVar0 == 2 && userVar0 == 1) || (previousUserVar0 == 1 && userVar0 == 1) || (previousUserVar0 == 2 && userVar0 == 2)) wipeState = 0;
a spustil první rozsvícení. Výpis je tento:

Kód: Vybrat vše

Start:
userVar0:0 previousUserVar0:0 wipeState:0

Zmena> userVar0 z:0 na:1
D> userVar0:1 previousUserVar0:0 wipeState:0

D> userVar0:1 previousUserVar0:1 wipeState:1
A světla se nerozsvítí. Ale něco se děje v nějakém cyklu na pozadí, protože když v API prohlížeče změním třeba efekt, tak to opět skončí na efekt WIPE, takže něco jej neustále dokola zapíná.
Dalo by se to nějak poslat na serial a zjistit co se tam děje?

Zdá se, že ten seriál nevypisuje všechny skutečné hodnoty. Protože nikdy nevypíše wipeState = 0 a přitom 0 musí být mnohokrát nastavena. Může to tak být?

Jezinka
Začínající autor
Začínající autor
Příspěvky: 40
Registrován: 06. leden 2022, 09:34
Dal poděkování: 2 poděkování
Dostal poděkování: 1 poděkování

Re: Pomoc s WLED

Příspěvek od Jezinka »

Výsledek testu.
Správný (větší) obrázek je k tomuto kodu:

Kód: Vybrat vše

    if ((previousUserVar0 == 1 && userVar0 == 2) || (previousUserVar0 == 2 && userVar0 == 1) || (previousUserVar0 == 1 && userVar0 == 1) || (previousUserVar0 == 2 && userVar0 == 2)) wipeState = 0; 
Druhý obrázek který světla nerozsvítí a zacyklí se je k tomuto kodu:

Kód: Vybrat vše

    if ((previousUserVar0 == 1 && userVar0 == 2) || (previousUserVar0 == 2 && userVar0 == 1)) wipeState = 0; 
Oba kody by měli spustit rozsvícení světel. Dělá to ale jen ten kratší kod.
Sekvence spuštění byla:
1
0
2
0
Přílohy
Image 14.png
Image 13.png

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Pomoc s WLED

Příspěvek od kiklhorn »

Nelíbí se mi (už z principu) nastavování userVar0 kódem, ale co už, přepisovat se mi to fakt nechce.
Přepsal jsem si to ctrl x+v do trošičku jiné struktury, ale ve výsledku jsou změněny jenom asi dva řádky původního kódu - najdeš je - je na nich použito userVar0 a číslo 6. Takže si buď uprav původní kód, nebo použij tento.

A vyházej si z toho všechny zbytečné testovací proměnné a Serial.print....

Řekl bych že se chová trochu lépe.

Kód: Vybrat vše

#include "wled.h"

/*
 * Usermods allow you to add own functionality to WLED more easily
 * See: https://github.com/Aircoookie/WLED/wiki/Add-own-functionality
 * 
 * This is Stairway-Wipe as a v2 usermod.
 * 
 * Using this usermod:
 * 1. Copy the usermod into the sketch folder (same folder as wled00.ino)
 * 2. Register the usermod by adding #include "stairway-wipe-usermod-v2.h" in the top and registerUsermod(new StairwayWipeUsermod()) in the bottom of usermods_list.cpp
 */

class StairwayWipeUsermod : public Usermod {
  private:
    //Private class members. You can declare variables and functions only accessible to your usermod here
    unsigned long lastTime = 0;
    byte wipeState = 0; //0: inactive 1: wiping 2: solid
    unsigned long timeStaticStart = 0;
    uint16_t previousUserVar0 = 0;
    uint16_t uv0 = 0;
    uint16_t puv0 = 0;
    byte wipest = 0;
    byte prvni_vypis = 1;

//comment this out if you want the turn off effect to be just fading out instead of reverse wipe
#define STAIRCASE_WIPE_OFF
  public:

    void loop() {
  //userVar0 (U0 in HTTP API):
  //has to be set to 1 if movement is detected on the PIR that is the same side of the staircase as the ESP8266
  //has to be set to 2 if movement is detected on the PIR that is the opposite side
  //can be set to 0 if no movement is detected. Otherwise LEDs will turn off after a configurable timeout (userVar1 seconds)
  if (prvni_vypis) {
    Serial.println((String)"Start:");
    Serial.println((String)"userVar0:"+userVar0+" previousUserVar0:"+previousUserVar0+" wipeState:"+wipeState);
    prvni_vypis = 0;
  }
  if ((previousUserVar0 != puv0) || (userVar0 != uv0) || (wipeState != wipest)) {
    Serial.println();
    if (userVar0 != uv0) Serial.println((String)"Zmena> userVar0 z:"+uv0+" na:"+userVar0);
    Serial.println((String)"D> userVar0:"+userVar0+" previousUserVar0:"+previousUserVar0+" wipeState:"+wipeState);
    puv0 = previousUserVar0;
    uv0 = userVar0;
    wipest = wipeState;
  }

  if (userVar0 > 0)
  {
    if ((previousUserVar0 == 1 && userVar0 == 2) || (previousUserVar0 == 2 && userVar0 == 1)) wipeState = 3; //turn off if other PIR triggered
    previousUserVar0 = userVar0;
  } else {
    resetuj();
  }    
  switch(wipeState) {
    case 0: {
      if (userVar0 > 0) {
        startWipe();
        wipeState = 1;
        break;
      }
    }
    case 1: {
      if (userVar0 > 0) {
        //wiping
        Serial.print((String)"1");
        uint32_t cycleTime = 360 + (255 - effectSpeed)*75; //this is how long one wipe takes (minus 25 ms to make sure we switch in time)
        if (millis() + strip.timebase > (cycleTime - 25)) { //wipe complete
          effectCurrent = FX_MODE_STATIC;
          timeStaticStart = millis();
          colorUpdated(CALL_MODE_NOTIFICATION);
          wipeState = 2;
        }
        break;
      }
    }
    case 2: {
      if (userVar0 > 0) {
        //static
        Serial.print((String)"2");
        if (userVar1 > 0) //if U1 is not set, the light will stay on until second PIR or external command is triggered
        {
          if (millis() - timeStaticStart > userVar1*1000) wipeState = 3;
        }
        break;
      }
    }
    case 3: {
      if (userVar0 > 0) {
        //switch to wipe off
        Serial.print((String)"----------------------------------------------------------------------------------------------------------------------------------------------------");
        // #ifdef STAIRCASE_WIPE_OFF
        effectCurrent = FX_MODE_COLOR_WIPE;
        strip.timebase = 360 + (255 - effectSpeed)*75 - millis(); //make sure wipe starts fully lit
        colorUpdated(CALL_MODE_NOTIFICATION);
        wipeState = 4;
        // #else
        // turnOff();
        // #endif
        break;
      }
    }
    default: {
      if (userVar0 > 0) {
        
        
        Serial.print((String)"x");
        if (millis() + strip.timebase > (725 + (255 - effectSpeed)*150)) turnOff(); //wipe complete
        if (userVar0 != 6) { userVar0 = previousUserVar0; wipeState = 0; }
        break;
      }
    }
  }
}

    void readFromJsonState(JsonObject& root)
    {
      userVar0 = root["user0"] | userVar0; //if "user0" key exists in JSON, update, else keep old value
      //if (root["bri"] == 255) Serial.println(F("Don't burn down your garage!"));
    }

    uint16_t getId()
    {
      return USERMOD_ID_EXAMPLE;
    }

    void resetuj()
    {
      wipeState = 0; //reset for next time
      if (previousUserVar0) {
        #ifdef STAIRCASE_WIPE_OFF
        Serial.println((String)"R+start:");
        Serial.println((String)"userVar0:"+userVar0+" previousUserVar0:"+previousUserVar0+" wipeState:"+wipeState);
        // userVar0 = previousUserVar0;
        userVar0 = 6; //neco jineho ve vyznamu 0, testuji v case 4: (default), pokud bude neco jineho menim wipestate
        wipeState = 3;
        #else
        turnOff();
        #endif
        Serial.println((String)"R+end:");
        Serial.println((String)"userVar0:"+userVar0+" previousUserVar0:"+previousUserVar0+" wipeState:"+wipeState);
        // Serial.print((String)"r+");
      }
      previousUserVar0 = 0;
      Serial.print((String)"r-");
    }

    void startWipe()
    {
    bri = briLast; //turn on
    transitionDelayTemp = 0; //no transition
    effectCurrent = FX_MODE_COLOR_WIPE;
    resetTimebase(); //make sure wipe starts from beginning

    //set wipe direction
    WS2812FX::Segment& seg = strip.getSegment(0);
    bool doReverse = (userVar0 == 2);
    seg.setOption(1, doReverse);

    colorUpdated(CALL_MODE_NOTIFICATION);
    }

    void turnOff()
    {
    #ifdef STAIRCASE_WIPE_OFF
    transitionDelayTemp = 0; //turn off immediately after wipe completed
    #else
    transitionDelayTemp = 4000; //fade out slowly
    #endif
    bri = 0;
    colorUpdated(CALL_MODE_NOTIFICATION);
    wipeState = 0;
    userVar0 = 0;
    previousUserVar0 = 0;
    }



   //More methods can be added in the future, this example will then be extended.
   //Your usermod will remain compatible as it does not need to implement all methods from the Usermod base class!
};
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Jezinka
Začínající autor
Začínající autor
Příspěvky: 40
Registrován: 06. leden 2022, 09:34
Dal poděkování: 2 poděkování
Dostal poděkování: 1 poděkování

Re: Pomoc s WLED

Příspěvek od Jezinka »

To je naprosto dokonalé. Již jsem otestoval a dělá to to co jsem zamýšlel. Jen se zeptám, jestli je do budoucna (až tomu budu víc rozumět) změnit ještě funkci tak, že by se rozsvítila od pozice mezi zhasnutým schodem a rozsvíceným schodem směrem ke mě? Nyní to celé zhasne a rozsvítí se od začátku směrem ode mě (ne, není to vůbec špatné, efekt má nejvyšší rychlost takže je to otázka necelé vteřiny), ale jen pokud by to šlo, že by si to hlídalo nějak čas a pozici ve které se nachází "zhasínání" ve chvíli kdy dojde k rozsvícení.

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Pomoc s WLED

Příspěvek od kiklhorn »

Dokonalé určitě ne, ten kód se mi vůbec nelíbí.
Časová synchronizace "celý pásek" je kolem wipeState=3

Určitě jde cokoli si vymyslíš, zkus dokumentaci pro vlastní usermods, zjisti jaké funkce jsou k dispozici a jaké proměnné to poskytuje (pozice?, čas?) a napiš si svůj usermod od začátku. Klidně začni jen tím že to nebude dělat nic jiného než že po zapnutí rosvítí konkrétní počet LEDek.

Určitě se budu nějakým osvětlením schodů zabývat v průběhu rekonstrukce baráku, ale ta mi už přes rok stojí. A netuším jestli zrovna přes WLED.
Tohle mi přišlo jen jako zajímavý hlavolam.
Neříkám že nedostanu nějaký nápad na něco zajímavého/užitečného s adresovatelnými RGB...
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Jezinka
Začínající autor
Začínající autor
Příspěvky: 40
Registrován: 06. leden 2022, 09:34
Dal poděkování: 2 poděkování
Dostal poděkování: 1 poděkování

Re: Pomoc s WLED

Příspěvek od Jezinka »

No ty do mě vkládáš asi velké naděje že bych něco zvládl v podobě user modu. Já C++ vůbec neznám a stěží jsem se orientoval jen v tom kodu co byl. Zjistil jsem, že jde mnoho věcí třeba upravovat ve WLED.h a nastavit třeba SSID a heslo pro Wifi a MQTT. To jsem udělal, ale po kompilaci a nahrání tam nic nezůstalo, takže asi jsem nepochopil jak to funguje.
Co se týká těch sdílených příkazů, tak to nejspíš je chyba WLED nových verzí, protože dříve to fungovalo bez problémů a nyní i bez úpravy tvého kodu to není ono.
Pověz mi, jak dlouho programuješ? Řekl bych celej život. Já jen dělal kurz Python a naprogramoval jsem piškvorky na jednom řádku i s umělou inteligencí, ale trvalo mi to dlouho a je to už rok. Od té doby jsem vlastně neměl čas kvůli náročné práci a dětem.

Ona existuje ještě jedna verze usermodu na schody, která používá co schod to segment (dají se pak dělat různé efekty za běhu), ale ačkoliv je kod mnohem delší, tak se zdá že to umí pouze zapnout buď ze spodu nebo ze shora a automaticky se to vypíná po zvoleném čase podle posledního průchodu. Jenže rychlost je daná jak směrem nahoru tak dolu která je stejná. U tohoto stávajícího se mi líbí, že jsem si nastavil rychlé rozsvícení schodiště ale po opuštění pomalé zhasínání, abych stihl dojít do jiné místnosti a ještě schody pomalu svítili.
Ryhclost jsem vyřešil implementací přímo do kodu, ale jsou ještě další věci které musím vyřešit, protože když se světla zhasnou, tak jsem nastavil jeden efekt tak, aby svítili jen krajní LED na každém schodě modře a pak to působí jak runway na letišti.

kiklhorn
Moderátor
Moderátor
Příspěvky: 901
Registrován: 03. červenec 2021, 18:35
Dal poděkování: 107 poděkování
Dostal poděkování: 210 poděkování

Re: Pomoc s WLED

Příspěvek od kiklhorn »

princip těch usermod -
hlavní program si dělá svoje a při každém cyklu zavolá tvoji loop smyčku.
Tam si uděláš co potřebuješ (zavoláš funkce které ti dává hlavní program k dispozici) a nezdržuješ (proto tam není žádný delay() ale ta doba v ms.
Kdyby tvůj kód byl samotný tak by - rosviť ledku, počkej, rosviť další... tady to "počkej" nahrazuješ zjištováním jestli už uplynulo dost času abys udělal další krok.

Rozhodně nejsem programátor. Programuju/neprogramuju někdy od osmdesátek - papírový "počítač" s proužky a kód jsem si počítal já místo procesoru a zapisoval registry na proužky :D,
pak nějaké osmibity, stroják, basic, pascal. Dneska je mi asi jedno jaký jazyk, všude se válí tuny dokumentace a ještě větší hromady hotového kódu volně k použití. Na skoro všechno jsou nějaké knihovny. Píšu si jen to co potřebuju a nevygooglím. Nejraději asi pyhon/perl/C.
Vše co si přinesu domů je buď Shelly, nebo to skončí buď pod ESPhome nebo pod Zigbee2mqtt.
Ajťák co pamatuje BBS a OS/2 Warp a je mu jedno o jaký systém nebo síťařinu běží.
HA OS jako jedna z Proxmox VM na Odroid H3+/64GB https://github.com/tteck/Proxmox

Odpovědět

Zpět na „Integrace“