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

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    12
    2
    250

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

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

Lay-Z-Spa Wifi Control

Lay-Z-Spa Wifi Control

Scheduled Pinned Locked Moved Hardware
211 Posts 76 Posters 50.4k 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.
  • N Nobody 0

    Hallo Zusammen,

    nach einigen Anlaufproblemen und einer Kalten Lötstelle auf dem NodeMCU habe ich nun endlich das Programm drauf bekommen und alles Verlötet.

    Leider habe ich nun das nächste Problem, wenn ich das Modul anschliesse und wieder Strom drauf geben hört man aus dem inneren nur ein leises Klackern, aber nichts geht.

    Beim aufrufen der Webseite des Moduls bekomme ich folgenden Fehler:
    404: File Not Found

    Geht die Weboberfläche nur wenn das Modul mit der Pumpe verbunden ist?
    Wo könnte das Klappern herkommen?
    Ich habe einen Lay-Z.Spa AirJet Hawaii von 2020.

    Chris 5C Offline
    Chris 5C Offline
    Chris 5
    wrote on last edited by
    #51

    @nobody-0
    die Daten für das Webinterface werden im Filesystem des ESPs abgelegt und müssen daher separat hochgeladen werden.
    Zitat aus der Beschreibung für platformio:

    Upload LittleFS Data or you will get a 404! Click platformio icon,
    go to PROJECT TASKS > nodemcuv2 > Platform and build filesystem image, then upload filesystem image.

    Das geht dann auch schon vor integration in der Pumpe.
    Viel Erfolg

    1 Reply Last reply
    0
    • B Offline
      B Offline
      BruderBleistift
      wrote on last edited by
      #52

      Habe seit ca. 2 Wochen das Problem, dass sich das Modul scheinbar aufhängt.
      Es ist dann nicht mehr möglich den Pool über die Tasten zu bedienen und auch über das Webinterface ist es nicht mehr erreichbar.

      Beheben lässt es sich, indem ich kurz den Strom kappe. Dann startet das Modul neu und es funktioniert wieder - für 1-2 Tage.

      Hat das Problem noch jemand, oder Ideen woran es liegen könnte? Eventuell ein Überhitzungsproblem? Lässt sich auf dem ESP irgendwie ein Kühlkörper anbringen und würde das in dem geschlossenen Pumpengehäuse überhaupt etwas bringen?

      Chris 5C 1 Reply Last reply
      0
      • B BruderBleistift

        Habe seit ca. 2 Wochen das Problem, dass sich das Modul scheinbar aufhängt.
        Es ist dann nicht mehr möglich den Pool über die Tasten zu bedienen und auch über das Webinterface ist es nicht mehr erreichbar.

        Beheben lässt es sich, indem ich kurz den Strom kappe. Dann startet das Modul neu und es funktioniert wieder - für 1-2 Tage.

        Hat das Problem noch jemand, oder Ideen woran es liegen könnte? Eventuell ein Überhitzungsproblem? Lässt sich auf dem ESP irgendwie ein Kühlkörper anbringen und würde das in dem geschlossenen Pumpengehäuse überhaupt etwas bringen?

        Chris 5C Offline
        Chris 5C Offline
        Chris 5
        wrote on last edited by
        #53

        @bruderbleistift
        bei mir wird nachts die Außensteckdose komplett abgeschaltet, damit das Teil jeden Tag quasi zwangsgebootet. Am besten mal direkt mal bei visualapproach in den discussions nachfragen.
        Ist die WLAN Verbindung gut? Ich musste das Teil nach dem Einbau nochmals verschieben / verdrehen da die WLAN Verbindung verloren ging - konnte dann aber weiterhin über die Tasten bedienen.
        Die sauberste Löstung wäre die Intergration eines watchdog timers weiß aber nicht ob das im Code gehen würde bzw. zusätzliche Hardware notwendig macht. Eine Überhitzung kann ich mir aber eigendlich nicht vorstellen eher eine Kontaktproblematik auf der Platine die bei hoheren Temperaturen zu Problemen führt - vielleicht noch mal nachlöten / Kontakte und Kabel prüfen?
        mehr fällt mir dazu auch nicht ein - viel Erfolg

        1 Reply Last reply
        0
        • Chris685C Offline
          Chris685C Offline
          Chris685
          wrote on last edited by
          #54

          Update um die Außentemperatur (Umgebungstemperatur) über ioBroker zur Berechnung der virtuellen Temperatur einzubinden.

          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,
            "AMBC": 22
          }
          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: {}
              },
                  {
              _id: 'VTM',
              type: 'state',
              common: {
                  name: 'temp',
                  type: 'number',
                  role: 'value.temperature',
                  read: true,
                  write: false,
                  unit: '°C',
                  desc: 'vtemp.'
              },
              native: {}
              },
              {
              _id: 'AMBC',
              type: 'state',
              common: {
                  name: 'ambient temp',
                  type: 'number',
                  role: 'value.temperature',
                  read: false,
                  write: true,
                  desc: 'Ambienttemp.'
              },
              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;
                  case 'AMBC':
                      setStateAsync('mqtt.'+ MQTTINSTANCE+'.layzspa.command','{"CMD":14,"VALUE":'+ value +',"XTIME":0,"INTERVAL":0}')
                      log('change ambient temp. 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)
          });
          

          Die Variable AMBC update ich bei Änderung der Außentemperatur. Ich lese die Außentemperatur über Netatmo ein.

          NinjaTurtle85N 1 Reply Last reply
          0
          • T Offline
            T Offline
            topoff82
            wrote on last edited by topoff82
            #55

            Hallo zusammen,

            ich hätte mal ne Frage ob das Skript auch mit einem externen MQTT broker funktioniert - bzw. was ich hier ändern muss?
            Ich habe in IoBroker nur den MQTT Client installiert - broker ist auf einem anderen raspberry (Loxberry) - die Werte vom Modul bekomm ich über den client rein (Datenpunkte mit Json werden in der Client Instanz angelegt) wenn ich layzspa/# subscribe - aber da eben nur die Json mit der ich aufgrund fehlenden Kentnissen leider nix anfangen kann ....... Jetzt hab ich das so verstanden dass das Skript die Json in die and in der 0.userdata Werte reingeschrieben wird (und da auch geändert/gesteuert werden kann?) - die 0.userdata Objekte hab ich - aber eben ohne Werte....

            MQTT client in IoBroker: Instanzeinstellungen: mqtt-client.0 v1.6.3
            -> muss ich hier etwas bei const MQTTINSTANCE = 0; ändern?

            edit
            -> hab jetzt bei const MQTTINSTANCE die IP Adresse meines MQTT Brokers (externer Raspberry und alternative die IP des Pool Moduls) eingegeben - leider schreibt er die Werte immer noch nicht .....
            const ID = '0_userdata.0.LazySpa';
            const MQTTINSTANCE = '192.168.2.151';
            const debug = true;

            das log initialisiert (checkt die Objekte in unserdata) aber wenn ich etwas änder gibt es weder beim log noch bei den Werten Änderungen ... sprich es passiert nichts mehr nach init done!

            17:13:09.805	info	javascript.0 (24696) Start javascript script.js.common.layzspa
            17:13:09.814	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.LCK
            17:13:09.814	info	javascript.0 (24696) script.js.common.layzspa: subscribe: {"pattern":{"id":"mqtt.192.168.2.151.layzspa.message","change":"ne","q":0},"name":"script.js.common.layzspa"}
            17:13:09.815	info	javascript.0 (24696) script.js.common.layzspa: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
            17:13:09.815	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.PWR
            17:13:09.815	info	javascript.0 (24696) script.js.common.layzspa: subscribe: {"pattern":{"id":"0_userdata.0.LazySpa.PWR","change":"any","q":0},"name":"script.js.common.layzspa"}
            17:13:09.816	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.UNT
            17:13:09.817	info	javascript.0 (24696) script.js.common.layzspa: subscribe: {"pattern":{"id":"0_userdata.0.LazySpa.UNT","change":"any","q":0},"name":"script.js.common.layzspa"}
            17:13:09.817	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.AIR
            17:13:09.817	info	javascript.0 (24696) script.js.common.layzspa: subscribe: {"pattern":{"id":"0_userdata.0.LazySpa.AIR","change":"any","q":0},"name":"script.js.common.layzspa"}
            17:13:09.818	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.GRN
            17:13:09.818	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.RED
            17:13:09.818	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.FLT
            17:13:09.818	info	javascript.0 (24696) script.js.common.layzspa: subscribe: {"pattern":{"id":"0_userdata.0.LazySpa.FLT","change":"any","q":0},"name":"script.js.common.layzspa"}
            17:13:09.818	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.HEATER
            17:13:09.818	info	javascript.0 (24696) script.js.common.layzspa: subscribe: {"pattern":{"id":"0_userdata.0.LazySpa.HEATER","change":"any","q":0},"name":"script.js.common.layzspa"}
            17:13:09.819	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.TGT
            17:13:09.819	info	javascript.0 (24696) script.js.common.layzspa: subscribe: {"pattern":{"id":"0_userdata.0.LazySpa.TGT","change":"any","q":0},"name":"script.js.common.layzspa"}
            17:13:09.819	info	javascript.0 (24696) script.js.common.layzspa: skip state 0_userdata.0.LazySpa.TMP
            17:13:09.819	info	javascript.0 (24696) script.js.common.layzspa: init done!
            

            Wenn mir hier jemand auf die Sprünge helfen könnte wäre Prima!
            Danke vorab & Gruß
            Tom

            1 Reply Last reply
            0
            • Agria4800A Agria4800

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

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

              Würdest du evtl. das Script noch für die Hydrojet Düsen erweitern? 😁

              Bildschirmfoto 2022-06-26 um 18.49.52.png

              Würdest du evtl. noch das Script erweitern auf die Werte aus dem Script und diese auch noch in DB schreiben? 🙂
              Bildschirmfoto 2022-06-26 um 19.05.30.png

              Agria4800A Offline
              Agria4800A Offline
              Agria4800
              wrote on last edited by Agria4800
              #56

              @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

              Agria4800A S M B T 6 Replies Last reply
              1
              • 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

                Agria4800A Offline
                Agria4800A Offline
                Agria4800
                wrote on last edited by
                #57

                @agria4800
                Hiermit bekommt man die Zeiten ausgelesen:

                var Souce_other, Source, RSSI, Times, Chlortime, Filtertime, Uptime, Pumptime, Heating, Airtime, Hydrojet_Time, Costs, Verbrauch;
                
                
                on({id: [].concat(['mqtt.0.layzspa.other']), change: "ne"}, async function (obj) {
                 var value = obj.state.val;
                 var oldValue = obj.oldState.val;
                 Souce_other = getState("mqtt.0.layzspa.other").val;
                 await wait(100);
                 RSSI = getAttr(Souce_other, 'RSSI');
                 setState("0_userdata.0.LazySpa.RSSI-Wifi"/*RSSI-Wifi*/, parseFloat(RSSI), true);
                });
                on({id: [].concat(['mqtt.0.layzspa.times']), change: "ne"}, async function (obj) {
                 var value = obj.state.val;
                 var oldValue = obj.oldState.val;
                 Source = getState("mqtt.0.layzspa.times").val;
                 await wait(100);
                 Times = getAttr(Source, 'TIME');
                 setState("0_userdata.0.LazySpa.Times.Time"/*Time*/, parseFloat(Times), true);
                 Chlortime = getAttr(Source, 'CLTIME');
                 setState("0_userdata.0.LazySpa.Times.Chlor_Time"/*Chlor_Time*/, Chlortime, true);
                 Filtertime = getAttr(Source, 'FTIME');
                 setState("0_userdata.0.LazySpa.Times.Filter_Time"/*Filter_Time*/, parseFloat(Filtertime), true);
                 Uptime = getAttr(Source, 'UPTIME');
                 setState("0_userdata.0.LazySpa.Times.Up_Time"/*Up_Time*/, parseFloat(Uptime), true);
                 Pumptime = getAttr(Source, 'PUMPTIME');
                 setState("0_userdata.0.LazySpa.Times.Pump_Time"/*Pump_Time*/, parseFloat(Pumptime), true);
                 Heating = getAttr(Source, 'HEATINGTIME');
                 setState("0_userdata.0.LazySpa.Times.Heating_Time"/*Heating Time*/, parseFloat(Heating), true);
                 Airtime = getAttr(Source, 'AIRTIME');
                 setState("0_userdata.0.LazySpa.Times.Air_Time"/*Air_Time*/, parseFloat(Airtime), true);
                 Hydrojet_Time = getAttr(Source, 'JETTIME');
                 setState("0_userdata.0.LazySpa.Times.Hydrojet_Time"/*Hydrojet_Time*/, parseFloat(Hydrojet_Time), true);
                 Costs = getAttr(Source, 'COST');
                 setState("0_userdata.0.LazySpa.Times.Cost"/*Cost*/, parseFloat(Costs), true);
                 Verbrauch = getAttr(Source, 'KWH');
                 setState("0_userdata.0.LazySpa.Times.Verbrauch"/*Verbrauch*/, parseFloat(Verbrauch), true);
                });
                
                
                

                und hiermit werden sie umgeschrieben analog !Bildschirmfoto 2022-08-12 um 21.15.48.png

                var Dauer, tage, std, min, sec;
                
                
                // https://forum.iobroker.net/topic/13488/vorlage-blockly-umrechnung-von-sekunden-in-stunden-minuten-und-sekunden/11
                
                on({id: "0_userdata.0.LazySpa.Times.Up_Time"/*Up_Time*/, change: "ne"}, async function (obj) {
                 var value = obj.state.val;
                 var oldValue = obj.oldState.val;
                 Dauer = getState("0_userdata.0.LazySpa.Times.Up_Time").val;
                 tage = Math.floor(parseFloat(Dauer) / 86400);
                 Dauer = parseFloat(Dauer) - parseFloat(tage) * 86400;
                 std = Math.floor(parseFloat(Dauer) / 3600);
                 Dauer = parseFloat(Dauer) - parseFloat(std) * 3600;
                 min = Math.floor(parseFloat(Dauer) / 60);
                 Dauer = parseFloat(Dauer) - parseFloat(min) * 60;
                 sec = Math.floor(parseFloat(Dauer) / 1);
                 setState("0_userdata.0.LazySpa.Times.Format-Up-Time"/*Format-Up-Time*/, ([tage,'D -  ',std,'h:',min,'min:',sec,'sec'].join('')));
                });
                on({id: "0_userdata.0.LazySpa.Times.Air_Time"/*Air_Time*/, change: "ne"}, async function (obj) {
                 var value = obj.state.val;
                 var oldValue = obj.oldState.val;
                 Dauer = getState("0_userdata.0.LazySpa.Times.Air_Time").val;
                 tage = Math.floor(parseFloat(Dauer) / 86400);
                 Dauer = parseFloat(Dauer) - parseFloat(tage) * 86400;
                 std = Math.floor(parseFloat(Dauer) / 3600);
                 Dauer = parseFloat(Dauer) - parseFloat(std) * 3600;
                 min = Math.floor(parseFloat(Dauer) / 60);
                 Dauer = parseFloat(Dauer) - parseFloat(min) * 60;
                 sec = Math.floor(parseFloat(Dauer) / 1);
                 setState("0_userdata.0.LazySpa.Times.Format-Air-Time"/*Format-Air-Time*/, ([tage,'D -  ',std,'h:',min,'min:',sec,'sec'].join('')));
                });
                on({id: "0_userdata.0.LazySpa.Times.Heating_Time"/*Heating Time*/, change: "ne"}, async function (obj) {
                 var value = obj.state.val;
                 var oldValue = obj.oldState.val;
                 Dauer = getState("0_userdata.0.LazySpa.Times.Heating_Time").val;
                 tage = Math.floor(parseFloat(Dauer) / 86400);
                 Dauer = parseFloat(Dauer) - parseFloat(tage) * 86400;
                 std = Math.floor(parseFloat(Dauer) / 3600);
                 Dauer = parseFloat(Dauer) - parseFloat(std) * 3600;
                 min = Math.floor(parseFloat(Dauer) / 60);
                 Dauer = parseFloat(Dauer) - parseFloat(min) * 60;
                 sec = Math.floor(parseFloat(Dauer) / 1);
                 setState("0_userdata.0.LazySpa.Times.Format-Heating-Time"/*Format-Heating-Time*/, ([tage,'D -  ',std,'h:',min,'min:',sec,'sec'].join('')));
                });
                on({id: "0_userdata.0.LazySpa.Times.Pump_Time"/*Pump_Time*/, change: "ne"}, async function (obj) {
                 var value = obj.state.val;
                 var oldValue = obj.oldState.val;
                 Dauer = getState("0_userdata.0.LazySpa.Times.Pump_Time").val;
                 tage = Math.floor(parseFloat(Dauer) / 86400);
                 Dauer = parseFloat(Dauer) - parseFloat(tage) * 86400;
                 std = Math.floor(parseFloat(Dauer) / 3600);
                 Dauer = parseFloat(Dauer) - parseFloat(std) * 3600;
                 min = Math.floor(parseFloat(Dauer) / 60);
                 Dauer = parseFloat(Dauer) - parseFloat(min) * 60;
                 sec = Math.floor(parseFloat(Dauer) / 1);
                 setState("0_userdata.0.LazySpa.Times.Format-Pump-Time"/*Format-Pump-Time*/, ([tage,'D -  ',std,'h:',min,'min:',sec,'sec'].join('')));
                });
                
                on({id: "0_userdata.0.LazySpa.Times.Hydrojet_Time"/*Hydrojet_Time*/, change: "ne"}, async function (obj) {
                 var value = obj.state.val;
                 var oldValue = obj.oldState.val;
                 Dauer = getState("0_userdata.0.LazySpa.Times.Hydrojet_Time").val;
                 tage = Math.floor(parseFloat(Dauer) / 86400);
                 Dauer = parseFloat(Dauer) - parseFloat(tage) * 86400;
                 std = Math.floor(parseFloat(Dauer) / 3600);
                 Dauer = parseFloat(Dauer) - parseFloat(std) * 3600;
                 min = Math.floor(parseFloat(Dauer) / 60);
                 Dauer = parseFloat(Dauer) - parseFloat(min) * 60;
                 sec = Math.floor(parseFloat(Dauer) / 1);
                 setState("0_userdata.0.LazySpa.Times.Format-Hydrojet-Time"/*Format-Hydrojet-Time*/, ([tage,'D -  ',std,'h:',min,'min:',sec,'sec'].join('')));
                });
                

                Z 1 Reply Last reply
                1
                • A Offline
                  A Offline
                  anderl
                  wrote on last edited by
                  #58

                  Hallo zusammen, hat irgendjemand noch eine Platine abzugeben? Leider unbedarft, trotzdem neue Herausforderung gesucht 😀 Danke und Grüße Andy

                  R 1 Reply Last reply
                  0
                  • Bjoern WeissB Offline
                    Bjoern WeissB Offline
                    Bjoern Weiss
                    wrote on last edited by
                    #59

                    Hallo zusammen,
                    ich habe ein kleines Problem. Hat jemand eine Idee, warum mir in dem Anzeigefeld keine Temperatur angezeigt wird?
                    Wenn es einen Fehler wie beispielsweise E02 etc gibt, wird dieser dort aber angezeigt.
                    Lazy.jpg

                    Ist ein Vegas (54112), allerdings mit 4-adrigen Verkabelung statt wie angegeben 6 Adern.

                    Hab übrigends noch Platinen übrig wenn jemand noch eine benötigt.

                    1 Reply Last reply
                    0
                    • A anderl

                      Hallo zusammen, hat irgendjemand noch eine Platine abzugeben? Leider unbedarft, trotzdem neue Herausforderung gesucht 😀 Danke und Grüße Andy

                      R Offline
                      R Offline
                      Rickman
                      wrote on last edited by
                      #60

                      @anderl
                      Ich habe gestern die PCB v2 bestellt. Wollte für den Winter auch schon mal was zum basteln haben.
                      Sobald die da sind, kann ich Dir Bescheid geben.

                      Falls noch jemand welche benötigt - habe dann immer noch 3 übrig. 😉

                      Gruß,
                      Richy

                      allesautomatischA 1 Reply Last reply
                      0
                      • R Rickman

                        @anderl
                        Ich habe gestern die PCB v2 bestellt. Wollte für den Winter auch schon mal was zum basteln haben.
                        Sobald die da sind, kann ich Dir Bescheid geben.

                        Falls noch jemand welche benötigt - habe dann immer noch 3 übrig. 😉

                        Gruß,
                        Richy

                        allesautomatischA Offline
                        allesautomatischA Offline
                        allesautomatisch
                        wrote on last edited by
                        #61

                        @rickman
                        Ich würde Dir ein v2 PCB abnehmen.

                        Vielen Dank und Gruß,
                        Michael

                        R 1 Reply Last reply
                        0
                        • allesautomatischA allesautomatisch

                          @rickman
                          Ich würde Dir ein v2 PCB abnehmen.

                          Vielen Dank und Gruß,
                          Michael

                          R Offline
                          R Offline
                          Rickman
                          wrote on last edited by
                          #62

                          @allesautomatisch
                          Hast ne Chatnachricht... 🙂

                          1 Reply Last reply
                          0
                          • Chris685C Offline
                            Chris685C Offline
                            Chris685
                            wrote on last edited by
                            #63

                            Ich habe noch 4 Platinen V1 da und einen Satz mit 6 poligen JST-SM. Wenn Interesse besteht bitte PN.

                            1 Reply Last reply
                            0
                            • R Offline
                              R Offline
                              Rickman
                              wrote on last edited by Rickman
                              #64

                              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 1 Reply Last reply
                              0
                              • M Offline
                                M Offline
                                MezzoDO
                                wrote on last edited by
                                #65

                                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 😞

                                R tvtotalT R 3 Replies 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 😞

                                  R Offline
                                  R Offline
                                  Rickman
                                  wrote on last edited by
                                  #66

                                  @mezzodo
                                  Schau Dir mal die Bilder bei mir an. Hast Du die Kabel so verlötet? Also in der Reihenfolge am Ein- und Ausgang?
                                  Du hast zwar eine V1- Platine, aber das selbe Pumpenmodell... Vielleicht klappts ja.

                                  Bei mir hat die Standardbelegung nämlich auch nicht funktioniert. 😉

                                  M 1 Reply Last reply
                                  0
                                  • R Rickman

                                    @mezzodo
                                    Schau Dir mal die Bilder bei mir an. Hast Du die Kabel so verlötet? Also in der Reihenfolge am Ein- und Ausgang?
                                    Du hast zwar eine V1- Platine, aber das selbe Pumpenmodell... Vielleicht klappts ja.

                                    Bei mir hat die Standardbelegung nämlich auch nicht funktioniert. 😉

                                    M Offline
                                    M Offline
                                    MezzoDO
                                    wrote on last edited by
                                    #67

                                    @rickman
                                    Danke für den Tipp, die Belegung hab ich tatsächlich schonmal gesehen aber nicht berücksichtigt. Ich teste das mal.

                                    LG

                                    M 1 Reply Last reply
                                    0
                                    • M MezzoDO

                                      @rickman
                                      Danke für den Tipp, die Belegung hab ich tatsächlich schonmal gesehen aber nicht berücksichtigt. Ich teste das mal.

                                      LG

                                      M Offline
                                      M Offline
                                      MezzoDO
                                      wrote on last edited by
                                      #68

                                      @mezzodo said in Lay-Z-Spa Wifi Control:

                                      @rickman
                                      Danke für den Tipp, die Belegung hab ich tatsächlich schonmal gesehen aber nicht berücksichtigt. Ich teste das mal.

                                      LG

                                      Umverdrahtet, selber Effekt...

                                      Allerdings habe ich aus Gründen mal einen neuen Level Converter bestellt und jetzt spielt zumindest die Melodie beim starten, dennoch wie vorher bleibt das Display tot. Ich denke ich werde es nun nochmal mit der 1:1 Verdrahtung versuchen und melde mich erneut #justupdating

                                      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

                                        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
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          99

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          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