Lange Zeit im Bereich IT als Systemadministrator und später als IT-Leiter gearbeitet, aber jetzt als Rentner im wohlverdienten Ruhestand. :-)
SmartHome und IoBroker sind einfach nur ein tolles Hobby, dem ich mich jeden Tag aufs neue, mit Begeisterung widme.
Am meisten Spaß macht mir Blockly und irgendwann werde ich es auch wirklich begreifen. Das heißt, das ich viele Blocklys gebaut habe, aber viele davon bestimmt zu umständlich sind, aber sie funktionieren. Ich lerne ja auch jeden Tag dazu.
Alter Schwede, manchmal ist man einfach zu blöd . Du hast recht, ich hatte nur Websocket und von socket.io keine Instanz installiert. Hab also die Instanz hinzugefügt, den Port angepasst und schon funktioniert es.
Moin, ich hatte gestern eine ähnliche Situation und da fiel mir das Video von Matthias Kleine wieder ein. Sieh es dir mal an, schätze das du dein Problem dann lösen kannst. Zeitdifferenzen formatieren im ioBroker: https://www.youtube.com/watch?v=sxkz3O6nfFQ&t=407s
ist alles gut. Die Datensätze werden sortiert und in den neuen Datenpunkt geschrieben.
Dann habe ich die Datensätze durch die Variable ersetzt:
const sourceObject = 'device-watcher.0.devices.hmrpc.listAll';
const targetObject = '0_userdata.0.Datenpunkte_VIS.HM_ListAll_Sortiert';
// JSON-Objekt mit den Geräteinformationen
const deviceListe = JSON.parse(getState(sourceObject).val);
// Nach dem "Device"-Namen sortieren
deviceListe.sort((a, b) => {
const deviceA = a.Device.toUpperCase();
const deviceB = b.Device.toUpperCase();
if (deviceA < deviceB) {
return -1;
}
if (deviceA > deviceB) {
return 1;
}
return 0;
});
// Sortierte Geräteliste in das Zielobjekt schreiben
setState(targetObject, JSON.stringify(deviceListe));
console.log('Sortierte Geräteliste wurde in ' + targetObject + ' geschrieben.');
Da bekomme ich Fehler zurück, also das Script angepasst und Fehler ausspucken lassen.
Dann bekomme ich den Fehler zurück, das er das nicht parsen kann.
const sourceObject = 'device-watcher.0.devices.hmrpc.listAll';
const targetObject = '0_userdata.0.Datenpunkte_VIS.HM_ListAll_Sortiert';
// JSON-Objekt mit den Geräteinformationen
let deviceListe;
try {
deviceListe = JSON.parse(getState(objectName).val);
} catch (error) {
console.error('Fehler beim Parsen des JSON-Objekts:', error);
return;
}
// Nach dem "Device"-Namen sortieren
deviceListe.sort((a, b) => {
const deviceA = a.Device.toUpperCase();
const deviceB = b.Device.toUpperCase();
if (deviceA < deviceB) {
return -1;
}
if (deviceA > deviceB) {
return 1;
}
return 0;
});
// Sortierte Geräteliste in das Zielobjekt schreiben
setState(targetObject, JSON.stringify(deviceListe));
console.log('Sortierte Geräteliste wurde in ' + targetObject + ' geschrieben.');
Fehlermeldung:
06:14:32.944 error javascript.0 (2196) script.js.Test_Scripte.HM_Script_sortieren_3: Fehler beim Parsen des JSON-Objekts:
06:14:32.944 info javascript.0 (2196) script.js.Test_Scripte.HM_Script_sortieren_3: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
06:14:54.361 info javascript.0 (2196) Stop script script.js.Test_Scripte.HM_Script_sortieren_3
Wie schon gesagt, ich hab keine Ahnung vom Srcipten und alles was ich gemacht habe, ist aus dem Netz. Laut Netzt soll ich überprüfen ob das zu lesende Objekt ein gültiges JSON Format ist. Aus meiner Sicht ist das so, aber ich hab keine Ahnung wie ich das jetzt prüfen soll und wo ich suchen soll
@dslraser
Die Fehlermeldung kam auch nur, wenn man das Blockly zum Bearbeiten öffnen wollte. Nach dem Öffnen einmal irgendwas im Blockly anklicken und man musste speichern, obwohl man nichts geändert hatte. Das liegt aber an irgendeinem Update und war bei allen meinen Blocklys der Fall.
Ich habe jetzt gerade die VM mal neu gestartet und im Moment ist es wieder schneller, so 20 bis 30 Sekunden. Das sind ja richtig "große" (Export 38.725 Zeilen) Blocklys und die muss ich auch nicht regelmäßig anpassen, also passt das schon mit der Zeit.
Wenn ich per Telegram "Fenster" an den IOB schicke, kommt sofort die Antwort und das ist das Wichtigste. Es funktioniert also wie gewünscht.
Gibt es die Möglichkeit die Liste mit Räumen die gelüftet werden müssen, anders dar zu stellen ?`
Ich lasse es so in einem Inventwo Universal Widget anzeigen:
Dazu habe ich ein Script, welches den Datenpunkt "0_userdata.0.Raumklima.Lüften_Liste" aufteilt auf mehrere DP und die Länge kann man einstellen. Dazu habe ich 3 Datenpunkte angelegt: "0_userdata.0.Raumklima.Raum_1" bis "Raum_3" und die maximale verfügbare Zeichenzahl auf 35 gestellt. Das passt bei mir perfekt. Wenn ich die Zeichenlänge runtersetze auf 30, sieht es so aus:
Das ist das Scipt dazu:
//Liste_zu_Lueften_aufteilen_Komma
const sourceDpId = '0_userdata.0.Raumklima.Lüften_Liste'; // Datenpunkt mit der Liste der Raumnamen
const targetDpIds = ['0_userdata.0.Raumklima.Raum_1', '0_userdata.0.Raumklima.Raum_2', '0_userdata.0.Raumklima.Raum_3']; // Zieldatenpunkte
// Funktion zum Aufteilen und Aktualisieren der Zieldatenpunkte
function splitAndSetDataPoints(value) {
// Eckige Klammern entfernen und Raumnamen extrahieren
const roomNames = value.slice(1, -1).split(',').map(room => room.trim().replace(/"/g, ''));
let textBuffer = '';
let dpIndex = 0;
roomNames.forEach(room => {
if ((textBuffer + `"${room}"`).length <= 35) {
textBuffer += `"${room}"` + ' ';
} else {
setState(targetDpIds[dpIndex], textBuffer.trim(), true);
dpIndex++;
textBuffer = `"${room}"` + ' ';
}
if (dpIndex >= targetDpIds.length) {
return; // Maximal drei Datenpunkte erreicht
}
});
// Letzten Textpuffer aktualisieren
setState(targetDpIds[dpIndex], textBuffer.trim(), true);
// Leere Datenpunkte, wenn weniger als drei Räume vorhanden sind
for (let i = dpIndex + 1; i < targetDpIds.length; i++) {
setState(targetDpIds[i], '', true);
}
}
// Datenpunkt abonnieren, um Änderungen zu erkennen
on({ id: sourceDpId, change: 'ne', ack: false }, event => {
const newValue = event.state.val;
splitAndSetDataPoints(newValue);
});
// Initialen Zustand verarbeiten
const initialSourceValue = getState(sourceDpId).val;
splitAndSetDataPoints(initialSourceValue);
Das Script habe nicht ich geschrieben, sondern ich habe es über ChatGPT schreiben lassen. Ich habe keine Ahnung vom programmieren. Habe es aber schon lange im Einsatz.
Zu deinem Problem mit der automatischen Aktualisierung, kann ich dir nicht helfen. Hast du dir deine Quelldatenpunkte mal angesehen? Werden die denn regelmäßig aktualisiert?
@ofbeqnpolkkl6mby5e13
Deine Idee sieht sehr gut aus. Habe zum Testen ein kleines Blockly mit einer Funktion erstellt und darüber kann ich den Alias ändern. Das funktioniert schon mal. Jetzt werde ich morgen mal testen, ob das auch in der View den State des Widgets ändert, also ob mir angezeigt wird der DP an oder aus ist. Wenn das auch noch klappt, dann wäre das genial
Okay, noch mal den IoBroker beendet. Wieder mit GParted gestartet um die Swap zu löschen und dann zu erweitern und diesmal wird mir das angezeigt:
Ich habe keinen blassen Schimmer, warum die Swap nun am Ende liegt, aber so konnte ich jetzt die sda1 vergrößern.
Wenn ich nicht vorher einen Screenshot gemacht hätte, würde ich es nicht glauben. Finde das echt merkwürdig.
@xenon Das sieht schon besser aus. Die Messenger Einstellungen wurden richtig erkannt und ich kann die einzelnen Messenger auch konfigurieren.
Bei meinem Testalias Datenpunkt wurde die Konfiguration beibehalten und ich kann die Benachrichtigung auswählen.
Ich kann allerdings keine Testnachricht versenden. Habe Alexa und Telegram getestet. Oder geht das noch nicht?
Stimmt, vor einem Jahr wäre ich damit völlig überfordert gewesen, heute kann ich eure Vorschläge zu 90% nachvollziehen, bei den restlichen 10% muss ich eben nochmal nachfragen. wie mit dem Schedule.
Wo finde ich denn mal ein funktionierendes Beispiel? Oder wäre das sogar etwas für "Blockly for dummies"? Ich glaube da bin ich nicht der Einzige mit einem Verständnisproblem.
Andersherum muss ich sagen, dass das mit dem "Zeitplan aus Zeit-Zustand" eine einfache und funktionierende Lösung ist.
Moin, bevor ich das in mein Blockly einbaue, wollte ich es testen und selbst der einfache Test wirft Fehler raus. Ich habe 2 DP vom Typ Zahl. Aktuell steht bei Stunde eine 11 und bei Minute die 20. Diese beiden DP setze ich als Variable mit den Namen Stunde und Minute. Sobald ich diese Variablen dann beim Zeitplan einsetze, kommt die Fehlermeldung.
ich habe ein Blockly in dem auch Datenpunkte erstellt werden. Jede Nacht um 00:00:02 wird ein neuer DP mit JJJJ-MM-TT angelegt. Alles super und funktioniert.
Jetzt fahren wir in Urlaub und die DP müssten an die Uhrzeit des Landes angepasst werden, damit die darin gespeicherten JSON Daten die dortige Uhrzeit speichern. Alles kann Problem. Ich rechne die 6 Stunden zur aktuellen Zeit hinzu und setze dann die Variable neu mit dem neuen Wert von JJJJ-MM-TT. Auch das klappt alles.
Jetzt muss ich die bisherigen Zeitpläne ändern. Ich will dafür diesen Block nehmen:
und den mit der entsprechenden Variablen füllen.
Die eigentliche Frage: Wenn der Zeitplan geändert wird, greift das sofort, wenn dann also Mittags um 13 Uhr da "2 0 18 * * *" gesetzt wird, wird dann auch um 18:00:02 Uhr der Zeitplan gestartet? Oder muss ich das Blockly neu starten?
Habe einige Beiträge gelesen, aber dazu nichts gefunden.
ich bin umgestiegen auf OwnTracks und mit Blockly erstelle ich mit den Koordinaten ein JSON, welches dann in eine HTML Seite eingesetzt wird und als HTML Datei im System abgelegt wird. In der HTML sehe ich dann die Route und die Zeiten, wann ich wo war.
Mein "Problem" ist nun, das die DP von OwnTracks sehr oft geändert werden, zumindest wenn man schnell unterwegs ist.
Ich weiß, könnte ich in der App umstellen, aber das möchte ich nicht, da soll es so genau bleiben.
Wie kann ich in Blockly eine dynamische Prüfung einbauen, wenn in den letzten 10 Sekunden mehr als 20 Änderungen kamen, dann die Variable X auf 12 stellen, wenn nur 10 Änderungen dann X auf 7 stellen und wenn nur 1 oder 0 Änderungen, dann X auf 2, oder so ähnlich.
Geht das eventuell über TimeOut? Oder was gibt es da für Möglichkeiten. Im Netz habe ich nichts dazu gefunden...
Gibt es die Möglichkeit die Liste mit Räumen die gelüftet werden müssen, anders dar zu stellen ?`
Ich lasse es so in einem Inventwo Universal Widget anzeigen:
Dazu habe ich ein Script, welches den Datenpunkt "0_userdata.0.Raumklima.Lüften_Liste" aufteilt auf mehrere DP und die Länge kann man einstellen. Dazu habe ich 3 Datenpunkte angelegt: "0_userdata.0.Raumklima.Raum_1" bis "Raum_3" und die maximale verfügbare Zeichenzahl auf 35 gestellt. Das passt bei mir perfekt. Wenn ich die Zeichenlänge runtersetze auf 30, sieht es so aus:
Das ist das Scipt dazu:
//Liste_zu_Lueften_aufteilen_Komma
const sourceDpId = '0_userdata.0.Raumklima.Lüften_Liste'; // Datenpunkt mit der Liste der Raumnamen
const targetDpIds = ['0_userdata.0.Raumklima.Raum_1', '0_userdata.0.Raumklima.Raum_2', '0_userdata.0.Raumklima.Raum_3']; // Zieldatenpunkte
// Funktion zum Aufteilen und Aktualisieren der Zieldatenpunkte
function splitAndSetDataPoints(value) {
// Eckige Klammern entfernen und Raumnamen extrahieren
const roomNames = value.slice(1, -1).split(',').map(room => room.trim().replace(/"/g, ''));
let textBuffer = '';
let dpIndex = 0;
roomNames.forEach(room => {
if ((textBuffer + `"${room}"`).length <= 35) {
textBuffer += `"${room}"` + ' ';
} else {
setState(targetDpIds[dpIndex], textBuffer.trim(), true);
dpIndex++;
textBuffer = `"${room}"` + ' ';
}
if (dpIndex >= targetDpIds.length) {
return; // Maximal drei Datenpunkte erreicht
}
});
// Letzten Textpuffer aktualisieren
setState(targetDpIds[dpIndex], textBuffer.trim(), true);
// Leere Datenpunkte, wenn weniger als drei Räume vorhanden sind
for (let i = dpIndex + 1; i < targetDpIds.length; i++) {
setState(targetDpIds[i], '', true);
}
}
// Datenpunkt abonnieren, um Änderungen zu erkennen
on({ id: sourceDpId, change: 'ne', ack: false }, event => {
const newValue = event.state.val;
splitAndSetDataPoints(newValue);
});
// Initialen Zustand verarbeiten
const initialSourceValue = getState(sourceDpId).val;
splitAndSetDataPoints(initialSourceValue);
Das Script habe nicht ich geschrieben, sondern ich habe es über ChatGPT schreiben lassen. Ich habe keine Ahnung vom programmieren. Habe es aber schon lange im Einsatz.
Zu deinem Problem mit der automatischen Aktualisierung, kann ich dir nicht helfen. Hast du dir deine Quelldatenpunkte mal angesehen? Werden die denn regelmäßig aktualisiert?
Wie @Codierknecht schon geschrieben hat, den Call Monitor freigegeben und dann im Adapter die Namensauflösung aktiviert? Ich habe auch für IoBroker einen extra User auf der Fritte angelegt.