Weiter zum Inhalt

Skripten / Logik

16.6k Themen 214.3k Beiträge

Hilfe zu JavaScript, Blockly, TypeScript, Node-RED, Scenes und text2command

NEWS

Unterkategorien


  • Hilfe für Skripterstellung mit JavaScript

    3k 49k
    3k Themen
    49k Beiträge
    G
    Ich habe einen Akku für mein Bosch EBike mit 650 Wh. Es gibt die Empfehlung Akkus immer zwischen 20% und 80% Ladezustand zu halten um die Lebensdauer maximal zu halten. Den unteren Wert zu beachten ist relativ einfach, das wird am Kiox ständig angezeigt. Aber dann steckt man den Akku ans Ladegerät und müsste ständig vorbeischauen um nicht zuviel zu laden. Ich habe mir das jetzt automatisiert über eine MEROSS smarte Steckdose. Die zeigt die abgegebene Energie ja pro Tag an. Ich habe nun dazu ein Script und Eingriffsmöglichkeit über VIS. Das Script springt an, wenn ich das Ladegerät in den MEROSS Stecker stecke. Es setzt als Anfangswerte die Kapazität auf 650Watt, den IST-Ladezustand auf 20% und den Soll Ladezustand auf 70%. Das heißt umgerechnet, um den Soll-Ladezustand zu erreichen, müssen 325Wh geladen werden. Das wird über das Script erreicht, in dem es jede Minute die abgegebene Energie an der Steckdose prüft. Ich kann als einfach einstecken und laden, und muss nichts weiter machen, um nicht zu voll zu laden. Ob ich da von 10% auf 60% oder 30% auf 80% lade ist mir meist egal. Über VIS kann ich den IST-Ladezustand und den SOLL-Ladzustand des Akkus ändern. Das wird vom ersten Script berücksichtigt. So kann ich also auch gezielt gewünschte Werte erreichen. Das Ganze hatte ich selber schon mal zeitgesteuert gemacht. Das Ladegerät läuft (meist) mit einer Leistung von 175Watt. Daraus hatte ich mir dann errechnet wie lange ich brauche, den gewünschten Ladezustand zu erreichen. Das ist aber denkbar ungenau, weil die Ladekurve in Wirklichkeit nicht linear ist. Erst jetzt mit der MEROSS-Messung kann ich richtig zielen. Das neue Script habe ich mir komplett mit der KI "Claude" erstellen lassen. Da ist nicht eine Zeile von mir. Ich bin begeistert (und erschüttert). akku_ladesteuerung.ts
  • Hilfe für Skripterstellung mit Blockly

    7k 80k
    7k Themen
    80k Beiträge
    mickemupM
    Ich glaube du solltest ein bisschen präziser werden, um konkreten Support zu erhalten. Sobald du irgendwann im Leben mal eine Meldung hattest, willst du alle weiteren 5min verzögert? Was ist hier der Sinn? Oder willst du den "Fehlerzähler" z.B nach 24h wieder zurücksetzen, damit wieder ein "erster" Fehler kommt?
  • Hilfe für Skripterstellung mit Node-RED

    954 13k
    954 Themen
    13k Beiträge
    F
    Hallo ich habe ein Problem mit Nodered und Alexa Echo. Ich habe in Nodered die Wemo Emulation installiert und eine Wemo Steckdose emuliert um an einer Zigbeesteckdosenleiste einen Platz der Leiste zu schalten. "node-red-contrib-wemo-emulator" Das klappt auch wunderbar leider nicht länger als ein zwei Tage. Wenn ich dann den Echo der mit der emulierten Steckdose verbunden ist neu starte geht es wieder. Leider ist das sehr nervig. Hat schon mal jemand gehabt? Durch die Forumssuche habe ich leider nicht gefunden. Gruss Achim
  • Instanz neu starten wenn verbindung nicht mehr steht

    blockly
    2
    1
    0 Stimmen
    2 Beiträge
    471 Aufrufe
    T
    Hallo, ich würde das so lösen: [image: 1581802350887-bildschirmfoto-2020-02-15-um-22.31.50.png] Objekt ID ist der Datenpunkt der bei einer Aktualisierung gesetzt wird und startet einen Timeout der nach einer definierten Zeitspanne deine Aktion ausführt. Bei einer erneuten Akutalisierung wird der Timeout neugestartet.
  • Stromverbrauch in Fr. ausrechnen (Hoch und Niede

    blockly monitoring
    4
    2
    0 Stimmen
    4 Beiträge
    635 Aufrufe
    paul53P
    @Massimo sagte: Müsste er dann diese 2 verschiedene Tariffe in unterschiedlichen Datenpunkte schreiben? Es sind zwei Datenpunkte mit den beiden Tarifen (Fr/kWh) erforderlich. Bei zwei Tarifen muss auch ein Gesamtkostenstand (analog zum Zählerstand) mitgeführt werden, da eine einfache Multiplikation mit der Zählerdifferenz nicht ausreicht. Vorschlag: [image: 1581793294111-blockly_temp.jpg]
  • Brauche Hilfe bei Systeminfo-Adapter

    javascript
    1
    1
    0 Stimmen
    1 Beiträge
    195 Aufrufe
    Niemand hat geantwortet
  • umstieg von pimatic

    blockly
    6
    0 Stimmen
    6 Beiträge
    531 Aufrufe
    M
    ganz optimal funktioniert es noch nicht. die stunde aktiv klappt nicht. woran kann das liegen? [image: 1581771831566-bildschirmfoto-2020-02-15-um-13.59.04-resized.png]
  • Blockly Zeitplan error

    javascript blockly
    45
    2
    0 Stimmen
    45 Beiträge
    2k Aufrufe
    dslraserD
    @xxx_turbo_xxx ich meinte es genau da in den Objekten, wenn Du da bei dem aktuellen Zählerstand mal von Hand was einträgst sollte schon was gerechnet werden. (das passiert ja sonst nur 1 x im Monat, nur mal schon vorher zum testen / probieren)
  • Update Js Controler

    javascript
    3
    0 Stimmen
    3 Beiträge
    302 Aufrufe
    crunchipC
    @albbino [image: 1581671977233-beca7ff8-555b-4421-af39-6600a76e8c5b-image.png]
  • Funk-Master-Slave-Steckdose umsetzen

    multimedia communication
    3
    0 Stimmen
    3 Beiträge
    759 Aufrufe
    D
    Vielen Dank für die Antwort. Leider hat direkt am nächsten Tag mein NAS defekt angemeldet, so dass ich hier nicht mehr mitlesen konnte... Ich habe es jetzt über PING und folgendes Blockly gelöst: [image: 1581632940910-3aef070a-7a35-4585-9d21-48119c181ca9-grafik-resized.png] Der rechte Teil ist nicht direkt notwendig, aber aus folgenden Gründen vorhanden: Der obere Teil reduziert die Verzögerung beim Einschalten Der untere Teil (Workaround) fordert die Uhrzeit vom Sensor durch Überschreiben des Wertes mit "" erneut an. In ein paar fällen hatte sich die RTC noch nicht aktualisiert und den 01.01.1970 als Wert genannt. Anmerkung: Den Trigger-Parameter "was updated" habe ich noch auf "was changed" geändert, damit nicht so viele Aktionen gefeuert werden.
  • AbstraktionsSchicht

    javascript
    13
    0 Stimmen
    13 Beiträge
    522 Aufrufe
    A
    Vielleicht noch ein möglicher Ansatz zur Steuerung: Ich finde MQTT als Kommunikationsprotokoll genial. Ich habe mir in ioBroker einen eigenen Tree für Wohnung/Stockwerke/Zimmer/Gewerke gebaut und die States mit der Visualisierung verbunden. Über MQTT sind diese Datenpunkte dann mit anderen Devices (entweder innerhalb von ioBroker oder externe Systeme) synchronisiert. Das ist auch eine Abstraktionsschicht, die ich mir gebaut habe, damit ich z.B. Hue-Bewegungsmelder, HomeMatic-Bewegungsmelder oder selbstgebaute über eine einheitliche Schnittstelle ansprechen kann. Möglicherweise ist da für dich auch ein passender Impuls dabei...
  • Doppelte Ansagen über SayIT bei einfachem Blockly

    Verschoben
    8
    2
    0 Stimmen
    8 Beiträge
    896 Aufrufe
    M
    Hi, trotz des älteren Themas mein Senf dazu. Hatte vor kurzem auch das Problem. Meine Lösung war beim Trigger das "anerkannt ist" auf Update zu setzen und dadurch waren die doppelten Ansagen weg. Kann Zufall sein aber bei mir hat's was gebracht.
  • Status Änderungen Debuggen / Nachvollziehen

    blockly
    4
    0 Stimmen
    4 Beiträge
    379 Aufrufe
    paul53P
    @btiegel sagte in Status Änderungen Debuggen / Nachvollziehen: Komme ich auf der Ebene auch an das auslösende Skript? Nein, es sollten nur ein bis zwei Scripte infrage kommen, in denen der Datenpunkt mit steuere (Bestätigt: false) bzw. aktualisiere(Bestätigt: true) aktualisiert wird.
  • Ansage Fenster geöffnet

    blockly
    12
    1
    0 Stimmen
    12 Beiträge
    1k Aufrufe
    C
    @panik Ne, welches Fenster offen ist steht ja dann in der neuen Variable FensterText, nur das du so auf eben diese Variable prüfen kannst ob mindestens ein Fenster geöffnet ist. Ich mache mal heute Abend -ich hoffe ich denke dran :P - ein Beispiel
  • [Gelöst] Math-Kanäle erstellen und in InfluxDB speichern

    monitoring javascript blockly
    1
    0 Stimmen
    1 Beiträge
    147 Aufrufe
    Niemand hat geantwortet
  • [gelöst] Script "Zählen von Fenstern" zeigt keine offenen Fenster an

    Verschoben
    132
    3
    0 Stimmen
    132 Beiträge
    21k Aufrufe
    NegaleinN
    @e-i-k-e sagte in [gelöst] Script "Zählen von Fenstern" zeigt keine offenen Fenster an: Keiner eine Idee dazu? ich hab das in Verwendung. Fenster zählen /* Status Zahl Fenster Homematic var cacheSelectorLevel = $('channel[state.id=*.STATE](functions="Fenster")'); Mi var cacheSelectorState = $('state[id=*.state](functions="Fenster")'); {1} */ var logging = true; var idAnzahlEin = 'javascript.0.Status.Fenster.Anzahl_auf', idAnzahl = 'javascript.0.Status.Fenster.Anzahl', idText = 'javascript.0.Status.Fenster.Text', idRaum = 'javascript.0.Status.Fenster.Raum', // <---- NEU idAnsage = 'javascript.0.Status.Fenster.Ansage'; // Ab hier nix mehr ändern createState(idAnzahl, { // wenn benötigt: Anzahl der vorhandenen Lichter type: 'number', name: 'Anzahl aller Fenster', min: 0, def: 0, role: 'value' }); createState(idAnzahlEin, { // Anzahl der Fenster, die auf sind als Variable unter Javascript.0 anlegen type: 'number', name: 'Anzahl der offenen Fenster', min: 0, def: 0, role: 'value' }); createState(idText, { // Anzahl der brennenden Lichter und deren Namen als Variable unter Javascript.0 anlegen type: 'string', name: 'Offene Fenster', desc: 'Namen der offenen Fenster', def: ' ', role: 'value' }); createState(idAnsage, { type: 'string', name: 'Offene Fenster (Ansage)', desc: 'Namen der offenen Fenster (für Ansage aufbereitet)', def: ' ', role: 'value' }); createState(idRaum, { // Räume, in denen Lichter brennen // <---- NEU type: 'string', name: 'Räume mit offenen Fenster', desc: 'Namen der Räume, in denen Fenster offen sind', def: ' ', role: 'value' }); //var cacheSelectorState = $('channel[state.id=*.STATE](functions="Licht")'); // Gewerk Licht var cacheSelectorLevel = $('channel[state.id=*.LEVEL](functions="XXX")'); //var cacheSelectorHue = $('state[id=*.on](functions=Licht)'); var cacheSelectorState2 = $('channel[state.id=*.STATE](functions="Fenster")'); //Homematic var cacheSelectorState = $('state[id=*.state](functions="Fenster")'); //Mi function checkDevices(obj) { // Setzt die Zähler vor dem Durchlauf aller Elemente *.STATE im Gewerk Licht auf 0 var anzahlLichterAn = 0; var anzahlLichter = 0; var textLichterAn = []; var textRaum = []; if (logging) { log('++++++ Fenster Anzahl ++++ '); log('#### Mi ##### '); } cacheSelectorState.each(function(id, i) { // Schleife für jedes gefundenen Element *.state im Gewerk Fenster var status = getState(id).val; // Zustand *.state abfragen (jedes Element) var deviceId = id.substring(0, id.lastIndexOf(".")); var devicename = getObject(deviceId).common.name; var raumname = getObject(id, "rooms").enumNames[0]; if (logging) { log('---Mi----'); log('Raum: ' + JSON.stringify(raumname)); log('Status: ' + status); } if (status) { // wenn Zustand = true, dann wird die Anzahl der Fenster hochgezählt ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname); // <---- NEU } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status }); cacheSelectorState2.each(function(id, i) { // Schleife für jedes gefundenen Element *.ON im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.STATE abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".STATE")); //.state aus Text entfernen var raumname = getObject(id, "rooms"); // <---- NEU // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) // if ( (devicename.search(/(CUX)|(K2)|(K3)|(VK)|(:)/ig) == -1) ) { if (logging) { log('---Homematic----'); log('Kanal: ' + name); log('Status: ' + status); } if (status) { // wenn Zustand = true, dann wird die Anzahl der Lichter hochgezählt ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); // <---- NEU } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status // } // ENDE VK-Abfrage }); if (logging) log('#### DIMMER ##### '); cacheSelectorLevel.each(function(id, i) { // Schleife für jedes gefundenen Element *.LEVEL im Gewerk Licht var obj = getObject(id); var name = getObject(id).common.name; var status = getState(id).val; // Zustand *.LEVEL abfragen (jedes Element) var devicename = name.substring(0, name.indexOf(".LEVEL")); //.state aus Text entfernen var raumname = getObject(id, "rooms"); // <---- NEU // ########## Abfrage ob Virtueller Kanal? VK oder : im Namen) // if ( (devicename.search(/(CUX)|(K2)|(K3)|(V10)|(VK)|(:)/ig) == -1) ) { // Geräte mit diesen Strings im namen nicht beachten if (logging) { log('-------'); log('Kanal: ' + name); log('Status: ' + status + '%'); } if (parseFloat(status) > 0) { // Wenn Dimmwert über 0 ++anzahlLichterAn; textLichterAn.push(devicename); // Zu Array hinzufügen textRaum.push(raumname.enumNames); // <---- NEU } ++anzahlLichter; // Zählt die Anzahl der vorhandenen Lichter unabhängig vom Status // } // Ende Abfrage VK }); // Array mit Lichternamen sortieren textLichterAn.sort(); textRaum.sort(); // <---- NEU // Schleife ist durchlaufen. Im Log wird der aktuelle Status (Anzahl, davon an) ausgegeben if (logging) log("Text: " + textLichterAn); if (logging) log("Anzahl Fenster: " + anzahlLichter + " # davon Fenster offen: " + anzahlLichterAn); // die ermittelten Werte werden als javascript.0. Variable in ioBroker gespeichert (z.B. für die Verarbeitung in VIS) setState(idText, textLichterAn.join(', ')); // Schreibt die aktuelle Namen der eingeschalteten Lichter setState(idAnzahlEin, textLichterAn.length); // Schreibt die aktuelle Anzahl der eingeschalteten Lichter setState(idAnzahl, anzahlLichter); // Schreibt die aktuelle Anzahl der vorhandene Elemente im Gewerk Licht // setState(idRaum, textRaum.join(',<br>')); // Räume, in denen Licht brennt // <---- NEU setState(idRaum, textRaum.join(', ')); // Räume, in denen Licht brennt // <---- NEU } // Trigger cacheSelectorState.on(function(obj) { // bei Zustandänderung *.STATE im Gewerk Licht if (logging) log('Auslösender Schalter: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); cacheSelectorState2.on(function(obj) { // bei Zustandänderung *.ON von HUE Lampen im Gewerk Licht if (logging) log('Auslösende Homematic: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); cacheSelectorLevel.on(function(obj) { // bei Zustandänderung *.LEVEL im Gewerk Licht if (logging) log('Auslösender Dimmer: ' + obj.id + ': ' + obj.state.val); // Info im Log, welcher Zustand sich geändert hat checkDevices(); }); function main() { setTimeout(function() { if (logging) log('Auslöser Skriptstart'); checkDevices(); }, 2000); } main(); // Skriptstart-Auslöser // Aufbereitung für Ansage function strip_tags(data) { var rueckgabe = data.replace(/(&nbsp;|<([^>]+)>)/ig, " "); return (rueckgabe); } on(idText, function(obj) { var text = obj.state.val; text = (getState(idAnzahl).val > 0) ? 'Fenster offen: ' + strip_tags(text) : 'Alle Fenster geschlossen'; setState(idAnsage, text); }); oder hier in Blockly (Fenster, Licht, usw.)
  • Kleine Alarmanlage

    blockly
    8
    1
    0 Stimmen
    8 Beiträge
    887 Aufrufe
    CinimodC
    Dann trigger doch die tür/fensterkontakte, oder was du sonst so als melder benutzen willst und schalte über vis oder yahka dein javascript (alarm) ein und aus [image: 1581272608126-bildschirmfoto-2020-02-09-um-19.19.21.png] mit nem zweiten script kannst dir ja auch über die Anwesenheit, dieses script ein oder ausschalten
  • scenes adapter handling

    scenes
    9
    0 Stimmen
    9 Beiträge
    516 Aufrufe
    jpgorganizerJ
    @Homoran said in scenes adapter handling: Dann kannst du direkt ein Issue anlegen mit feature request - Stop scene done https://github.com/ioBroker/ioBroker.scenes/issues/42
  • SQL Adapter flutet Log

    monitoring
    13
    0 Stimmen
    13 Beiträge
    799 Aufrufe
    C
    Hallo zusammen, Hatte das selbe Problem nach Update der node Version (8 auf 10). Mir hat diese Anleitung geholfen: https://forum.iobroker.net/topic/22867/how-to-node-js-für-iobroker-richtig-updaten Gruß Charly
  • Hilfe parser auslesen Wind aus .txt

    monitoring
    12
    0 Stimmen
    12 Beiträge
    671 Aufrufe
    HomoranH
    @ChrisXY ist aber kein Hexenwerk. du musst nur die Klammern verschieben, je nachdem welchen Teil des Timestamps du haben willst: last24h_wind0_speedmax_time\s+\d\d\d\d\d\d\d\d\d\d\d\d(\d\d) Hier Sekunden
  • [Gelöst]Automatisch zum Standardview nach 2 Minuten

    javascript
    5
    0 Stimmen
    5 Beiträge
    724 Aufrufe
    T
    @Feuersturm Dann dürftest du die richtigen Stichwörter verwendet haben! Trotzdem danke für die Mühe. LG Thomas
  • [Gelöst] Fensterkontakt + Thermostat: Wie Verzögerung einbauen

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    1k Aufrufe
    C
    Hi, leider nur Javascript. Die Funktion Timeout ist aber schön zu erkennen: Hier wird 60 Sekunden bei Fenster auf gewartet und erneut geprüft. Ich kann also in Ruhe ein Bier vom Balkon holen... //Wohnzimmer: on({id: 'javascript.0.Smarthome.fenster_wohnzimmer', change: 'any'}, function (obj) { if (obj.state.val===true) { setTimeout(function(){ if (obj.state.val===true) { setState('fritzdect.0.Comet_119610277592.mode',1); } }, 60000); } else setState('fritzdect.0.Comet_119610277592.mode',0); }); Und falls du Fenster zusammenfassen möchtest (Wohnzimmer hat bei mir 2 Fenster + Balkontür: //Das Script fasst die Wohnzimmer Fenster zusammen const idSammel = 'javascript.0.Smarthome.fenster_wohnzimmer'; const id1 = 'javascript.0.Smarthome.Fenster.Fenster_1'; // ID von 1\. Meldung const id2 = 'javascript.0.Smarthome.Fenster.Fenster_2'; const id3 = 'javascript.0.Smarthome.Fenster.Fenster_3'; const ids = [id1, id2, id3]; var vals = [getState(id1).val, getState(id2).val, getState(id3).val]; function sammel() { if(vals[0] || vals[1] || vals[2] ) setState(idSammel, true, true); else setState(idSammel, false, true); } on(ids, function(dp) { var pos = ids.indexOf(dp.id); if(pos != -1) { vals[pos] = dp.state.val; sammel(); } else log('Trigger-ID nicht im Array !', 'warn'); });
  • (gelöst) Sonos Lautstärke über Alexa "softer" steuern

    blockly javascript
    8
    0 Stimmen
    8 Beiträge
    3k Aufrufe
    padrinoP
    Hi, "etwas lauter" sollte auch klappen. ;) Ich denke, es wäre am Besten, wenn man dann die Lautstärke komplett selbst steuert, sprich die Finger ganz von nur "lauter" und "leiser" lässt.. Diese kann man dann ja z.B. durch (obige) "mach..." ersetzen. Eigentlich sind "lauter" und "leiser" ja +/-10% ("+" und "-" am Gerät ergeben +/- 0, 3, 7 - was inzwischen auch die kleinstmöglichen Schritte fürs Einstellen über "volume" sind).. "Pfuscht" man aber darin herum, kommt Alexa etwas aus dem Tritt Wie z.B. Volume = 23% lauter -> 30% Volume = 27% lauter -> 40% Denke, ich werde mein Skript demnächst dahingehend auch mal überarbeiten...

422

Online

32.8k

Benutzer

82.7k

Themen

1.3m

Beiträge