Skip to content

JavaScript

Hilfe für Skripterstellung mit JavaScript

2.5k Themen 49.1k Beiträge

NEWS

  • enum.functions. nicht über ID einfügen in JS möglich?

    Verschoben javascript
    2
    1
    0 Stimmen
    2 Beiträge
    416 Aufrufe
    paul53P
    @Fuga sagte in enum.functions. nicht über ID einfügen in JS möglich?: enum.functions.windowstatus nicht über ID einfügen in das Script bekomme. Man kann nur die ID eines Datenpunktes einfügen. @Fuga sagte in enum.functions. nicht über ID einfügen in JS möglich?: Aus dem LOG kommt nur: Eine Funktion muss auch aufgerufen werden, damit sie abgearbeitet wird. setState() muss auch einen Wert (Text) enthalten: setState("Datenpunkte.0.StatusDoorOpenText", openDoorText);
  • JavaScript restart, Telegram Output wird überflutet

    Verschoben Gelöst javascript
    12
    0 Stimmen
    12 Beiträge
    2k Aufrufe
    F
    Hey, hab das selbe Problem, das mich Telegram mit Meldungen überflutet :-( Bin dadurch auf diesen Tread gestoßen und hab versucht meine Scripte damit anzupassen, leider ohne Erfolgt. Ich habe die Scripte wie folgt angepasst (Beispiel): createState("Hue Lampen", function () { }); on({id: "javascript.0.Hue Lampen", change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; sendTo('telegram.0', { text: 'Bitte Hue Lampe wählen', reply_markup: { keyboard: [ ['Hue Küche An', 'Hue Küche Aus'], ['Hue Esszimmer An', 'Hue Esszimmer Aus'], ['Hue Wohnzimmer An', 'Hue Wohnzimmer Aus'], ['Hue Haustür An', 'Hue Haustür Aus'], ['Hue Erker An', 'Hue Erker Aus'], ['Stehlampe An', 'Stehlampe Aus'], ['Übersicht', ''], ], resize_keyboard: true, one_time_keyboard: false } }); }); Leider wird nur einmal Hue Lampen vom Telegram akzeptiert und komme ins Menü, danach komme ich nicht mehr in das Sub-Menü, sobald ich auf Übersicht wieder gewechselt bin. Kann es sein, dass ich in text2command etwas anderes einstellen muss damit der State von Hue Lampe bei jedem drücken auf den Button wechselt? Hab aktuell als Objekt-ID den erzeugten State von Hue Lampe mit "Schreibe Text in Zustand" ausgewählt. Vorher hatte ich das Javascript von der Lampe drin mit "Schalte irgendwas ein oder aus". Vielleicht kann mir jemand sagen was ich noch ändern muss ausser dem Script. Danke schonmal im Voraus Grüße Freaknet
  • Probleme mit der Statusabfrage eines Datenpunktes

    Verschoben javascript
    7
    0 Stimmen
    7 Beiträge
    449 Aufrufe
    AlCalzoneA
    Ich würde behaupten das ist working as intended. Das Verhalten von 3.x ist wohl eher unerwartet und funktioniert zufällig so. Aus der Doku: $('*.STATE') - select all states where id ends with ".STATE". Analog dazu findet $('adapter.0.*') alle States, die mit "adapter.0." beginnen. Was aktuell nicht vorgesehen ist, ist beides, d.h. $('*adapter.0*') (würde states matchen, die in der Mitte adapter.0 haben). Dafür könnte man durchaus ein Issue erstellen.
  • Gas & Wasserverbrauch mit Volkszähler und vzLogger

    Verschoben javascript
    1
    0 Stimmen
    1 Beiträge
    688 Aufrufe
    Niemand hat geantwortet
  • Array vielleicht?

    Verschoben Ungelöst javascript
    8
    0 Stimmen
    8 Beiträge
    579 Aufrufe
    BluefoxB
    @Lenny-CB @AlCalzone hat schon den richtigen code gepostet: var body = '{"testJSON":{"state":{"noonTime":[1,50],"eveningTime":[2,45],"tomorrowTime":[12,30]}}}'; var obj = JSON.parse(body); const padding = num => num > 9 ? num : '0' + num; Object.keys(obj).forEach(attr => { const state = obj[attr].state; Object.keys(state).forEach(name => console.log(`${name} - ${padding(state[name][0])}:${padding(state[name][1])}`)); }); außer, dass sehr ineffektiv Du liest 6 mal Object.keys(obj) und davon 5 mal im Zyklus.
  • Zwei verschachtelte function On()

    Verschoben javascript
    3
    0 Stimmen
    3 Beiträge
    464 Aufrufe
    AlCalzoneA
    @CBeck Nur mit on()... funktioniert das nicht. Du kannst die Trigger nutzen, um einen Status festzulegen: Frau daheim: ja/nein Schon begrüßt: ja/nein Etwas Pseudo-Code: Beim Betreten der Wohnung (on-Trigger): Frau daheim => ja schon begrüßt => nein Beim Betreten des Wohnzimmers (on-Trigger): Wenn (Frau daheim) und (noch nicht begrüßt): Begrüßen Schon begrüßt => ja Beim Verlassen der Wohnung (on-Trigger): Frau da => nein
  • IoBroker mit HA Bridge synchronsieren

    Verschoben javascript ha-bridge
    6
    0 Stimmen
    6 Beiträge
    4k Aufrufe
    sissiwupS
    @davincino: Hallo, @Sissi: Wie nutze ich überhaupt dein Skript? Ich hatte es so verstanden, dass wenn ich es innerhalb von ioBroker ausführe, dann sollte ich meine Devices in HA-Bridge sehen? Du hast unten viele auskommentierte devices, muss ich in diesem Bereich händisch meine devices anlegen? Wenn ja, muss ich dieselben dann in der HA-Bridge auch anlegen? Von wo rufe ich die function "callme" auf? ` Hallo, ich möchte nicht alle devices in die Bridge übernehmen, deshalb kommentiert du unten nur das aus, was du haben möchtest. Das A und O sind die richtigen Selektoren. Bei mir ist der Name eine Rollos immer RL-…, man kann aber auch natürlich die Grupper der Rollos oder nur spezielle Namen auswählen. //var states = $('broadlink2.0.*.L.*').each(function(id,i) { callme(id,i,false,"true","false",""); }); => hier werden z.B. die im Unterverzeichnis L (gelernten) Geräte vom Broadlink übernommen. //var states = $('broadlink2.0.States.*').each(function(id,i) { callme(id,i,false,"true","false",""); }); => hier die States //var states = $('broadlink2.0.Scenes.*').each(function(id,i) { callme(id,i,false,"true","false",""); }); => hier die Scenen //var states = $('scene.0.*').each(function(id,i) { callme(id,i,false,"true","false",""); }); => hier wird der Scenen-Adapter von ioBroker bemüht. Alle Scenen werden importiert. //var states = $('hm-rpc.0.*.SET*').each(function(id,i) { callme(id,i,true,"true","false",""); }); => hier werden alle Geräte von Homematic die einen Parameter SET… unterstützen übernommen var states = $('hm-rpc.0.*.1.LEVEL').each(function(id,i) { callme(id,i,true,"100","0","${intensity.percent}"); }); => hier werden alle Rollos (Erkennbar an LEVEL) übernommen. Hier wird 100 als Offen, 0 als Zu und Zwischenwerte möglich gesetzt. //var states = $('hm-rpc.0.LEQ1023360.1.LEVEL').each(function(id,i) { callme(id,i,true,"100","0","${intensity.percent}"); }); => hier wird nur ein spezielles Rollo hinzugefügt. Mit //delDevices(25,200,habridgeURL); //getDevice(25,habridgeURL); kannst du entweder alle Devices löschen (von Nummer 25 bis 200 hier) oder lesen
  • Und Oder Verknüpfung

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    818 Aufrufe
    BluefoxB
    Falls du auf zwei Inputs (sensoren) reagieren musst, dann ist das ein bisschen komplizierter: var idSensor1 = "hm-rpc.0.BLA1.1.STATE"; var idSensor2 = "hm-rpc.0.BLA2.1.STATE"; function checkStates() { // UND Verknüpfung if (getState(idSensor1).val && getState(idSensor2).val) { // Irgendwas ausführen } } on(idSensor1, checkStates); on(idSensor2, checkStates);
  • [gelöst] SetState - liefert im Log den "alten" Wert

    Verschoben
    6
    1
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    S
    Erledigt - habe gerade von der Ferne drauf geschaut - ohne Änderung zu gestern NM - werden die Werte nun übernommen - warum kann ich leider nicht sagen …
  • ODER Verknüpfung bei on

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    2k Aufrufe
    P
    Hallo, @SchuetzeSchulz: ch möchte zwei Fenstersensoren im Script abfragen, sobald einer von beiden auf "offen" steht, soll eine Variable auf True gesetzt werden. Nur wenn beide Fenstersensoren auf "geschlossen" stehen, soll die Variable wieder auf False gesetzt werden. ` hatten wir schon mal, bzw. habe ich auch mal gefragt: http://forum.iobroker.net/viewtopic.php?f=21&t=535 Gruß Pix
  • [Skriptbeispiel] python Aufruf modbus-poll

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    4k Aufrufe
    Y
    Dank @starfish haben wir nun eine Möglichkeit modbus Daten zu pollen. Das ist uU ganz hilfreich (zumindest bis ein Modbus-Adapter fertig ist). Ich habe für meine Zwecke das Python-Script angepasst, da ich serielle Geräte am Bus habe. Zudem wollte ich mehrere Werte abfragen. Hier das Python-Script 'pymodhaus.py' (liegt bei mir in /home/pi/modbus-crawler): #!/usr/bin/env python import sys, time, json from pymodbus.constants import Endian from pymodbus.payload import BinaryPayloadDecoder from pymodbus.client.sync import ModbusSerialClient as ModbusClient from pymodbus.transaction import ModbusRtuFramer def decode32(decval): decoder = BinaryPayloadDecoder.fromRegisters(decval.registers, endian=Endian.Big) return decoder.decode_32bit_float() def decode64(decval): decoder = BinaryPayloadDecoder.fromRegisters(decval.registers, endian=Endian.Big) return decoder.decode_64bit_int() client = ModbusClient(method='rtu', port='/dev/ttyUSB0', stopbits=1, bytesize=8, timeout=0.05, baudrate=19200, parity='N') connection = client.connect() #print "Connection: ", connection * Only for debug try: timestamp = str(time.time()).split('.')[0] # iEM3155 Haus --> Adresse immer 1 kleiner als im Schneider Datenblatt; weiss der Geier warum # HausL01 = decode32(client.read_holding_registers(3028-1, 2, unit=10)) # HausL02 = decode32(client.read_holding_registers(3030-1, 2, unit=10)) # HausL03 = decode32(client.read_holding_registers(3032-1, 2, unit=10)) HausLNM = decode32(client.read_holding_registers(3036-1, 2, unit=10)) HausP01 = decode32(client.read_holding_registers(3054-1, 2, unit=10)) * 1000 HausP02 = decode32(client.read_holding_registers(3056-1, 2, unit=10)) * 1000 HausP03 = decode32(client.read_holding_registers(3058-1, 2, unit=10)) * 1000 HausPower = decode32(client.read_holding_registers(3060-1, 2, unit=10)) * 1000 # HausPowerB = decode32(client.read_holding_registers(3068-1, 2, unit=10)) * 1000 # HausPowerS = decode32(client.read_holding_registers(3076-1, 2, unit=10)) * 1000 HausImport = decode64(client.read_holding_registers(3204-1, 4, unit=10)) / 1000 HausExport = decode64(client.read_holding_registers(3208-1, 4, unit=10)) / 1000 except: print 6 else: json_string = json.dumps({'ts': timestamp, 'HausLNM': round(HausLNM,2), 'HausP01': round(HausP01,0), 'HausP02': round(HausP02,0), 'HausP03': round(HausP03,0), 'HausPower': round(HausPower,0),'HausImport': HausImport, 'HausExport': HausExport}) print json_string client.close() Nun zum iobroker.javascript: // Create Datenpunkte für PV-Anlage createState('javascript.1.Solar.pi1Result', ''); createState('javascript.1.Solar.modPoll', 1); // Create Datenpunkte für Schneider EnergyMeter 'Haus' createState('javascript.1.Solar.Schneider.HausLNM', 0); createState('javascript.1.Solar.Schneider.HausP01', 0); createState('javascript.1.Solar.Schneider.HausP02', 0); createState('javascript.1.Solar.Schneider.HausP03', 0); createState('javascript.1.Solar.Schneider.HausPower', 0); createState('javascript.1.Solar.Schneider.HausImport', 0); createState('javascript.1.Solar.Schneider.HausExport', 0); createState('javascript.1.Solar.Schneider.HausTimeStamp', 0); schedule({astro: "sunrise"}, function () { setState('javascript.1.Solar.modPoll', 1, true); }); schedule({astro: "sunset"}, function () { setState('javascript.1.Solar.modPoll', 0, true); }); //Schedule Script Run Haus schedule("*/1 * * * *", function (Haus) { var enabled = getState("javascript.1.Solar.modPoll"/*javascript.1.Solar.modPoll*/).val; if (enabled == 1) { var python = require('child_process').spawn('python', ["/home/pi/modbus-crawler/pymodhaus.py"]); // second argument is array of parameters, e.g.: var result = ''; python.stdout.on('data', function(data){ result += data.toString(); }); python.on('close', function(code1){ if (code1 !== 0) { log('Error: ' + code1, 'error'); } else { if (result == 6) { log('Error: Fehler im Modbus Python Script -Haus-', 'warn'); } else { log('Modbus Python Script -Haus- erfolgreich gelaufen, Werte akzeptiert'); setState('javascript.1.Solar.pi1Result', result); var solar1 = JSON.parse(result); setState('javascript.1.Solar.Schneider.HausLNM', solar1.HausLNM, true); setState('javascript.1.Solar.Schneider.HausP01', solar1.HausP01, true); setState('javascript.1.Solar.Schneider.HausP02', solar1.HausP02, true); setState('javascript.1.Solar.Schneider.HausP03', solar1.HausP03, true); setState('javascript.1.Solar.Schneider.HausPower', solar1.HausPower, true); setState('javascript.1.Solar.Schneider.HausImport', solar1.HausImport, true); setState('javascript.1.Solar.Schneider.HausExport', solar1.HausExport, true); setState('javascript.1.Solar.Schneider.HausTimeStamp', solar1.ts, true); } } }); } }); Etwas komplexer hat sich dann der Umstand erwiesen, dass ich das Script (mangels tcp) lokal am Solar-PI laufen lassen muss. Daher musste ein iobroker als remote-host auf den PI. Aber dass ist ein ganz anderes Thema. Version 0.1.0 2015-06-22 First release
  • ReadFile klappt nicht (Windows)

    Verschoben
    13
    0 Stimmen
    13 Beiträge
    3k Aufrufe
    BluefoxB
    > Wenn es das Objekt gibt und es eine Länge hat, dann… richtig
  • Ansage bei Tür offen länger als 2 Minuten

    Verschoben
    6
    0 Stimmen
    6 Beiträge
    3k Aufrufe
    P
    @tesso: Das Gerät habe ich angelegt. Mit Test geht es erst Morgen weiter. @pix Kannst du mir evtl. noch die Funktionen meldung_sayit und meldung_push zur Verfügung stellen? Ich bin bei Javascript leider blutiger Anfänger. Bisher dachte ich, das brauch ich nicht lernen. Nun kommt iobroker und ich brauche es doch. ` Das ist eigentlich nur: setState(idSayitHome24MP, ansage); ````und```` sendTo("pushover", { message: text, title: titel, priority: prio }); Das ist in eine Funktion gepackt, weil ich zusätzlich noch Variablen abfrage, ob das ganze angesagt/gepusht werden soll oder nicht (daher Optin). Bluefox' Lösung ist natürlich auch fein. Ich mag CUxD als Lösung für CCU-geräte, weil es so zuverlässig arbeit. Der Wrapper läuft auch über einen CCU-Neustart hinaus. Die Daten über die offenstehende Tür kommen von der CCU, warum also nicht noch die angereicherten Daten des CUxD mitnehmen. Wenn du allerdings mal andere Systeme anbindest (KNX, Homepilot, etc..), dann wirst du wieder die reine JavaScript Variante brauchen. Gruß Pix
  • Lampe mit bewegungsmelder und helligkeit schalten

    Verschoben
    10
    0 Stimmen
    10 Beiträge
    3k Aufrufe
    B
    hallo pix, vielen lieben dank es funktioniert
  • [Scriptbeispiel] Alle Rollladen zeitverzögert per Taste/vis

    Verschoben
    3
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    Y
    Cool; ( Immerhin hatte meins auch funktioniert… )
  • [Scriptbeispiel] Rollladen manuell über VIS-Widget fahren

    Verschoben
    1
    0 Stimmen
    1 Beiträge
    2k Aufrufe
    Niemand hat geantwortet
  • [Scriptbeispiel] Feiertage NRW

    Verschoben
    3
    1
    0 Stimmen
    3 Beiträge
    2k Aufrufe
    HomoranH
    Danke pix, ist schon auf der Website. Aber gab es da nicht ein Skript, dass die Feiertage immerwährend nach http://de.wikipedia.org/wiki/Gau%C3%9Fsche_Osterformel berechnete. und das alles auch für alle Bundesländer? EDIT: ich glaube ich hab da was gefunden: http://homematic-forum.de/forum/viewtop … =31&t=4058 und wie es sich für Feiertage gehört heisst der Urheber Petrus :mrgreen: Gruß Rainer
  • [Scriptbeispiel] Rollladen zeitverzögert fahren

    Verschoben
    2
    0 Stimmen
    2 Beiträge
    1k Aufrufe
    HomoranH
    @htrecksler: @Rainer - Bitte ggf. auf Webseite verlinken ` Erledigt: http://www.iobroker.net/docu/?page_id=57&lang=de Danke für das Skript! Wenn ich mir als js-legastheniker das Script ansehe, denke ich mir: Das script fährt die Rolläden bei Sonnenuntergang in die angegeben Positionen natürlich müssen die Seriennummern der Aktoren angepasst werden. ist die funktion astro-sunset global definiert? die 2000, jeweils am Zeilenende, werden die Millisekunden für den Zeitversatz sein. da ich jetzt wirklich keine Ahnung habe weiss ich nicht, wie ein weiterer Rollladen eingefügt werden muss. Jetzt möchte ich mal die Skriptprofis unverschämt fragen ;) Besteht die Möglichkeit das ganze mit einem Header zu machen, in dem der unbedarfte User seine Daten einfach einträgt, dann abgetrennt mit ####ab hier keine Änderungen mehr#### den eigentlichen Skriptteil? Ist nicht böse gemeint, würde aber ungemein Leuten wie mir helfen, solche Skripts zu verstehen und an eigene Bedürfnisse anzupassen. Gruß Rainer
  • Probleme mit Schedule

    Verschoben
    5
    0 Stimmen
    5 Beiträge
    2k Aufrufe
    H
    Danke Bluefox für deine schnelle Antwort. ..und sorry wenn ich blöde Fragen habe aber ich lern gerade erst….und dank eurer Hilfe hab ich schon die ersten Programme erstellt. iobroker ist echt genial...wurde schon oft geschrieben aber "Hut ab".
  • Hilfe ;- Array anlegen oder Objekt im Objekt…?

    Verschoben
    8
    0 Stimmen
    8 Beiträge
    3k Aufrufe
    ruhr70R
    @Bluefox: Willst du einen Array sortiert nach Nummern, oder sortiert nach Zeit haben? ` Hi Bluefox, das Array mit den Nummern (call ID) funktioniert prächtig ;-) Jetzt will ich innerhalb des Objekts ein zweites Array anlegen. Hier wäre eine Sortierung nach Zeit sinnvoll, am besten noch, mit dem aktuellsten Eintrag an erster Stelle. Die Frage ist, ob das geht und wie man das dann handhabt.

380

Online

32.7k

Benutzer

82.5k

Themen

1.3m

Beiträge