Ich habe es hinbekommen
NPM neu installiert und jetzt läuft der S7 Adapter.
Ich habe es hinbekommen
NPM neu installiert und jetzt läuft der S7 Adapter.
Ich habe ioBroker wieder am laufen.
Leider nicht über Backitup, sondern ich habe den ioBroker Data Ordner ausgetauscht.
Es läuft alles wieder. Alle Instanzen wurden neu Installiert und ich habe keine Fehlermeldungen.
Warum ich das Backup nicht über Backitup herstellen konnte, keine Ahnung.
Lieben Gruß
Hallo zusammen,
ich bin gerade dabei meine zweite Vis zu erstellen. Ich bin noch nicht fertig, aber der größte Teil ist erledigt
Mein System ist auf folgenden Stand:
Admin Version 6.3.5
JS Controller Version 4.0.23
Node JS version 16.19.0
NPM 8.19.3
Damit läuft es ohne Probleme
Hi,
ich kann dir gar nicht sagen wie dankbar ich dir bin. Das funktioniert einwandfrei.
Ist es möglich die weiße (Bildlaufleiste rot markiert) unsichtbar zu machen?
Oder gibt es eine funktion Bildlaufleiste deaktivieren)
PS: Die Funktion --enable-auto-reload in chromium hat nicht funktiniert.
Hallo liebe Forengemeinde,
villeicht befinden sich hier noch einige Camper unter euch
Ich habe ioBroker in meinem Hobby Wohnwagen verbaut . Da ab Werk bereits das Hobby Connect verbaut ist, wäre es super wenn ich das via ioBorker mit einbinden könnte. Die Connect Box ist ein Pi 3B welches via Bluetooh mit dem Handy komuniziert. Von dem Pi geht es von USB auf einen Serial Wandler der das Lichtsteursystemn via CI Bus steuert. Das Original Image von der Connect Box habe ich als Image ausgelesen.
Es wäre schön wenn ich noch die vorhandenen CI Bus Signale vom Hobby Connect abgreifen kann. Licht, Wasserstand usw. Dazu müsste es für den IoBroker ein Adapter geben. Kann mir dabei einer von euch helfen? Oder als gemeinsames Projekt lösen?
Aktuell kann ich darüber folgendes über ioBroker Steuern bzw. abfragen:
Temperatur Sensoren (Shelly)für den Kühlschrank, Gefrierschrank, Außentemperatur
Dazu wird automatisch je nach Außentemperatur der Kühlschrank Ventilator automatisch ein bzw. ausgeschaltet.
Ventile Therme
ich habe für die Therme und das Frischwasser elektrische Kugelhähne verbaut. Andauernd die Kissen wegräumen ging mir auf den Keks. Diese steuere ich über eine Siemens Logo, die via Iobroker gesteuert wird. Zusätzlich kann ich die Ventile via Taster immer noch manuell steuern falls Iobroker mal ausfällt.
Waage für die Gasflaschen:
Der Füllstand der Gasflaschen wir über Wägezellen ermittelt.
ESP8266
Leistungsmessung:
(Shelly Leistungsmessung) je nach Campingplatz Absicherung, kann ich die Absicherung einstellen und es erfolgt bei überlast ein Signal.
Alexa:
Radiosender, Lautstärke usw.
CPE:
TP Link CPE 210 WLAN Outdoor Accespoint. Wlan von Campingplatz auswählen. Hier habe ich noch das Problem das ich an der Login Seite der CPE Antenne nicht weiter komme. Habe es über iFrame versucht. Doch leider bleibt immer die Login Seite auch nach der Benutzername und Passwort Eingabe stehen.
Lieben Gruß!
@frank579 sagte in View Adapter Status:
momentDurationFormatSetup(moment);
Hi,
jetzt funktionert es wieder.
PS: Habe das nur im Skript hinzugefügt.
Das braucht nicht unter den Zusätzlichen NPM Modulen hinzugefügt werden.
Vielen Dank an euch beiden für die schnelle Hilfe.
Hi,
ist leider immer noch
script.js.Adapter_Status: [adapterStatus] error: moment.duration(...).format is not a function, stack: TypeError: moment.duration(...).format is not a function at Object.adapterStatus (script.js.Adapter_Status:109:115) at Object.callback (C:\ioBroker\node_modules\iobroker.javascript\lib\sandbox.js:1452:38) at Object.stateChange (C:\ioBroker\node_modules\iobroker.javascript\main.js:645:29) at Immediate._onImmediate (C:\ioBroker\node_modules\@iobroker\js-controller-adapter\src\lib\adapter\adapter.ts:11053:62) at processImmediate (node:internal/timers:483:21)
Hier habe ich die entfernt.
Hallo Zusammen,
ich habe nach dem Urlaub mein System auf den Aktuellen Stand gebracht, und nun folgende Fehlermeldung.
script.js.Adapter_Status: [adapterStatus] error: moment.duration(...).format is not a function, stack: TypeError: moment.duration(...).format is not a function at Object.adapterStatus (script.js.Adapter_Status:109:115) at Job.job (C:\ioBroker\node_modules\iobroker.javascript\lib\sandbox.js:1876:34) at Job.invoke (C:\ioBroker\node_modules\node-schedule\lib\Job.js:171:15) at C:\ioBroker\node_modules\node-schedule\lib\Invocation.js:268:28 at Timeout._onTimeout (C:\ioBroker\node_modules\node-schedule\lib\Invocation.js:228:7) at listOnTimeout (node:internal/timers:581:17) at processTimers (node:internal/timers:519:7)
Habt ihr eine Idee was da sein kann?
Vielen Dank im Voraus
Hier das Skript
// Imports -> müssen im Javascript Adapter unter 'Zusätzliche NPM-Module' eingetragen sein
const moment = require("moment");
const momentDurationFormatSetup = require("moment-duration-format");
// Skript Einstellungen *************************************************************************************************************************************************
let dpList = '0_userdata.0.vis.AdapterStatus.jsonList'; // Datenpunkt für IconList Widget (Typ: Zeichenkette (String))
let dpAdapterRestart = '0_userdata.0.vis.AdapterStatus.restartTrigger'; // Datenpunkt für Adapter restart (Typ: Zeichenkette (String))
let dpSortMode = '0_userdata.0.vis.AdapterStatus.sortMode'; // Datenpunkt für Sortieren (Typ: Zeichenkette (String))
let dpFilterMode = '0_userdata.0.vis.AdapterStatus.filterMode'; // Datenpunkt für Filter (Typ: Zeichenkette (String))
let adminUpdatesList = 'admin.0.info.updatesList'; // Datenpunkt Admin Adapter für verfübare Updates der Adapter
const checkInterval = 30; // Interval wie oft Status der Adapter aktualisiert werden soll (in Sekunden)
let sprache = 'de'; // Sprache für formatierung Dauer
let formatierungDauer = "dd[T] hh[h] mm[m]"; // Formatierung der Dauer -> siehe momentjs library
let neustarten = true; // true: Adapter wird neugestartet, false: Adapter wird gestoppt oder gestartet
let farbeAdapterAktiv = 'green'; // Status Bar Farbe wenn Adapter aktiv ist
let farbeAdapterNichtAktiv = 'FireBrick'; // Status Bar Farbe wenn Adapter nicht aktiv ist oder Fehler vorliegt
let farbeAdapterDeaktiviert = 'darkgrey'; // Status Bar Farbe wenn Adapter deaktiviert ist
let farbeAdapterNichtVerbunden = 'yellow'; // Status Bar Farbe wenn Adapter nicht verbunden ist
let farbeAdapterZeitgesteuert = 'lightgreen'; // Status Bar Farbe wenn Adapter zeitgesteuert ist
let farbeAdapterErweiterung = '#44739e'; // Status Bar Farbe wenn Adapter Erweiterung ist
let farbeAdapterSystem = '#44739e'; // Status Bar Farbe wenn Adapter mit System gestartet wird
let sortResetAfter = 120; // Sortierung nach X Sekunden auf sortReset zurücksetzen (0=deaktiviert)
let sortReset = 'memHeapUsed' // Sortierung auf die zurückgesetzt werden soll
let filterResetAfter = 120; // Filter nach X Sekunden zurücksetzen (0=deaktiviert)
// **********************************************************************************************************************************************************************
// Fomate für moment Lib
moment.locale(sprache);
// auf .alive Änderungen hören
let aliveSelector = `[id=system.adapter.*.alive]`;
let adapterAliveList = $(aliveSelector);
if (adapterAliveList.length === 0) {
// Fehlermeldung ausgeben, wenn selector kein result liefert
console.error(`no result for selector '${aliveSelector}'`)
} else {
// listener nur für Änderung bei alive
adapterAliveList.on(adapterStatus);
}
// auf .connection Änderungen hören
let connectionSelector = `[id=*.info.connection]`;
let adapterConnectionList = $(connectionSelector);
if (adapterConnectionList.length === 0) {
// Fehlermeldung ausgeben, wenn selector kein result liefert
console.error(`no result for selector '${connectionSelector}'`)
} else {
// listener nur für Änderung bei alive
adapterConnectionList.on(adapterStatus);
}
// auf .connected Änderungen hören
let connectedSelector = `[id=system.adapter.*.connected]`;
let adapterConnectedList = $(connectedSelector);
if (adapterConnectedList.length === 0) {
// Fehlermeldung ausgeben, wenn selector kein result liefert
console.error(`no result for selector '${connectedSelector}'`)
} else {
// listener nur für Änderung bei alive
adapterConnectedList.on(adapterStatus);
}
// auf Änderungen der Sortieung hören
on({ id: dpSortMode, change: 'any' }, adapterStatus);
on({ id: dpSortMode, change: 'any' }, resetSort);
// auf Änderungen der Filter hören
on({ id: dpFilterMode, change: 'any' }, adapterStatus);
on({ id: dpFilterMode, change: 'any' }, resetFilter);
// Funktion adapterStatus alle x Sekunden ausführen
schedule('*/' + checkInterval + ' * * * * *', adapterStatus);
function adapterStatus() {
// Funktion um Status der Adapter abzurufen und als JSON String für das Material Design Widget IconList aufbereiten
try {
let adapterList = [];
let updateList = myHelper().getStateValueIfExist(adminUpdatesList);
for (var i = 0; i <= adapterAliveList.length - 1; i++) {
let id = adapterAliveList[i].replace('.alive', '');
let obj = getObject(adapterAliveList[i].replace('.alive', ''));
let nameArray = id.replace('system.adapter.', '').split(".");
let name = nameArray[0];
name = name.charAt(0).toUpperCase() + name.slice(1);
let nameWithInstance = name;
let adapterInstance = nameArray[1];
if (parseInt(adapterInstance) > 0) {
nameWithInstance = name + '.' + adapterInstance;
}
let uptime = (existsState(id + '.uptime')) ? moment.duration(getState(id + '.uptime').val, 'seconds').format(formatierungDauer, 0) : '-';
let image = (myHelper().checkCommonPropertyExist(obj, 'icon')) ? `/${nameArray[0]}.admin/${obj.common.icon}` : 'image-off-outline';
let hasUpdates = updateList && updateList.includes(nameArray[0]);
let newVersion = (hasUpdates) ? '<span class="mdi mdi-update" style="color: #ec0909;"></span>' : '';
let text = `<div style="display: flex; flex-direction: row; line-height: 1.5; padding-right: 8px; align-items: center;">
<div style="flex: 1">${newVersion} ${nameWithInstance}</div>
<div style="color: grey; font-size: 12px; font-family: RobotoCondensed-LightItalic;">${myHelper().getCommonPropertyIfExist(obj, 'version', '-', 'v', '')}</div>
</div>`
let subText = `<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
<div style="flex: 1;">CPU</div>
<div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${myHelper().getStateValueIfExist(id + '.cpu', '-', '', ' %')}</div>
</div>
<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
<div style="flex: 1;">RAM total</div>
<div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${myHelper().getStateValueIfExist(id + '.memHeapTotal', '-', '', ' MB')}</div>
</div>
<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
<div style="flex: 1;">RAM verwendet</div>
<div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${myHelper().getStateValueIfExist(id + '.memHeapUsed', '-', '', ' MB')}</div>
</div>
<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
<div style="flex: 1;">RAM reserviert</div>
<div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${myHelper().getStateValueIfExist(id + '.memRss', '-', '', ' MB')}</div>
</div>
<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
<div style="flex: 1;">Betriebszeit</div>
<div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${uptime}</div>
</div>
<div style="display: flex; flex-direction: row; line-height: 1.3; padding-left: 1px; padding-right: 8px; align-items: center;">
<div style="flex: 1;">Modus</div>
<div style="color: grey; font-size: 14px; font-family: RobotoCondensed-LightItalic; text-align: right;">${myHelper().getCommonPropertyIfExist(obj, 'mode', '-')}</div>
</div>`
let statusBarColor = farbeAdapterNichtAktiv;
let status = 3;
if (myHelper().getStateValueIfExist(adapterAliveList[i]) === 'true') {
statusBarColor = farbeAdapterAktiv;
status = 0;
if (existsState(id.replace('system.adapter.', '') + '.info.connection')) {
if (!getState(id.replace('system.adapter.', '') + '.info.connection').val) {
statusBarColor = farbeAdapterNichtVerbunden;
status = 4;
}
} else {
if (myHelper().getStateValueIfExist(adapterAliveList[i].replace('.alive', '.connected')) === 'false') {
statusBarColor = farbeAdapterNichtVerbunden;
status = 4;
}
}
}
if (myHelper().getCommonPropertyIfExist(obj, 'mode') === 'schedule') {
// Adapter ist zeitgesteuert
statusBarColor = farbeAdapterZeitgesteuert;
status = 1;
}
if (myHelper().getCommonPropertyIfExist(obj, 'mode') === 'extension') {
// Adapter ist Extension
statusBarColor = farbeAdapterErweiterung;
status = 1;
}
if (myHelper().getCommonPropertyIfExist(obj, 'mode') === 'once') {
// Adapter wird mit System gestartet
statusBarColor = farbeAdapterSystem;
status = 1;
}
if (myHelper().getCommonPropertyIfExist(obj, 'enabled', false).toString() === 'false') {
// Adapter ist deaktiviert
statusBarColor = farbeAdapterDeaktiviert;
status = 2;
}
adapterList.push({
text: text,
subText: subText,
image: image,
listType: "buttonState",
objectId: dpAdapterRestart,
buttonStateValue: id,
statusBarColor: statusBarColor,
showValueLabel: false,
name: name,
mode: myHelper().getCommonPropertyIfExist(obj, 'mode'),
hasUpdates: hasUpdates,
cpu: parseFloat(myHelper().getStateValueIfExist(id + '.cpu', '0')),
memHeapTotal: parseFloat(myHelper().getStateValueIfExist(id + '.memHeapTotal', '0')),
memHeapUsed: parseFloat(myHelper().getStateValueIfExist(id + '.memHeapUsed', '0')),
memRss: parseFloat(myHelper().getStateValueIfExist(id + '.memRss', '0')),
uptime: parseFloat(myHelper().getStateValueIfExist(id + '.uptime', 0)),
status: status,
lockEnabled: true
})
}
let sortMode = myHelper().getStateValueIfExist(dpSortMode, 'name');
if (sortMode === 'name' || sortMode === 'mode') {
adapterList.sort(function (a, b) {
return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1;
});
} else if (sortMode === 'hasUpdates' || sortMode === 'cpu' || sortMode === 'memHeapTotal' || sortMode === 'memHeapUsed' || sortMode === 'memRss' || sortMode === 'uptime' || sortMode === 'status') {
adapterList.sort(function (a, b) {
return a[sortMode] == b[sortMode] ? 0 : +(a[sortMode] < b[sortMode]) || -1;
});
} else {
// default: nach name sortieren
sortMode = 'name'
adapterList.sort(function (a, b) {
return a[sortMode].toLowerCase() == b[sortMode].toLowerCase() ? 0 : +(a[sortMode].toLowerCase() > b[sortMode].toLowerCase()) || -1;
});
}
// Filter: not connected, updates, deaktiviert, aktiviert
let filterMode = myHelper().getStateValueIfExist(dpFilterMode, null);
if (filterMode && filterMode !== null && filterMode !== '') {
if (filterMode === 'hasUpdates') {
adapterList = adapterList.filter(function (item) {
return item.hasUpdates === true;
});
} else if (filterMode === 'notConnected') {
adapterList = adapterList.filter(function (item) {
return item.status === 4;
});
} else if (filterMode === 'deactivated') {
adapterList = adapterList.filter(function (item) {
return item.status === 2;
});
} else if (filterMode === 'activated') {
adapterList = adapterList.filter(function (item) {
return item.status <= 1;
});
}
}
let result = JSON.stringify(adapterList);
if (existsState(dpList) && getState(dpList).val !== result) {
setState(dpList, result, true);
} else {
setState(dpList, result, true);
}
} catch (err) {
console.error(`[adapterStatus] error: ${err.message}, stack: ${err.stack}`);
}
}
// Beim Staren des Skriptes Adapter Status abrufen
adapterStatus();
// Funktion um Adapter zu starten / neu starten
on({ id: dpAdapterRestart }, function (obj) {
var adapter = getObject(obj.state.val.toString());
if (neustarten) {
if (adapter.common && adapter.common.enabled === false) {
// Adapter deaktiviert -> starten
adapter.common.enabled = true;
}
} else {
if (adapter.common && adapter.common.enabled) {
adapter.common.enabled = !adapter.common.enabled;
} else {
adapter.common.enabled = true;
}
}
setObject(obj.state.val, adapter);
console.log(`${obj.state.val.replace('system.adapter.', '')} neugestartet`);
});
function resetSort() {
let sortMode = myHelper().getStateValueIfExist(dpSortMode, null);
if (sortResetAfter > 0) {
setTimeout(function () {
if (sortMode !== null && sortMode === myHelper().getStateValueIfExist(dpSortMode, null)) {
setState(dpSortMode, sortReset);
}
}, sortResetAfter * 1000);
}
}
function resetFilter() {
let filterMode = myHelper().getStateValueIfExist(dpFilterMode, null);
if (filterResetAfter > 0) {
setTimeout(function () {
if (filterMode !== null && filterMode === myHelper().getStateValueIfExist(dpFilterMode, null)) {
setState(dpFilterMode, '');
}
}, filterResetAfter * 1000);
}
}
function myHelper() {
return {
getStateValueIfExist: function (id, nullValue = undefined, prepand = '', append = '') {
if (existsState(id)) {
return prepand + getState(id).val + append;
} else {
return nullValue;
}
},
getCommonPropertyIfExist: function (object, prop, nullValue = undefined, prepand = '', append = '') {
if (myHelper().checkCommonPropertyExist(object, prop)) {
return prepand + object.common[prop] + append;
} else {
return nullValue;
}
},
checkCommonPropertyExist: function (object, prop) {
if (object && object.common && object.common[prop]) {
return true;
} else {
return false;
}
}
}
}
Dank Chat GPT ist die Bildlaufleiste nun auch entfernt. So funktinoiert es.
Kann ich den Code von Chat GPT so lassen?
<!DOCTYPE html>
<html>
<head>
<title>ioBroker wird geladen</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="refresh" content="60; url=http://192.168.0.3:8082/vis/index.html?Wohnwagen#Home" />
<style>
body {
background-color: #000000;
color: #ffffff;
font-family: Arial, Helvetica, sans-serif;
overflow: hidden; /* Prevents scrollbars from appearing */
margin: 0; /* Removes any default body margin */
height: 100vh; /* Ensures the body takes up the full viewport height */
display: flex;
justify-content: center;
align-items: center;
}
p {
text-align: center;
font-size: 60px;
margin: 0; /* Removes default paragraph margin */
}
</style>
</head>
<body>
<p id="countdown">ioBroker VIS wird in 60 Sekunden gestartet ...</p>
<script>
var counter = 60;
var interval = setInterval(function() {
counter = counter - 1;
if (counter <= 0) {
clearInterval(interval);
document.getElementById("countdown").innerHTML = "ioBroker VIS wird gestartet ...";
return;
} else {
document.getElementById("countdown").innerHTML = "ioBroker VIS wird in<br><br>" + counter + "<br><br>Sekunden gestartet ...";
}
}, 1000);
</script>
</body>
</html>
Hi,
ich kann dir gar nicht sagen wie dankbar ich dir bin. Das funktioniert einwandfrei.
Ist es möglich die weiße (Bildlaufleiste rot markiert) unsichtbar zu machen?
Oder gibt es eine funktion Bildlaufleiste deaktivieren)
PS: Die Funktion --enable-auto-reload in chromium hat nicht funktiniert.
@bananajoe
Vielen Dank für deine Unterstützung.
Ich werde als erstes die --enable-auto-reload Funktion einbauen.
Wenn das nicht funktioniert schaue ich mir deine Lösung an.
Hast du das bei dir so umgesetzt? Läuft das ohne Probleme? Kein einfrieren oder ähnliches?
Funktioniert leider auch nicht