@arteck said in javascript fehler nach update:
@Zeiss sagte in javascript fehler nach update:
velux-klf-api
zeigmal das script
'use strict' ;
// Netzwerk
const Ip = '192.168.2.89'
const Passwort = '*************italicised text*' // WLAN Passwort
const baseObjectPath = 'javascript.0.Velux.'
const harmony = '1'
const Rollos = {
RolladenBuero: 0,
RolladenWohnzimmer: 1,
RolladenKueche: 2,
RolladenEsszimmer: 3,
RolladenSchlafzimmer: 4,
RolladenGaestezimmer: 5,
RolladenJulian: 6
}
// Gruppen. All, SZ, .. are then names of states. Add new properties for more groups
const groups = {
All : Object.values(Rollos), // all IDs of shutters
hinten: [Rollos.RolladenBuero, Rollos.RolladenKueche, Rollos.RolladenEsszimmer, Rollos.RolladenSchlafzimmer], // Hofseite
vorne : [Rollos.RolladenWohnzimmer, Rollos.RolladenGaestezimmer], // Strasse
}
const All = Object.keys(Rollos)
for(let shutter of All) {
createState(baseObjectPath + 'shutter.' + shutter, 0, { name: 'shutter ' + shutter, type: 'number', min: 0, max: 100, unit: '%'})
}
for(let key of Object.keys(groups)) {
createState(baseObjectPath + 'groups.' + key, 0, { name: 'group ' + key, type: 'number', min: 0, max: 100, unit: '%'})
}
const MaxNodeIdx = All.length; // 5 Rollos..
const Up = 0 // Rollo oben
const Down = 0xc800 // Rollo unten
const Stop = 0xD200 // Stopkommando
// Variable
var velux = require('velux-klf200-api')
var Connected = false
let Commands = {}
var SessionId = 0
// Zustand der Rollos holen
function GetState(shutters, sessionId)
{
if (Connected) {
shutters = shutters || All
log('checking shutters ' + JSON.stringify(shutters), 'debug')
velux.sendCommand({
api: velux.API.GW_STATUS_REQUEST_REQ,
sessionID: sessionId || 0,
indexArrayCount: shutters.length,
indexArray : shutters,
statusType : 3 // Main Info
})
}
}
// Callback fuer Positionsrueckmeldung
velux.on('GW_STATUS_REQUEST_NTF', Status);
function Status(data) {
var Target = Math.round(100 - data.targetPosition.value)
var Current = Math.round(100 - data.currentPosition.value) // aktuelle Position
var Time = data.remainingTime // Restlaufzeit
var Index = data.index // Node index
var StatusType = data.statusType // Status Typ "Main Info" = 3 erwartet
//console.log(JSON.stringify(data))
//console.log(Z[data.index] + ': Ziel ' + Target + ' Aktuell: ' + Current + ' Restlaufzeit :' + Time)
if ( (StatusType === 3) &&
(Index >= 0) &&
(Index < MaxNodeIdx))
{
var IdStrIst = baseObjectPath + 'shutter.' + Z[data.index]
setState(IdStrIst, Current, true)
}
}
// Callback Ende Job
velux.on('GW_SESSION_FINISHED_NTF', JobFinished);
function JobFinished(data) {
log("EndCmd (" + data.sessionID+')', 'debug')
let sessionKey = 'session_' + data.sessionID
if (typeof Commands[sessionKey] !== 'undefined') {
let shutters = Commands[sessionKey].shutters
// get state after job finished
GetState(shutters, data.sessionID)
delete Commands[sessionKey]
}
}
// Verbindung aufbauen
function ConnectKlf() {
if (! Connected) {
Connected = true;
velux.connect( Ip, {} ).then(()=>{
velux.login( Passwort ).then(()=>{
log("Klf connected!", 'info')
Connected = true
GetState();
})
})
.catch((err)=>{
log('connect error ' + JSON.stringify(err), 'error')
Connected = false
velux.end()
})
}
}
function Rollo( Rollos, Val) {
if ( Connected )
{
return velux.sendCommand({ api: velux.API.GW_COMMAND_SEND_REQ,
sessionID : ++SessionId,
commandOriginator: 1,
priorityLevel: 2,
parameterActive: 1,
functionalParameterMP: {rawValue : Val},
indexArrayCount: Rollos.length,
indexArray : Rollos,
priorityLevelLock: false,
}).then((data)=>{
log("StartCmd (" + data.sessionID+')', 'debug')
Commands['session_' + data.sessionID] = {
shutters: Rollos
}
})
.catch((err)=>{
log(err, 'error')
})
}
}
// Restart einmal pro Tag um 22 Uhr
schedule('5 20 * * *', function () {
velux.sendCommand({ api: velux.API.GW_REBOOT_REQ})
Connected = false
});
// zyklisches Senden Idle Telegramm und Rolladenstatus holen
schedule('*/1 * * * *', function () {
velux.sendCommand({ api: velux.API.GW_GET_STATE_REQ})
.then((data) => {
//Connected = true
GetState() // Rolladenpostionen holen
})
.catch((err) => {
Connected = false
log('Connection lost...' +JSON.stringify(err), 'error')
ConnectKlf()
})
});
// Verbinden zu klf200
ConnectKlf()
// Verbindung abbauen und aufraeumen bei Stop
onStop(() => {
Connected = false
log("Disconnect", 'info')
velux.off('GW_STATUS_REQUEST_NTF', Status)
velux.off('GW_SESSION_FINISHED_NTF', JobFinished)
velux.end()
});
on({id: new RegExp(baseObjectPath.replace('.', '\.') + 'shutter\..*'), change:'any', ack: false}, function (obj) {
let State = Down - Down / 100 * obj.state.val
let shutterName = obj.id.split('.').slice(-1)[0]
let shutterId = Rollos[shutterName]
log('Moving shutter ' + shutterName + '(' + shutterId + ')' + ' to ' + obj.state.val + '%', 'info')
Rollo([shutterId], State)
});
on({id: new RegExp(baseObjectPath.replace('.', '\.') + 'groups\..*'), change:'any', ack: false}, function (obj) {
let State = Down - Down / 100 * obj.state.val
let shutterName = obj.id.split('.').slice(-1)[0]
let shutters = groups[shutterName] || []
if (shutters.length > 0) {
log('Moving shutter group ' + shutterName + ' to ' + obj.state.val + '%', 'info')
Rollo(shutters, State)
}
});
//*******************************************************************************
// Mapping fuer Logitech Harmony
//*******************************************************************************
// Dach zu
subscribe({id: 'fakeroku.0.ioBroker.keys.Up', val : true, ack :true}, function (obj) {
Rollo(harmony, Up)
});
// Dach auf
subscribe({id: 'fakeroku.0.ioBroker.keys.Down', val : true, ack :true}, function (obj) {
Rollo(harmony, Down)
});
// Dach Stop
subscribe({id: 'fakeroku.0.ioBroker.keys.Select', val : true, ack :true}, function (obj) {
Rollo(harmony, Stop)
});