NEWS
Lay-Z-Spa Wifi Control
-
@bischemer
alles klar - ist reserviert - mit dem Chat hat nun funktioniert -
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 FoundGeht 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. -
@michisa86888 Ich hätte auch Interesse an einer Platine
-
Habe mir inzwischen auf Basis eines Wemos D1 mini das Projekt nachgebaut. Funktioniert tatsächlich auch ohne level shifter und damit ohne Platine , Wiederstände usw. . Bauaufwand sind 15 Minuten und in der Bucht bekommt die JST SM 6 pin Stecker+6 pin Buchse für unter 3 EUR genau wie den Wemos.
Die genaue Beschreibung des Aufbaus ist bei github in der Diskussions unter dem Titel "LLC - Why bother... It works fine without..." zu finden. Habe das Ganze so gelöst das der WEMOS, sollte er absterben, einfach ausgetauscht werden kann.
Läuft seid einer Woche ohne Probleme in meinem MIAMI 2021.
An der Intergration per MQTT bin ich gerade dran, danke für die Vorarbeit! -
@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 -
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?
-
@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 -
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.
-
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 -
@agria4800 : Anbei das Script für die Leute mit dem Layz Hawaii oder Maldives (mit den Hydrojet Düsen)
Und so siehts dann aus...
Grüße
-
-
Hallo zusammen, hat irgendjemand noch eine Platine abzugeben? Leider unbedarft, trotzdem neue Herausforderung gesucht Danke und Grüße Andy
-
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.
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.
-
@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 -
@rickman
Ich würde Dir ein v2 PCB abnehmen.Vielen Dank und Gruß,
Michael -
@allesautomatisch
Hast ne Chatnachricht... -
Ich habe noch 4 Platinen V1 da und einen Satz mit 6 poligen JST-SM. Wenn Interesse besteht bitte PN.
-
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.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 -
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
-
@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.