Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
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
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Hardware
  4. Lay-Z-Spa Wifi Control

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.1k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.8k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

Lay-Z-Spa Wifi Control

Scheduled Pinned Locked Moved Hardware
211 Posts 76 Posters 50.5k Views 72 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.
  • Agria4800A Agria4800

    @agria4800 : Anbei das Script für die Leute mit dem Layz Hawaii oder Maldives (mit den Hydrojet Düsen) 😉

    // https://forum.iobroker.net/topic/51603/lay-z-spa-wifi-control?_=1655490942180&lang=de
    
    /*Notes for me
    
    Last filter change was 0.00 day(s) ago.  RESET Button gedrückt!
    {"CMD":10,"VALUE":0,"XTIME":1658859596,"INTERVAL":0}
    
    
    Last chlorine add was 0.00 day(s) ago.
    {"CMD":9,"VALUE":0,"XTIME":1658859652,"INTERVAL":0}
    */
    
    const Messages =  
    {
     "CONTENT": "STATES",
     "LCK": 0,
     "PWR": 0,
     "UNT": 1,
     "AIR": 0,
     "GRN": 0,
     "RED": 0,
     "FLT": 0,
     "TGT": 22,
     "TMP": 13,
     "CH1": 32,
     "CH2": 49,
     "CH3": 51,
     "HJT": 0,
     "BRT": 7
    }
    const ID = '0_userdata.0.Layz-Hydro';
    const MQTTINSTANCE = 0;
    const debug = true;
    /*
    {
     "CONTENT": "TIMES",
     "TIME": 1650746370,
     "CLTIME": 1644734714,
     "FTIME": 1644734719,
     "UPTIME": 41660,
     "PUMPTIME": 50,
     "HEATINGTIME": 24,
     "AIRTIME": 512,
     "JETTIME": 4294966,
     "COST": 0,
     "FINT": 4294967295,
     "CLINT": 4294967295,
     "KWH": null,
     "TTTT": -74677
    }
    */
    const STATES=[
       {
           _id: 'LCK',
           type: 'state',
           common: {
               name: 'lock',
               type: 'boolean',
               role: 'switch',
               read: true,
               write: false,
               desc: 'Lazy spa lock'
           },
           native: {}
       },
       {
           _id: 'PWR',
           type: 'state',
           common: {
               name: 'power',
               type: 'boolean',
               role: 'switch.power',
               read: true,
               write: true,
               desc: 'Lazy spa power'
           },
           native: {}
       },
       {
       _id: 'UNT',
       type: 'state',
       common: {
           name: 'unit',
           type: 'number',
           role: 'value',
           read: true,
           write: true,
           max: 1,
           desc: 'Lazy spa unit',
           states: {
       			0: 'Farenheit',
       			1: 'Celsius'
       		}
       },
          native: {}
       },
       {
       _id: 'HJT',
       type: 'state',
       common: {
           name: 'Hydrojet',
           type: 'boolean',
           role: 'switch',
           read: true,
           write: true,
           desc: 'Lazy spa Hydrojets state'
       },
          native: {}
       },
       {
       _id: 'AIR',
       type: 'state',
       common: {
           name: 'bubbles',
           type: 'boolean',
           role: 'switch',
           read: true,
           write: true,
           desc: 'Lazy spa bubbles state'
       },
       native: {}
       },
       {
       _id: 'GRN',
       type: 'state',
       common: {
           name: 'Heating green',
           type: 'boolean',
           role: 'switch',
           read: true,
           write: false,
           desc: 'reached target temp.'
       },
       native: {}
       },
       {
       _id: 'RED',
       type: 'state',
       common: {
           name: 'Heating red',
           type: 'boolean',
           role: 'switch',
           read: true,
           write: false,
           desc: 'not reached target temp.'
       },
       native: {}
       },
       {
       _id: 'FLT',
       type: 'state',
       common: {
           name: 'pump',
           type: 'boolean',
           role: 'switch',
           read: true,
           write: true,
           desc: 'pump state'
       },    native: {}
       },
       {
       _id: 'HEATER',
       type: 'state',
       common: {
           name: 'heater',
           type: 'boolean',
           role: 'switch',
           read: true,
           write: true,
           desc: 'heater state'
       },
       native: {}
       },
       {
       _id: 'TGT',
       type: 'state',
       common: {
           name: 'target temp',
           type: 'number',
           role: 'level.temperature',
           min: 20,
           max: 40,
           steps: 1,
           read: true,
           write: true,
           desc: 'taget temp.'
       },
       native: {}
       },
       {
       _id: 'TMP',
       type: 'state',
       common: {
           name: 'temp',
           type: 'number',
           role: 'value.temperature',
           read: true,
           write: false,
           unit: '°C',
           desc: 'temp.'
       },
       native: {}
       },
    ]
    
    
    init();
    async function stateChange(obj){
       let id = obj.id
       let state = id.split('.').pop()
       let value = obj.state.val
       log('change Unit' + state)
       switch (state) {
           case 'UNT':
               setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":1,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
               log('change Unit')
           break;
           case 'TGT':
               setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":0,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
               log('change target temp. to '+ value);
           break;
           case 'AIR':
               value = value ? 1: 0 ;
               setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":2,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
               log('set bubbles to '+ value);
           break;
            case 'HJT':
               value = value ? 1: 0 ;
               setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":11,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
               log('set Hydrojets to '+ value);
           break;
           case 'HEATER':
               value = value ? 1: 0 ;
               setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":3,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
               log('set Heater to '+ value);
           break;
           case 'FLT':
               value = value ? 1: 0 ;
               setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":4,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
               log('set pump to '+ value);
           break;
        
    
    
     default:
       // Anweisungen werden ausgeführt,
       // falls keine der case-Klauseln mit expression übereinstimmt
       break;
    }
    
    
    
    }
    async function init(){
       await asyncForEach(STATES, async (obj, index) => {
           let id = ID +'.'+ obj._id
           if (!existsState(id)) {
               log('create state '+ id)
               await createStateAsync(id, obj.common)
           }
           else {
               log('skip state '+ id)
           }
           //set subscription
           if(obj.common.write){
               on({id: id, change:"any"} , function(obj) {
                   if(!obj.state.ack){
                       log('change state! '+ JSON.stringify(obj))
                       stateChange(obj)
                   }
               });
           }       
       });
       log('init done!')
    }
    async function setLazyStates(obj){
       try{
               let states = JSON.parse(obj)
               for (const [key, value] of Object.entries(states)) {
                   let statevalue = value
                   const found = STATES.find(state => state._id === key);
                   if(found){                 
                       if (found.common.type === 'boolean'){
                           statevalue = value === 1
                       }
                       await setStateAsync(ID +'.'+ key,statevalue,true)
                   }
               }
               //set heater state
               await setStateAsync(ID +'.HEATER',(states.GRN || states.RED) === 1,true)    
       }
       catch(e){
           console.log('Error in setting State '+ e)
       }
    
    }
    
    async function asyncForEach(array, callback) {
       for (let index = 0; index < array.length; index++) {
       	await callback(array[index], index, array);
       }
    }
    function log (msg){
       if(debug) console.log (msg)
    }
    
    on({id:'mqtt.'+ MQTTINSTANCE+'.layzspa.message', change:"ne"} , function(obj) {
       log('Lazyspa reached message! '+ JSON.stringify(obj.state))
       setLazyStates(obj.state.val)
    });
    
    

    Und so siehts dann aus...Bildschirmfoto 2022-08-12 um 21.17.52.png

    Grüße

    S Offline
    S Offline
    Smokey
    wrote on last edited by
    #69

    @agria4800 sagte in Lay-Z-Spa Wifi Control:

    Und so siehts dann aus...Bildschirmfoto 2022-08-12 um 21.17.52.png

    😞 ich hab den ganzen Threat jetzt x mal gelesen, raffe aber einfach nicht, wie ich per VIS die entsprechenden Kommandos absetzen kann, wie es oben im Bild zu sehen ist. Das sind doch keine direkten Datenpunkte, die einen Wert oder ein true/false erwarten. Ich sehe im Objekt-Baum hinter den Datenpunkten nur JASON files oder scripts. Was hab ich denn übersehen?

    B 1 Reply Last reply
    0
    • Lord ByronL Offline
      Lord ByronL Offline
      Lord Byron
      wrote on last edited by Lord Byron
      #70

      Sehr geiles Projekt. Genau das was mir noch fehlt für meinen Maldives Pool. Ich habe fünf v2 PCB bestellt. Falls sich hier auch Schweizer tummeln, die noch eines bräuchten, gerne PM an mich 😉

      Edit:
      Hab bereits alles Material bekommen und soweit mal installiert und konfiguriert. Ich benutze zwar kein ioBroker, sondern Mosquitto in HA, aber vielleicht kann mir ja trotzdem jemand hier einen Tip geben. Ich haben den Maldives mit Hydrojet, Verbindung zu Mosquitto steht und wird auch alles wunderbar in HA angezeigt... ...ausser die Hydrojet Düsen. Meiner Meinung nach müsste dies doch im neusten Release mit integriert sein?

      1 Reply Last reply
      0
      • Agria4800A Agria4800

        @agria4800 Hab´s grad irgendwie hinbekommen..😊 naja, hier mal meine Einstellungen, falls jemand hier die gleichen Probleme habe...
        Bildschirmfoto 2022-06-26 um 08.37.33.png Bildschirmfoto 2022-06-26 um 08.36.20.png

        Script wird auch gefüllt, danke fürs teilen 😉

        M Offline
        M Offline
        MiPl
        wrote on last edited by
        #71

        @agria4800
        Hallo, danke für die Screenshots zur Einrichtung von mqtt - Es klappt bei mir aber trotzdem nicht. Derzeit benutze ich den mqtt-Adapter 4.07. Habe die Einstellungen exakt so gemacht wie von Dir dargegestellt und unzählige Male versucht. Geht nicht. Auch ein Reset der Poolsteuerung und des ioBroker brachten keinen Erfolg. Beim Log bekomme ich auch keine Hilfe.

        Log-MQTT.jpg

        Ich habe in einem anderen Thread gelesen, dass der Adapter so lange auf Gelb bleibt, bis sich ein Device anmeldet/einwählt. Aber wie kann ich die Poolsteuerung sich aktiv einwählen lassen?

        Ich checks nicht.

        Danke für jede Hilfe.

        1 Reply Last reply
        0
        • M Offline
          M Offline
          MiPl
          wrote on last edited by
          #72

          @mipl
          ich habe zu meiner Frage einen neuen Beitrag aufgemacht: Keine Verbindung zu mqtt-Server/Broker

          1 Reply Last reply
          0
          • Agria4800A Agria4800

            @agria4800 : Anbei das Script für die Leute mit dem Layz Hawaii oder Maldives (mit den Hydrojet Düsen) 😉

            // https://forum.iobroker.net/topic/51603/lay-z-spa-wifi-control?_=1655490942180&lang=de
            
            /*Notes for me
            
            Last filter change was 0.00 day(s) ago.  RESET Button gedrückt!
            {"CMD":10,"VALUE":0,"XTIME":1658859596,"INTERVAL":0}
            
            
            Last chlorine add was 0.00 day(s) ago.
            {"CMD":9,"VALUE":0,"XTIME":1658859652,"INTERVAL":0}
            */
            
            const Messages =  
            {
             "CONTENT": "STATES",
             "LCK": 0,
             "PWR": 0,
             "UNT": 1,
             "AIR": 0,
             "GRN": 0,
             "RED": 0,
             "FLT": 0,
             "TGT": 22,
             "TMP": 13,
             "CH1": 32,
             "CH2": 49,
             "CH3": 51,
             "HJT": 0,
             "BRT": 7
            }
            const ID = '0_userdata.0.Layz-Hydro';
            const MQTTINSTANCE = 0;
            const debug = true;
            /*
            {
             "CONTENT": "TIMES",
             "TIME": 1650746370,
             "CLTIME": 1644734714,
             "FTIME": 1644734719,
             "UPTIME": 41660,
             "PUMPTIME": 50,
             "HEATINGTIME": 24,
             "AIRTIME": 512,
             "JETTIME": 4294966,
             "COST": 0,
             "FINT": 4294967295,
             "CLINT": 4294967295,
             "KWH": null,
             "TTTT": -74677
            }
            */
            const STATES=[
               {
                   _id: 'LCK',
                   type: 'state',
                   common: {
                       name: 'lock',
                       type: 'boolean',
                       role: 'switch',
                       read: true,
                       write: false,
                       desc: 'Lazy spa lock'
                   },
                   native: {}
               },
               {
                   _id: 'PWR',
                   type: 'state',
                   common: {
                       name: 'power',
                       type: 'boolean',
                       role: 'switch.power',
                       read: true,
                       write: true,
                       desc: 'Lazy spa power'
                   },
                   native: {}
               },
               {
               _id: 'UNT',
               type: 'state',
               common: {
                   name: 'unit',
                   type: 'number',
                   role: 'value',
                   read: true,
                   write: true,
                   max: 1,
                   desc: 'Lazy spa unit',
                   states: {
               			0: 'Farenheit',
               			1: 'Celsius'
               		}
               },
                  native: {}
               },
               {
               _id: 'HJT',
               type: 'state',
               common: {
                   name: 'Hydrojet',
                   type: 'boolean',
                   role: 'switch',
                   read: true,
                   write: true,
                   desc: 'Lazy spa Hydrojets state'
               },
                  native: {}
               },
               {
               _id: 'AIR',
               type: 'state',
               common: {
                   name: 'bubbles',
                   type: 'boolean',
                   role: 'switch',
                   read: true,
                   write: true,
                   desc: 'Lazy spa bubbles state'
               },
               native: {}
               },
               {
               _id: 'GRN',
               type: 'state',
               common: {
                   name: 'Heating green',
                   type: 'boolean',
                   role: 'switch',
                   read: true,
                   write: false,
                   desc: 'reached target temp.'
               },
               native: {}
               },
               {
               _id: 'RED',
               type: 'state',
               common: {
                   name: 'Heating red',
                   type: 'boolean',
                   role: 'switch',
                   read: true,
                   write: false,
                   desc: 'not reached target temp.'
               },
               native: {}
               },
               {
               _id: 'FLT',
               type: 'state',
               common: {
                   name: 'pump',
                   type: 'boolean',
                   role: 'switch',
                   read: true,
                   write: true,
                   desc: 'pump state'
               },    native: {}
               },
               {
               _id: 'HEATER',
               type: 'state',
               common: {
                   name: 'heater',
                   type: 'boolean',
                   role: 'switch',
                   read: true,
                   write: true,
                   desc: 'heater state'
               },
               native: {}
               },
               {
               _id: 'TGT',
               type: 'state',
               common: {
                   name: 'target temp',
                   type: 'number',
                   role: 'level.temperature',
                   min: 20,
                   max: 40,
                   steps: 1,
                   read: true,
                   write: true,
                   desc: 'taget temp.'
               },
               native: {}
               },
               {
               _id: 'TMP',
               type: 'state',
               common: {
                   name: 'temp',
                   type: 'number',
                   role: 'value.temperature',
                   read: true,
                   write: false,
                   unit: '°C',
                   desc: 'temp.'
               },
               native: {}
               },
            ]
            
            
            init();
            async function stateChange(obj){
               let id = obj.id
               let state = id.split('.').pop()
               let value = obj.state.val
               log('change Unit' + state)
               switch (state) {
                   case 'UNT':
                       setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":1,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                       log('change Unit')
                   break;
                   case 'TGT':
                       setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":0,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                       log('change target temp. to '+ value);
                   break;
                   case 'AIR':
                       value = value ? 1: 0 ;
                       setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":2,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                       log('set bubbles to '+ value);
                   break;
                    case 'HJT':
                       value = value ? 1: 0 ;
                       setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":11,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                       log('set Hydrojets to '+ value);
                   break;
                   case 'HEATER':
                       value = value ? 1: 0 ;
                       setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":3,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                       log('set Heater to '+ value);
                   break;
                   case 'FLT':
                       value = value ? 1: 0 ;
                       setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":4,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                       log('set pump to '+ value);
                   break;
                
            
            
             default:
               // Anweisungen werden ausgeführt,
               // falls keine der case-Klauseln mit expression übereinstimmt
               break;
            }
            
            
            
            }
            async function init(){
               await asyncForEach(STATES, async (obj, index) => {
                   let id = ID +'.'+ obj._id
                   if (!existsState(id)) {
                       log('create state '+ id)
                       await createStateAsync(id, obj.common)
                   }
                   else {
                       log('skip state '+ id)
                   }
                   //set subscription
                   if(obj.common.write){
                       on({id: id, change:"any"} , function(obj) {
                           if(!obj.state.ack){
                               log('change state! '+ JSON.stringify(obj))
                               stateChange(obj)
                           }
                       });
                   }       
               });
               log('init done!')
            }
            async function setLazyStates(obj){
               try{
                       let states = JSON.parse(obj)
                       for (const [key, value] of Object.entries(states)) {
                           let statevalue = value
                           const found = STATES.find(state => state._id === key);
                           if(found){                 
                               if (found.common.type === 'boolean'){
                                   statevalue = value === 1
                               }
                               await setStateAsync(ID +'.'+ key,statevalue,true)
                           }
                       }
                       //set heater state
                       await setStateAsync(ID +'.HEATER',(states.GRN || states.RED) === 1,true)    
               }
               catch(e){
                   console.log('Error in setting State '+ e)
               }
            
            }
            
            async function asyncForEach(array, callback) {
               for (let index = 0; index < array.length; index++) {
               	await callback(array[index], index, array);
               }
            }
            function log (msg){
               if(debug) console.log (msg)
            }
            
            on({id:'mqtt.'+ MQTTINSTANCE+'.layzspa.message', change:"ne"} , function(obj) {
               log('Lazyspa reached message! '+ JSON.stringify(obj.state))
               setLazyStates(obj.state.val)
            });
            
            

            Und so siehts dann aus...Bildschirmfoto 2022-08-12 um 21.17.52.png

            Grüße

            M Offline
            M Offline
            MiPl
            wrote on last edited by
            #73

            @agria4800
            Hallo Agria4800,

            ich habe das Script erfolgreich in Betrieb nehmen können (vielen Dank an die Ersteller). Ich bekomme derzeit alle ca. 4 Sekunden einen Eintrag im Log und eine entsprechende Aktualisierung der Daten, da sich z. B. die (virtuelle) Temperatur minimal ändert. Könnte man hier nicht auf Zentel-Grad Genauigkeit reduzieren, um die Rechnerlast ein wenig runterzufahren? Ich habe von Java Null Check, daher kann ich es nicht machen. Habe mir übergangsweise so geholfen und den Logeintrag auskommentiert. Aber das ist ja nicht Sinn der Sache.

            Danke im Voraus.

            1 Reply Last reply
            0
            • MeistertrM Meistertr

              Hallo Leute ich arbeite gerade daran meinen Lay-Z-Spa Smarthome kompatibel zu machen. bin da auf ein tolles Projekt gestoßen mit einem Esp8266 Wollte hierfür die Platinen bestellen hat noch jemand zufällig Interesse? Eine Platine alleine ist ein bisschen zu teuer... würde zwischen 6 und 11 Euro liegen die platine je nachdem wieviele es werden...

              Platine : https://easyeda.com/editor#id=a1b94bf9fc01407591a9e0fec6a813b3
              Projekt: https://github.com/visualapproach/WiFi-remote-for-Bestway-Lay-Z-SPA

              Wollte am Wochenende mal ein Testaufbau machen... und werde berichten...

              PS: ich selbst habe einen Palm-Springspcb.jpg

              edit: so ein kleines script habe ich auch dafür:

              
              const Messages =  
              {
                "CONTENT": "STATES",
                "LCK": 0,
                "PWR": 0,
                "UNT": 1,
                "AIR": 0,
                "GRN": 0,
                "RED": 0,
                "FLT": 0,
                "TGT": 22,
                "TMP": 13,
                "CH1": 32,
                "CH2": 49,
                "CH3": 51,
                "HJT": 0,
                "BRT": 7
              }
              const ID = '0_userdata.0.LazySpa';
              const MQTTINSTANCE = 0;
              const debug = true;
              /*
              {
                "CONTENT": "TIMES",
                "TIME": 1650746370,
                "CLTIME": 1644734714,
                "FTIME": 1644734719,
                "UPTIME": 41660,
                "PUMPTIME": 50,
                "HEATINGTIME": 24,
                "AIRTIME": 512,
                "JETTIME": 4294966,
                "COST": 0,
                "FINT": 4294967295,
                "CLINT": 4294967295,
                "KWH": null,
                "TTTT": -74677
              }
              */
              const STATES=[
                  {
                      _id: 'LCK',
                      type: 'state',
                      common: {
                          name: 'lock',
                          type: 'boolean',
                          role: 'switch',
                          read: true,
                          write: false,
                          desc: 'Lazy spa lock'
                      },
                      native: {}
                  },
                  {
                      _id: 'PWR',
                      type: 'state',
                      common: {
                          name: 'power',
                          type: 'boolean',
                          role: 'switch.power',
                          read: true,
                          write: true,
                          desc: 'Lazy spa power'
                      },
                      native: {}
                  },
                  {
                  _id: 'UNT',
                  type: 'state',
                  common: {
                      name: 'unit',
                      type: 'number',
                      role: 'value',
                      read: true,
                      write: true,
                      max: 1,
                      desc: 'Lazy spa unit',
                      states: {
              				0: 'Farenheit',
              				1: 'Celsius'
              			}
                  },
                  native: {}
                  },
                  {
                  _id: 'AIR',
                  type: 'state',
                  common: {
                      name: 'bubbles',
                      type: 'boolean',
                      role: 'switch',
                      read: true,
                      write: true,
                      desc: 'Lazy spa bubbles state'
                  },
                  native: {}
                  },
                  {
                  _id: 'GRN',
                  type: 'state',
                  common: {
                      name: 'Heating green',
                      type: 'boolean',
                      role: 'switch',
                      read: true,
                      write: false,
                      desc: 'reached target temp.'
                  },
                  native: {}
                  },
                  {
                  _id: 'RED',
                  type: 'state',
                  common: {
                      name: 'Heating red',
                      type: 'boolean',
                      role: 'switch',
                      read: true,
                      write: false,
                      desc: 'not reached target temp.'
                  },
                  native: {}
                  },
                  {
                  _id: 'FLT',
                  type: 'state',
                  common: {
                      name: 'pump',
                      type: 'boolean',
                      role: 'switch',
                      read: true,
                      write: true,
                      desc: 'pump state'
                  },    native: {}
                  },
                  {
                  _id: 'HEATER',
                  type: 'state',
                  common: {
                      name: 'heater',
                      type: 'boolean',
                      role: 'switch',
                      read: true,
                      write: true,
                      desc: 'heater state'
                  },
                  native: {}
                  },
                  {
                  _id: 'TGT',
                  type: 'state',
                  common: {
                      name: 'target temp',
                      type: 'number',
                      role: 'level.temperature',
                      min: 20,
                      max: 40,
                      steps: 1,
                      read: true,
                      write: true,
                      desc: 'taget temp.'
                  },
                  native: {}
                  },
                  {
                  _id: 'TMP',
                  type: 'state',
                  common: {
                      name: 'temp',
                      type: 'number',
                      role: 'value.temperature',
                      read: true,
                      write: false,
                      unit: '°C',
                      desc: 'temp.'
                  },
                  native: {}
                  },
              ]
              
              
              init();
              async function stateChange(obj){
                  let id = obj.id
                  let state = id.split('.').pop()
                  let value = obj.state.val
                  log('change Unit' + state)
                  switch (state) {
                      case 'UNT':
                          setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":1,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                          log('change Unit')
                      break;
                      case 'TGT':
                          setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":0,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                          log('change target temp. to '+ value);
                      break;
                      case 'AIR':
                          value = value ? 1: 0 ;
                          setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":2,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                          log('set bubbles to '+ value);
                      break;
                      case 'HEATER':
                          value = value ? 1: 0 ;
                          setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":3,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                          log('set Heater to '+ value);
                      break;
                      case 'FLT':
                          value = value ? 1: 0 ;
                          setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":4,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                          log('set pump to '+ value);
                      break;
              
              
                default:
                  // Anweisungen werden ausgeführt,
                  // falls keine der case-Klauseln mit expression übereinstimmt
                  break;
              }
              
              
              
              }
              async function init(){
                  await asyncForEach(STATES, async (obj, index) => {
                      let id = ID +'.'+ obj._id
                      if (!existsState(id)) {
                          log('create state '+ id)
                          await createStateAsync(id, obj.common)
                      }
                      else {
                          log('skip state '+ id)
                      }
                      //set subscription
                      if(obj.common.write){
                          on({id: id, change:"any"} , function(obj) {
                              if(!obj.state.ack){
                                  log('change state! '+ JSON.stringify(obj))
                                  stateChange(obj)
                              }
                          });
                      }       
                  });
                  log('init done!')
              }
              async function setLazyStates(obj){
                  try{
                          let states = JSON.parse(obj)
                          for (const [key, value] of Object.entries(states)) {
                              let statevalue = value
                              const found = STATES.find(state => state._id === key);
                              if(found){                 
                                  if (found.common.type === 'boolean'){
                                      statevalue = value === 1
                                  }
                                  await setStateAsync(ID +'.'+ key,statevalue,true)
                              }
                          }
                          //set heater state
                          await setStateAsync(ID +'.HEATER',(states.GRN || states.RED) === 1,true)    
                  }
                  catch(e){
                      console.log('Error in setting State '+ e)
                  }
              
              }
              
              async function asyncForEach(array, callback) {
              	for (let index = 0; index < array.length; index++) {
              		await callback(array[index], index, array);
              	}
              }
              function log (msg){
                  if(debug) console.log (msg)
              }
              
              on({id:'mqtt.'+ MQTTINSTANCE+'.layzspa.message', change:"ne"} , function(obj) {
                  log('Lazyspa reached message! '+ JSON.stringify(obj.state))
                  setLazyStates(obj.state.val)
              });
              
              J Offline
              J Offline
              johobo
              wrote on last edited by
              #74

              Hi, Ich habe gerade Platinen bestellt. falls also jemand interesse hat gerne melden.

              M J 2 Replies Last reply
              0
              • R Rickman

                Also... Ich hätte dann noch 2 fertige Boards für das Model S100101, St. Lucia/Rio.
                Im Moment drucke ich noch die passenden Gehäuse dafür, die wunderbar in die zwei freien Bohrungen neben der Heizung passen.

                20220921_183757.jpg

                20220923_074047.jpg

                20220923_074111.jpg

                Bei eBay werden die für 83,- Euro vertickt, hier für 35,- plus Versand.
                Falls es nicht klappen sollte, weil doch wieder was anders in der Elektronik der Pumpe ist, nehme ich den selbstverständlich wieder zurück. Bei Interesse gerne eine PN an mich.

                EDIT:
                Keiner mehr da...

                Gruß,
                Richy

                J Offline
                J Offline
                johobo
                wrote on last edited by
                #75

                @rickman
                Hi,

                würdest du die Dateien für das Gehäuse zur Verfügung stellen? Oder kann ich sie irgendwie auf Thingiverse finden? Danke & Viele Grüße! JoHo

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  mistral0806
                  wrote on last edited by
                  #76

                  @johobo Hi, ich habe Interesse. Ist noch eine Platine übrig?

                  1 Reply Last reply
                  0
                  • J johobo

                    Hi, Ich habe gerade Platinen bestellt. falls also jemand interesse hat gerne melden.

                    M Offline
                    M Offline
                    Mogedin
                    wrote on last edited by
                    #77

                    @johobo suche auch noch eins 😊

                    1 Reply Last reply
                    0
                    • J johobo

                      Hi, Ich habe gerade Platinen bestellt. falls also jemand interesse hat gerne melden.

                      J Offline
                      J Offline
                      johobo
                      wrote on last edited by
                      #78

                      So, Ich wollte mal von meiner Umsetzung berichten.

                      Ich habe den Lay-Z-Spa Miami mit dem >2021er Pumpenmodul.

                      Die Platinen waren nach ca. 1,5 Wochen aus China bei mir.

                      Bei einem ersten Testaufbau auf Steckbrett hatte ich schon festgestellt, dass ich für meinen Pool die Kabelbelegung 1:1 aufbauen muss, damit es funktioniert. Bei dem Versuch war kein Low-Pass Filter vorhanden und es kam zu keinem Display-Flickern. Zur Sicherheit baute ich dann im ersten Versuch mit Platine den Filter mit ein. Dies führte aber dazu, dass das Display nicht mehr funktionierte. Also bestückte ich eine zweiter Platine ohne filter und es funktionierte einwandfrei.

                      Bestway Wifi PCB 3.jpg Bestway Wifi PCB 2.jpg Bestway Wifi PCB 1.jpg

                      Die Einbindung in IO broker lief soweit auch.

                      Für den finalen Einbau musste aber noch ein Gehäuse her.
                      Ich orientierte mich am Design von @Rickman (Vielen Dank!) und einem Case ohne Halterung von thingiverse. Heraus kam dieses Thing: https://www.thingiverse.com/thing:6061047 mit dem ich auch ziemlich zufrieden bin. Evtl. muss ich hier nochmal eine neuere Version aus ABS erstellen. PLA scheint mir hier bei den Temperaturen etwas kritisch…

                      Bild2.jpg Bild1.jpg

                      Alles in allem bin ich aber super zufrieden mit dem Projekt und bedanke mich bei euch allen für die Berichte die zu meinem Erfolg beigetragen haben!

                      K R E 3 Replies Last reply
                      0
                      • M Marc79

                        @naofireblade
                        @BruderBleistift

                        Meine Platinen von JLCPCB sind gerade auf dem Weg zu mir. Könnte euch gegen eine kleine Beteiligung und die Versandkosten jeweils eine schicken. Interesse?

                        VG
                        Marc

                        K Offline
                        K Offline
                        Klaus.F
                        wrote on last edited by
                        #79

                        @marc79 Hallo Marc, hast du noch eine Platine von JLCPCB um einen Bestway Spa Wifi-fähig zu machen
                        Viele Grüße
                        Klaus

                        1 Reply Last reply
                        0
                        • J johobo

                          So, Ich wollte mal von meiner Umsetzung berichten.

                          Ich habe den Lay-Z-Spa Miami mit dem >2021er Pumpenmodul.

                          Die Platinen waren nach ca. 1,5 Wochen aus China bei mir.

                          Bei einem ersten Testaufbau auf Steckbrett hatte ich schon festgestellt, dass ich für meinen Pool die Kabelbelegung 1:1 aufbauen muss, damit es funktioniert. Bei dem Versuch war kein Low-Pass Filter vorhanden und es kam zu keinem Display-Flickern. Zur Sicherheit baute ich dann im ersten Versuch mit Platine den Filter mit ein. Dies führte aber dazu, dass das Display nicht mehr funktionierte. Also bestückte ich eine zweiter Platine ohne filter und es funktionierte einwandfrei.

                          Bestway Wifi PCB 3.jpg Bestway Wifi PCB 2.jpg Bestway Wifi PCB 1.jpg

                          Die Einbindung in IO broker lief soweit auch.

                          Für den finalen Einbau musste aber noch ein Gehäuse her.
                          Ich orientierte mich am Design von @Rickman (Vielen Dank!) und einem Case ohne Halterung von thingiverse. Heraus kam dieses Thing: https://www.thingiverse.com/thing:6061047 mit dem ich auch ziemlich zufrieden bin. Evtl. muss ich hier nochmal eine neuere Version aus ABS erstellen. PLA scheint mir hier bei den Temperaturen etwas kritisch…

                          Bild2.jpg Bild1.jpg

                          Alles in allem bin ich aber super zufrieden mit dem Projekt und bedanke mich bei euch allen für die Berichte die zu meinem Erfolg beigetragen haben!

                          K Offline
                          K Offline
                          Klaus.F
                          wrote on last edited by
                          #80

                          @johobo
                          Sorry, die Frage geht an alle die evtl. noch eine Platine haben!
                          Würde gerne das Projekt nachbauen

                          Danke im voraus
                          Viele Grüße
                          Klaus

                          J 1 Reply Last reply
                          0
                          • K Klaus.F

                            @johobo
                            Sorry, die Frage geht an alle die evtl. noch eine Platine haben!
                            Würde gerne das Projekt nachbauen

                            Danke im voraus
                            Viele Grüße
                            Klaus

                            J Offline
                            J Offline
                            johobo
                            wrote on last edited by
                            #81

                            @klaus-f ich habe noch. im Raum Mainz oder Versand

                            E 1 Reply Last reply
                            0
                            • J johobo

                              @klaus-f ich habe noch. im Raum Mainz oder Versand

                              E Offline
                              E Offline
                              einarmigerbandit
                              wrote on last edited by
                              #82

                              @johobo bin auch noch auf der Suche nach einer Platine. Ist noch eine zu haben?

                              1 Reply Last reply
                              0
                              • T Offline
                                T Offline
                                ts_482
                                wrote on last edited by
                                #83

                                Ich würde auch noch eine Platine suchen? Hat jemand noch eine? Bitte PN

                                A 1 Reply Last reply
                                0
                                • T ts_482

                                  Ich würde auch noch eine Platine suchen? Hat jemand noch eine? Bitte PN

                                  A Offline
                                  A Offline
                                  alwo23
                                  wrote on last edited by
                                  #84

                                  @ts_482 Hi, ich hab gestern erst 5 Bestellt mit Gehäuse wenn Du magst.

                                  T F Bernhard BruckmeierB 3 Replies Last reply
                                  0
                                  • A alwo23

                                    @ts_482 Hi, ich hab gestern erst 5 Bestellt mit Gehäuse wenn Du magst.

                                    T Offline
                                    T Offline
                                    ts_482
                                    wrote on last edited by
                                    #85

                                    @alwo23 danke, aber ich habe schon eine andere bekommen.

                                    1 Reply Last reply
                                    0
                                    • T Offline
                                      T Offline
                                      ts_482
                                      wrote on last edited by
                                      #86

                                      wo bestellt ihr die Restliche Hardware?

                                      ESP8266 NodeMCU + TXS0108E

                                      und habt ihr eine Liste was genau noch benötigt wird?

                                      1 Reply Last reply
                                      0
                                      • A alwo23

                                        @ts_482 Hi, ich hab gestern erst 5 Bestellt mit Gehäuse wenn Du magst.

                                        F Offline
                                        F Offline
                                        Forst89
                                        wrote on last edited by
                                        #87

                                        @alwo23 Hi, ich hätte Interesse an einer Platine und würde mich dann auch mal an das Projekt wagen 🙂 Hast du von den anderen benötigen Komponenten zufällig auch noch übrig umd das Set zu kompletieren?

                                        1 Reply Last reply
                                        0
                                        • M MezzoDO

                                          Guten Abend zusammen!
                                          Gibt's hier fachkundige Leute zu diesem Projekt, die mir bei meinem Problem helfen könnten?

                                          Ich hab die PCB V1 Platine und wollte einen BAHAMAS mit der Pumpe S100101 mit dem Modul ausstatten.
                                          Zusammengebaut mit dem blauen Level Converter, der laut Instructions bestätigt funktionieren soll. Zudem habe ich in meiner Verzweiflung auch versucht die 560 Ohm Widerstände an die Datenleitungen 3,4 & 5 zum Display zu löten.

                                          Laut GitProject soll das Modell MIAMI2021 gewählt werden, was ich auch eingestellt und hochgeladen habe (PlatformIO Upload, Build Filesystem und Upload Filesystem).

                                          Die WebUI lässt sich soweit auch aufrufen und konfigurieren, allerdings bleibt das Display der Pumpe dunkel und Bedienung ist weder Am Display noch per WebUI möglich.
                                          Alles was ich sehe ist die (vermeintlich korrekte) Temperatur per WebUI.

                                          Habe alles gemäß Anleitung mehr als fünf mal gecheckt. Vielleicht findet sich jemand, der mir helfen kann 😞

                                          tvtotalT Offline
                                          tvtotalT Offline
                                          tvtotal
                                          wrote on last edited by
                                          #88

                                          @mezzodo

                                          Hallo,
                                          habe das gleiche Problem wie @MezzoDO Model S100101 Display tot macht aber eigenartige Pieptöne.
                                          Webinterface aufrufbar, jedoch keine Schaltfunktion möglich.
                                          Firmware.png
                                          HardwareConfig.png 1365-1024.png
                                          pcb.jpg
                                          768-1024.jpg
                                          typ.jpg
                                          Nutze die PCB v1 Verdrahtung überprüft finde aber keinen Fehler, Bild von @Rickman überprüft.
                                          Hat noch jemand einen Tipp ?😞

                                          Synology iobroker / Arduino Mega / CCU2 / Loxone Miniserver / Pokeys57e

                                          R 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          531

                                          Online

                                          32.4k

                                          Users

                                          81.4k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe