NEWS
Alarmanlage / Kamera Skript verursacht Fehler und bringt JS zum Absturz?
-
Hallo zusammen,
aus mir unbegreiflichen Gründen finde ich im Log folgendes:
!
host.iobrokerNUC 2018-04-30 14:17:13.185 error instance system.adapter.javascript.0 terminated with code 0 (OK) host.iobrokerNUC 2018-04-30 14:17:13.185 error Caught by controller[1]: code: 'ECONNRESET' } host.iobrokerNUC 2018-04-30 14:17:13.185 error Caught by controller[1]: at TCP._handle.close [as _onclose] (net.js:497:12) host.iobrokerNUC 2018-04-30 14:17:13.185 error Caught by controller[1]: at Socket.emit (events.js:188:7) host.iobrokerNUC 2018-04-30 14:17:13.185 error Caught by controller[1]: at emitOne (events.js:101:20) host.iobrokerNUC 2018-04-30 14:17:13.184 error Caught by controller[1]: at Socket.socketCloseListener (_http_client.js:286:23) host.iobrokerNUC 2018-04-30 14:17:13.184 error Caught by controller[1]: at createHangUpError (_http_client.js:254:15) host.iobrokerNUC 2018-04-30 14:17:13.184 error Caught by controller[1]: { Error: socket hang up host.iobrokerNUC 2018-04-30 14:17:13.184 error Caught by controller[0]: port: 80 } host.iobrokerNUC 2018-04-30 14:17:13.184 error Caught by controller[0]: address: '192.168.2.22', host.iobrokerNUC 2018-04-30 14:17:13.184 error Caught by controller[0]: syscall: 'connect', host.iobrokerNUC 2018-04-30 14:17:13.184 error Caught by controller[0]: errno: 'EHOSTUNREACH', host.iobrokerNUC 2018-04-30 14:17:13.184 error Caught by controller[0]: code: 'EHOSTUNREACH', host.iobrokerNUC 2018-04-30 14:17:13.183 error Caught by controller[0]: at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1086:14) host.iobrokerNUC 2018-04-30 14:17:13.183 error Caught by controller[0]: at exports._exceptionWithHostPort (util.js:1043:20) host.iobrokerNUC 2018-04-30 14:17:13.183 error Caught by controller[0]: at Object.exports._errnoException (util.js:1020:11) host.iobrokerNUC 2018-04-30 14:17:13.182 error Caught by controller[0]: { Error: connect EHOSTUNREACH 192.168.2.22:80 !
wobei die IP die meiner Instar Camera ist.
Selbige hängt an einer Osram Smartplug, die nur eingeschaltet wird, wenn die Kamera aktiv sein soll, d.h. die Einstellung ist entsprechend und ich habe die Alarmanlage aktiv.
Mein Kamera-Skript sieht so aus:
! ````
// ##############################################################################################################
// # Skript löst Alarm auf Instar HD 6001 aus, wobei als trigger ein beliebiges Element genutzt werden kann #
// # Zudem Einstellungen via Vis möglich. Grundsätzliche Reaktion nach Alarm wird durch Cam ausgeführt #
// # Simple API Adapter muss installiert sein #
// ##############################################################################################################
! // BEACHTEN: Offiziell hat die Instar HD 6001 keinen externen i/o Alarm. Jedoch ist dieser softwareseitig ansprechbar mit leicht geänderten Parametern
// https://forum.instar.de/forum/allgemeines-talkroom/scripts-programmierung/2723-alarm-erzwingen
! /* Aktivieren = setioattr&-io_enable=1&-io_flag=0
Deaktivieren = setioattr&-io_enable=0&-io_flag=0
! http://ip-adresse/cgi-bin/hi3510/param.cgi?cmd=setioattr&-io_enable=1&-io_flag=0
http://ip-adresse/cgi-bin/hi3510/param.cgi?cmd=setioattr&-io_enable=0&-io_flag=0
! https://wikiold.instar.de/index.php/HD_CGI_Commands_-_Set_Alarm_Input_Output_Attribute
! io_enable: Enable or Disable IO Alarm-in (1,0)
io_flag: IO Alarm mode 0 (close), 1 (open)
! https://wikiold.instar.de/index.php/HD_Kamera_CGIs_Alarm_Actions
! */
! // ############ SKRIPT EINSTELLUNGE ############
! var debug = false;
var force = true;
! var request = require('request');
! // States anlegen für VIS Einstellungen
! createState('Alarmanlage.Kameras.Trigger', false, force, {
read: true,
write: true,
name: "Trigger",
type: "boolean",
def: false
});
! createState('Alarmanlage.Kameras.Ausgeloest', false, force, {
read: true,
write: true,
name: "Trigger",
type: "boolean",
def: false
});
! createState('Alarmanlage.Kameras.Email', true, force, {
read: true,
write: true,
name: "Kameras senden Email yes/no",
type: "boolean",
def: false
});
! createState('Alarmanlage.Kameras.Email.PicCount',8, force, {
name: 'Kamera Email Bilder',
type: 'number',
min: '1',
max: '8',
desc: 'Wieviele Bilder sollen per E-Mail gesendet werden'
});
! createState('Alarmanlage.Kameras.FTP', true, force, {
read: true,
write: true,
name: "Kameras senden an FTP yes/no",
type: "boolean",
def: false
});
! createState('Alarmanlage.Kameras.FTP.PicCount',8, force, {
name: 'Kamera FTP Bilder',
type: 'number',
min: '1',
max: '8',
desc: 'Wieviele Bilder sollen an FTP gesendet werden'
});
! // Variablen und IDs
! var idMotion = "hm-rpc.1.000C17099A0019.1.PRESENCE_DETECTION_STATE";
var idMotionreset = "hm-rpc.1.000C17099A0019.1.RESET_PRESENCE"/Präsenzmelder Wohnzimmer:1.RESET_PRESENCE/;
var trigger = 'javascript.0.Alarmanlage.Kameras.Trigger';
var ausgeloest = 'javascript.0.Alarmanlage.Kameras.Ausgeloest';
var idKamerasAktiv = 'javascript.0.Alarmanlage.Kameras';
! // Trigger Alarmauslösung
! on({id:idMotion, change: "any", val: true},function(){
if(getState(idKamerasAktiv).val == 1) {
camAlarm();
setState(ausgeloest, true);
setStateDelayed(idMotionreset, true, 80000);
setStateDelayed(idMotionreset, false, 82000);
if(debug) log("Alarm ausgelöst");
}
});
! // Trigger Alarmberuhigung
! on({id:idMotion, change: "any", val: false}, function(){
if(getState(idKamerasAktiv).val == 1) camCalm();
});
! // Functions
! function camAlarm(){request.get('http://xxxxxxx:xxxxxxxxxxxx@192.168.2.22/cgi-bin/hi3510/param.cgi?cmd=setioattr&-io_enable=1&-io_flag=0'); // öffnet manuell den Alarm "strom"Kreislauf
! }
! function camCalm(){
request.get('http://xxxxxxxxr:xxxxxxxxxxx@192.168.2.22/cgi-bin/hi3510/param.cgi?cmd=setioattr&-io_enable=0&-io_flag=0');
setState(ausgeloest, false);
}
!Über mein eigentliches Alarmanlagen-Skript wird die Kamerasteckdose eingeschaltet, sofern eben die Einstellung so ist und die Alarmanlage scharf geschaltet wird. Jemand eine Idee, was da die Fehler auslöst und wieso? Die Fehler treten auch auf, wenn die Einstellungen zwar "aktiv" sind, die Alarmanlage selbst aber nicht. Bislang gab es diese Fehler nicht.
-
connect EHOSTUNREACH 192.168.2.22:80
Heißt soviel wie 192.168.2.22:80 ist nicht erreichbar.
Ist 192.168.2.22 sicher die richtige IP Adresse?
Befindet sich dein ioBroker eventuell in einem anderen Subnet/Adressbereich?
Gruß
-
Im Log steht ja 192.168.2.22:80.
Ist die Cam auf Port 80 zu erreichen ?
Meine Cam brauchen ungfähr 15 sec nach Stromzufuhr bis diese im Netz stehen.
Ralla
-
Port 80 ist der Standard http Port.. Das sollte also definitiv korrekt sein..
Gruß
-
Keine Ahnung vom Proggen,
aber wie holst du den Status ab ob die Kamera Online ist ?
Einmalig hier aus dem Aktivierungsmodus der Alarmanlage.
Was wäre bei Verbindungsverlust der Cam ?
Bevor ein Befehl gesendet wird würde ich prüfen ob die Cam Online ist.
Wenn ja, Befehl senden, wenn nicht prüfe in X sec noch einmal.
Dein Script läuft, der Controller versucht immer wieder deine Cam
zu erreichen die ja nicht Online ist und läuft praktisch in einer Schleife.
Wenn die Camera aktiviert wird / Strom ein würde ich ein Delay setzen.
Macht ja keinen Sinn eine Camera die nicht im Netz steht anzusprechen.
Ralla
-
Danke für eure Antworten.
Die Frage für mich ist ja:
warum kommt es zu diesem Fehler? Die Kamera soll ja ggf. gar nicht erreichbar sein (Strom aus). Die IP ist korrekt, eben nochmal in der FritzBox nachgesehen. Wieso stürzt JS ab, bloss weil eine Kamera aus ist? Die ist ja immer aus; das Problem tritt auf, wenn ich meine Alarmanlage von "nur Bewegungsmelder" auf "Bewegungsmelder und Kamera" umschalte, und zwar unabhängig davon, ob die Alarmanlage an ist (dann geht die Steckdose an) oder nicht (Steckdose aus).
Ich muss wohl nochmal tief reinschauen, aber aktuell habe ich keinen Ansatz.
Edit: ich habe es glaube ich gerade gefunden!
hier
// Trigger Alarmberuhigung on({id:idMotion, change: "any", val: false}, function(){ if(getState(idKamerasAktiv).val == 1) camCalm(); });
muss es denke ich heißen:
on({id:idMotion, change: "any", val: false}, function(){ if(getState(idKamerasAktiv).val == 1 && ausgeloest) camCalm(); });
Da dürfte das verzweifelte Suchen nach der Kamera hergekommen sein. Denn ich habe neu eingebaut , dass die BWM an sien können, ohne dass die Kamera an ist (also quasi innenüberwachung zweistufig).
Das werde ich mal testen
-
Das kann ja nur an der Verkasperung hier drin liegen:
Bewegungsmelder und Kamera.
Nichts des so Trotz würde ich immer den Status der Cam Offline / Online abfragen.
Früher oder später stolpers du wieder daüber.
Ralla
-
Dein Script versucht zu einem Zeitpunkt die cam zu erreichen, wo sie aber noch nicht erreichbar ist.
Du kannst mit "try catch" den Fehler abfangen und entsprechend reagieren: wenn Fehler auftritt dann in 10 Sekunden nochmal probieren. Oder ähnlich.
Gruß
-
if(getState(idKamerasAktiv).val == 1)
val == 1 wird wie gebildet ?
Hier den Status der Cam vor Aktionsauslösung durchführen.
val == 1 ist wenn Camera Online.
Definiere mal im Programm Online / Offline.
Erst dadurch soll ja ein Script ausgeführt werden.
Offline macht ja keinen Sinn.
So wie BuZZy das schrieb, wieder probieren.
Solltest du nach X Sek kein Erfolg haben Error Code generieren.
Ralla