NEWS
Omlet Hühnerstall webhook API
-
so hier mal noch eine bessere version
bitte prüfe nochmal Zeile 4 ob du dort auch das apitoken aus dem omlet portal eingetragen hast.
wenn die Anmeldung mit dem skript funktioniert, sollte es auf der konsole einmal die liste aller devices ausgeben
wenn wir daraus die id der tür ablesen können, können wir die in zeile 8
eintragen und nach einem erneuten start sollte sich die tür öffnen. (zeile11)const { createOmlet } = require('smartcoop-sdk'); async function main() { const omlet = await createOmlet('apitoken'); //hier den api token aus dem omlet portal eintragen const devices = await omlet.getDevices(); console.log("Devices:"); console.log(devices); // gibt alle devices aus const device = await omlet.getDeviceById('deviceid123456'); // hier ist aktuell auch noch ein dummy drin, den müssen wir dann aktualisieren wenn wir die liste der devices haben. const openAction = device.getActions().find((action) => action.name === 'open'); //sucht die open aktion im device if (openAction) { // falls die gefunden wurde await device.action(openAction) //wird die aktion dann hier ausgeführt } } main(); -

Ist eingetragen.
Fehler:avascript.0 2026-03-08 09:34:30.509 error TypeError: Cannot read properties of undefined (reading 'state') at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:129:29) at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:96:25) at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:148:24) at /opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:24:136 at Array.map (<anonymous>) at Object.<anonymous> (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:24:34) at Generator.next (<anonymous>) at fulfilled (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:5:58) at process.processTicksAndRejections (node:internal/process/task_queues:103:5) javascript.0 2026-03-08 09:34:30.508 error Error: Cannot read properties of undefined (reading 'state') javascript.0 2026-03-08 09:34:30.508 error An error happened which is most likely from one of your scripts, but the originating script could not be detected. -

Ist eingetragen.
Fehler:avascript.0 2026-03-08 09:34:30.509 error TypeError: Cannot read properties of undefined (reading 'state') at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:129:29) at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:96:25) at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:148:24) at /opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:24:136 at Array.map (<anonymous>) at Object.<anonymous> (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:24:34) at Generator.next (<anonymous>) at fulfilled (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:5:58) at process.processTicksAndRejections (node:internal/process/task_queues:103:5) javascript.0 2026-03-08 09:34:30.508 error Error: Cannot read properties of undefined (reading 'state') javascript.0 2026-03-08 09:34:30.508 error An error happened which is most likely from one of your scripts, but the originating script could not be detected.hast du alles kopiert?
Das ist eine Fehlermeldung die beim ersten Lauf auch zu erwarten wäre, da wir ja die konkrete Device ID noch nicht wissen.
Davor hätte es eigentlich eine Liste der vorhandenen Devices (door, light) ausgeben müssen. Habe ich aber eigentlich oben schon geschriebenhier mal das gleiche Skript ergänzt mit ein paar logausgaben, das man sieht wie weit das skript gekommen ist
const { createOmlet } = require('smartcoop-sdk'); async function main() { console.log("start main"); const omlet = await createOmlet('apitoken'); console.log("get devices"); const devices = await omlet.getDevices(); console.log("Devices:"); console.log(devices); const device = await omlet.getDeviceById('deviceid123456'); console.log("get actions"); const openAction = device.getActions().find((action) => action.name === 'open'); console.log("check action"); if (openAction) { console.log("do action"); await device.action(openAction) } } main();und nur nochmal zur Sicherheit weil ich hatte im vorletzten Post nach der API gefragt und du hast mir ein bild der bibliothek im javascript adapter gezeigt.
Du musst dir im omlet portal einen api token generieren.
diesen token entspricht sozusagen deinem userid/passwort. damit weiß omelt um welches konto es sich handelt.
in der dokumentation ist das unter Javascript SDK beschrieben
https://smart.omlet.de/developers/js-sdk
-

Auch mit dem erweiterten Skript von dir funktioniert es leider nicht:
javascript.0 2026-03-08 21:07:59.264 error TypeError: Cannot read properties of undefined (reading 'state') at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:129:29) at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:96:25) at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:148:24) at /opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:24:136 at Array.map (<anonymous>) at Object.<anonymous> (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:24:34) at Generator.next (<anonymous>) at fulfilled (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:5:58) at process.processTicksAndRejections (node:internal/process/task_queues:103:5) javascript.0 2026-03-08 21:07:59.264 error Error: Cannot read properties of undefined (reading 'state') javascript.0 2026-03-08 21:07:59.264 error An error happened which is most likely from one of your scripts, but the originating script could not be detected. -

Auch mit dem erweiterten Skript von dir funktioniert es leider nicht:
javascript.0 2026-03-08 21:07:59.264 error TypeError: Cannot read properties of undefined (reading 'state') at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:129:29) at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:96:25) at createOmletType (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/factories/type.factory.js:148:24) at /opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:24:136 at Array.map (<anonymous>) at Object.<anonymous> (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:24:34) at Generator.next (<anonymous>) at fulfilled (/opt/iobroker/node_modules/@iobroker-javascript.0/smartcoop-sdk/dist/omlet.js:5:58) at process.processTicksAndRejections (node:internal/process/task_queues:103:5) javascript.0 2026-03-08 21:07:59.264 error Error: Cannot read properties of undefined (reading 'state') javascript.0 2026-03-08 21:07:59.264 error An error happened which is most likely from one of your scripts, but the originating script could not be detected.Aber wo sind den die Ausgaben?
Zumindest die ersten paar Inhalte von console.log sollten dort auftauchen.
Wie schon geschrieben. Der Fehler wäre erklärbar. Aber wir brauchen die Ausgaben.hier die logausgabe im scriptfenster.
aus irgendeinem grund kommt der fehler nicht wie früher auch in diesem fenster, sondern im iobroker logso sieht das bei mir im script fenster aus

du siehst die beiden zeilen
start main und
get devices
und das was theoretisch bei dir nach
Devices:
kommt benötigen wirso sieht das bei mir im iobroker log aus

bei mir kommt der fehler 401, was schlich Not Authorized bedeutet, da ich ja keinen api key habe
evtl stellst du mal den log level des javascript adapters auf debug. evtl werden deswegen die ausgaben ausgefiltert -
hast du alles kopiert?
Das ist eine Fehlermeldung die beim ersten Lauf auch zu erwarten wäre, da wir ja die konkrete Device ID noch nicht wissen.
Davor hätte es eigentlich eine Liste der vorhandenen Devices (door, light) ausgeben müssen. Habe ich aber eigentlich oben schon geschriebenhier mal das gleiche Skript ergänzt mit ein paar logausgaben, das man sieht wie weit das skript gekommen ist
const { createOmlet } = require('smartcoop-sdk'); async function main() { console.log("start main"); const omlet = await createOmlet('apitoken'); console.log("get devices"); const devices = await omlet.getDevices(); console.log("Devices:"); console.log(devices); const device = await omlet.getDeviceById('deviceid123456'); console.log("get actions"); const openAction = device.getActions().find((action) => action.name === 'open'); console.log("check action"); if (openAction) { console.log("do action"); await device.action(openAction) } } main();und nur nochmal zur Sicherheit weil ich hatte im vorletzten Post nach der API gefragt und du hast mir ein bild der bibliothek im javascript adapter gezeigt.
Du musst dir im omlet portal einen api token generieren.
diesen token entspricht sozusagen deinem userid/passwort. damit weiß omelt um welches konto es sich handelt.
in der dokumentation ist das unter Javascript SDK beschrieben
https://smart.omlet.de/developers/js-sdk
@jwerlsdf
Hast du in Zeile 5@OliverIO sagte in Omlet Hühnerstall webhook API:
const omlet = await createOmlet('apitoken');
deinen apitoken korrekt eingetragen?
-
@jwerlsdf
Hast du in Zeile 5@OliverIO sagte in Omlet Hühnerstall webhook API:
const omlet = await createOmlet('apitoken');
deinen apitoken korrekt eingetragen?
@Homoran sagte in Omlet Hühnerstall webhook API:
deinen apitoken korrekt eingetragen?
das habe ich bereits sehr oft gefragt.
wenn es an dem lag geb ich sowieso auf.
mein deal ist:
ich bin sorgfältig
DU/ER ist sorgfältig.
wenn es einseitig ist,
dann macht es kein spass -
@Homoran sagte in Omlet Hühnerstall webhook API:
deinen apitoken korrekt eingetragen?
das habe ich bereits sehr oft gefragt.
wenn es an dem lag geb ich sowieso auf.
mein deal ist:
ich bin sorgfältig
DU/ER ist sorgfältig.
wenn es einseitig ist,
dann macht es kein spass@OliverIO ich muss ehrlich sagen, ich wüsste jetzt nicht ob der zwischen die Anführungszeichen kommen müsste, oder ohne, und wenn ja, ob er die richtigen genommen hat. also keine Backticks o.ä.
-
@homoran
natürlich habe ich den token dort zwischen die Anführungszeichen eingetragen. Alternativ würde ich auch den token per pn schicken um definitiv das Problem von meiner Seite auszuschließen. Der Token ist von der Seite 1zu1 kopiert, kann also am "abschreiben" nicht liegen ;) -
@homoran
natürlich habe ich den token dort zwischen die Anführungszeichen eingetragen. Alternativ würde ich auch den token per pn schicken um definitiv das Problem von meiner Seite auszuschließen. Der Token ist von der Seite 1zu1 kopiert, kann also am "abschreiben" nicht liegen ;) -
@homoran
natürlich habe ich den token dort zwischen die Anführungszeichen eingetragen. Alternativ würde ich auch den token per pn schicken um definitiv das Problem von meiner Seite auszuschließen. Der Token ist von der Seite 1zu1 kopiert, kann also am "abschreiben" nicht liegen ;)ok mit vscode kommt bei getdevices der selbe fehler.
ich versuche mal noch etwas anderes.
ok, keine ahnung ob es nun an der bibliothek liegt oder an etwas anderem.
-
per direkter axios kommunikation konnte ich nun die informationen abrufen
-
in den statusinformationen gab es diese information
lastConnected: "2026-03-07T14:06:16+00:00",
nextConnection: "2026-03-07T14:06:16+00:00",
overdueConnection: 1,
keine Ahnung, ob das jetzt daran liegt, das das gerät irgendwie seit gestern kein kontakt mehr hatte.
es gibt genau ein device id
dieses hat die folgenden aktionen die ausgeführt werden könnten[ "calibrate => Calibrate Door", "close => Close Door", "detect => Detect Coop Light", "factory_reset => Factory Reset", "firmware_update => Check for Firmware Update", "off => Light Off", "on => Light On", "open => Open Door", "restart => Restart", "setup_wifi => Reset Wifi Credentials", "stop => Stop Door", ]welche davon sinnvoll sind weiß ich nicht. such dir mal welche aus, die wir hier umsetzen wollen (erst mal mit den wichtigsten anfangen)
darüber hinaus sehe ich den status
state: { light: { state: "onpending", }, general: { firmwareVersionCurrent: "1.0.54-f3d53670", firmwareLastCheck: "2026-03-07T13:16:27+01:00", batteryLevel: 100, powerSource: "external", displayLine1: " ", displayLine2: " ", firmwareVersionPrevious: "1.0.47-6870ee4d", uptime: 6596, }, connectivity: { wifiStrength: -70, ssid: "MTL", connected: false, }, door: { state: "open", lastOpenTime: "2026-03-07T06:00:12+01:00", lastCloseTime: "2026-03-06T23:16:01+01:00", fault: "none", lightLevel: 100, }, },und die configuration
configuration: { door: { openMode: "time", openDelay: 0, openTime: "06:00", closeMode: "light", closeDelay: 0, closeLightLevel: 6, closeTime: "20:00", openLightLevel: 27, doorType: "sliding", colour: "green", lightOffset: 3, temperatureUnit: "C", }, light: { mode: "auto", minutesBeforeClose: 5, maxOnTime: 3, equipped: 2, }, connectivity: { wifiState: "on", }, general: { datetime: "2026-03-07T14:56:35+01:00", timezone: "Europe/Berlin", updateFrequency: 86400, language: "de", stayAliveTime: 0, statusUpdatePeriod: 21600, pollFreq: 600, overnightSleepEnable: true, overnightSleepStart: "21:00", overnightSleepEnd: "05:00", }, }, -
-
Hi, das sieht sehr gut aus. Ja tatsächlich habe ich seit gestern den Stecker von der Tür gezogen. Dadurch habe ich auch keine Infos mehr in der app. Ich werde nachher gerne die Tür an die Steckdose wieder stecken, sobald ich von der Arbeit zurück bin. Da sollten hoffentlich bei dir aktuelle Infos reinkommen.
-
Die wichtigsten FUnktionen wären für mich das Licht an/ausschalten und die Tür auf/zu machen zu können. SO wie ich das dann verstanden habe, kann ich die Konfiguration ebenfalls ändern? Dann wäre die dritte funktion die Uhrzeiten zu ändern (open and close Time).
-
Die wichtigsten FUnktionen wären für mich das Licht an/ausschalten und die Tür auf/zu machen zu können. SO wie ich das dann verstanden habe, kann ich die Konfiguration ebenfalls ändern? Dann wäre die dritte funktion die Uhrzeiten zu ändern (open and close Time).
so hier zum probieren für die erste runde für licht und tor
token noch eintragen
den device id hab ich jetzt nicht versteckt, ohne den token kann da niemand was mit anfangen
vor dem start bitte noch die beiden datenpunkte vom typ boolean anlegen und die datenpunktnamen dann am anfang in der configuration area eintragen.
prüfe bitte mal ob du bei den zusätzlichen npm module auch axios eingetragen hast.
eigentlich ist das nicht notwendig, da der javascriptadapter selbst axios verwendet, aber um für die zukunft sauber zu sein ist das bessermeine aktuellen experimente für das licht hat den status 204 zurückgegeben.
der doku nach bedeutet dasAction has been queued to be sent to the device
Keine Ahnung ob jetzt alles abgespult wird wenn du es anschaltest.
// -- configuration area const token = 'apitoken'; const outdoorDeviceId = 'laTnMsWSJxBMGgJD'; const dp_light = '0_userdata.0.omlet.light'; // datenpunkt mit typ bool anlegen und namen hier eintragen const dp_door = '0_userdata.0.omlet.door'; // datenpunkt mit typ bool anlegen und namen hier eintragen // -- const axios = require("axios/dist/browser/axios.cjs"); const BASE_URL = 'https://x107.omlet.co.uk/api/v1'; //kann hier geprüft werden https://smart.omlet.de/developers/api let omlet = undefined; async function connect() { console.log("start main2"); omlet = await omletAPIClient(token); await getDevices(true); //console.log(JSON.stringify(await getDevices(), null, 2)); } async function getDevices(info = false) { try { const devices = await getRequest('/device'); if (devices && info) { devices.forEach(device => { console.log(`Device name: ${device.name}, deviceId: ${device.deviceId}`); }); } return devices; } catch (error) { console.log(error); return []; } } async function doAction(deviceId, actionName) { const devices = await getDevices(); const device = devices.find(device => device.deviceId === deviceId); if (device) { const action = device.actions.find(action => action.actionName === actionName); if (action) { await postRequest(action.url); } } } async function lightOn(deviceId) { await doAction(deviceId, 'on'); } async function lightOff(deviceId) { await doAction(deviceId, 'off'); } async function doorOpen(deviceId) { await doAction(deviceId, 'open'); } async function doorClose(deviceId) { await doAction(deviceId, 'close'); } function omletAPIClient(token) { return axios.create({ baseURL: BASE_URL, headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, }); } async function getRequest(url) { try { const data = await omlet.get(url); console.debug(`get request: ${url},status: ${data.status}`); return data.data; } catch (e) { console.log(e); } } async function postRequest(url) { try { const data = await omlet.post(url); console.debug(`post request: ${url},status: ${data.status}`); return data.data; } catch (e) { console.log(e); } } async function main() { await connect(); on({ id: dp_door, change: 'ne' }, async (evt) => { //log(evt); if (evt.state.val) { await doorOpen(outdoorDeviceId); } else { await doorClose(outdoorDeviceId); } }); on({ id: dp_light, change: 'ne' }, async (evt) => { //log(evt); if (evt.state.val) { await lightOn(outdoorDeviceId); } else { await lightOff(outdoorDeviceId); } }); // await lightOn(outdoorDeviceId); // await lightOff(outdoorDeviceId); } main(); -
Vielen vielen lieben Dank. Es funktioniert hervorragend! :)
Die Umbenennung mache ich dann über die VIS da false für tür zu etwas verwirrend ist.Würdest du mir noch bitte folgende Funktionen einbauen?
-Tür stop
-Uhrzeiten einstellbar Manuel oder Zeiteingabe für Tür auf/zu ggf zusätzlich Astrofunktion (wobei ich letzteres auch selbst mit einem zweiten Script lösen könnte.... dann soll einfach alles auf manual laufen.

