foxriver76 / ioBroker.denon

Denon AVR adapter for ioBroker
MIT License
19 stars 9 forks source link

LFE/Main Datenpunkt #71

Closed sascharuckzuck closed 4 years ago

sascharuckzuck commented 4 years ago

Moin, wäre das hinzufügen des Datenpunktes LFE/Main bzw nur LFE in den Settings möglich. Ich möchte nämlich ein Blockly erstellen, wenn ein Mehrkanal Ton vorhanden ist, dass sich dann auf LFE Only einstellt.

MfG

foxriver76 commented 4 years ago

lfeAmount gibt es seit 1.6.0 falls das nicht gemeint ist, kannst du mir bitte sagen welchen Befehl du genau meinst. Siehe https://github.com/foxriver76/ioBroker.denon/blob/master/docs/AVR-Control-Protocol.pdf

sascharuckzuck commented 4 years ago

Findet sich jedenfalls bei aktuellen Denon AVRs unter Einstellungen -->Lautsprecher -->Manuell***-->Bass. werde ansonsten nochmal heute Abend schauen wenn ich Zuhause bin.

foxriver76 commented 4 years ago

Du kannst mithilfe der PDF und dem State settings.expertCommand testen, welcher Befehl das tut was du möchtest. Habe leider ein etwas älteres Modell.

Wenn du weißt, welcher Befehl es ist, kann ich ihn einbauen.

sascharuckzuck commented 4 years ago

werde ich heute Abend mal probieren

foxriver76 commented 4 years ago

Bist du dazu gekommen? ;-)

sascharuckzuck commented 4 years ago

Moin, ja hatte geguckt, aber nichts gefunden. sehr seltsam

foxriver76 commented 4 years ago

Welches Modell hast du denn? Evtl. brauchen wir eine andere/neuere Protokollbeschreibung.

sascharuckzuck commented 4 years ago

den AVR 1600H hatte auch schon nach gesucht...

foxriver76 commented 4 years ago

Ich finde auch nur den Befehl LFE **, dieser ist bereits im Adapter enthalten.

mllrmnn commented 1 year ago

@sascharuckzuck Wenn immer noch Interesse besteht und dein AVR über das WebInterface steuerbar ist, kann ich dir ein kurzes Code Beispiel geben wie du es per http-request setzen und auslesen kannst.

sascharuckzuck commented 1 year ago

@mllrmnn Vielen Dank, ja Interesse besteht. Mal schauen was ich dann daraus machen kann :)

mllrmnn commented 1 year ago

@sascharuckzuck

here are the 2 scripts to get and set LFE+Main Mode:

getLFE_MAIN.txt setLFE_MAIN.txt

Sorry if some parts of the code are a bit "overshoot" that is because I obtain a lot more infos over http-requests then the LFE+Main status but I have shortened the scripts for you.

note that you have to change the following in both scripts:

the result looks like that in the objects tab:

Bildschirmfoto 2023-02-04 um 16 43 01
sascharuckzuck commented 1 year ago

@mllrmnn vielen lieben Dank. Allerdings stehe ich auf dem Schlauch, was ich bei " change ID_AV_InfosFromParser_1 and parser_Adapter_ID based on your parser configuration" ändern soll.

mllrmnn commented 1 year ago

Gerne, hätte ich vllt. erwähnen sollen. Das sind 2 Variablen im get Skript. Bei der einen (parser_Adapter_ID) definiert man den alive Status von der entsprechenden parser Instanz und bei der anderen den Output vom parser adapter

Hintergrund der Angabe der parser Instanz ist der, dass in dieser Instanz nur urls vom AVR geparsed werden und die Instanz deaktiviert wird wenn der AVR aus ist.

sascharuckzuck commented 1 year ago

Moin, Ich bin echt zu Lost für JavaScript.

/var xml2js = require('xml2js'); var options = { explicitArray: false, mergeAttrs: true }; var parser = new xml2js.Parser(options);

var Power = "denon.0.settings.powerSystem" // == "denon.0.settings.powerSystem" i have a dict with multiple IDs in an global script. Easy way to get the IDs from an Device. var Vorordner = 'javascript.0.Allgemeine_Variablen.AV_Receiver.MARANTZ_Cinema_50.'

var parser_Adapter_ID='system.adapter.parser.1.alive' var ID_AV_InfosFromParser_1 = "parser.1.Marantz_Cinema_50_Infos_1" var ID_AV_InfoXML_1 = Vorordner + 'Infos.InfosXML_1' var ID_AV_InfoJSON_1 = Vorordner + 'Infos.InfosJSON_1' var ID_AV_InfoJSON_string_1 = Vorordner + 'Infos.InfosJSON_String_1' var ID_Vorordner_Audio = Vorordner + 'Infos.Audio.' var ID_Vorordner_Video = Vorordner + 'Infos.Video.'

var StringNotAvailable ='notAvailable'

createState(ID_AV_InfoXML_1, "", {role: 'state',"type": "mixed","unit": "","def": "","read": true,"write": true,name: 'AV Infos in XML Format'}) createState(ID_AV_InfoJSON_1, "", {role: 'state',"type": "mixed","unit": "","def": "","read": true,"write": true,name: 'AV Infos in JSON Format'}) createState(ID_AV_InfoJSON_string_1, "", {role: 'state',"type": "mixed","unit": "","def": "","read": true,"write": true,name: 'AV Infos in JSON Format'}

on({id: Power, change: 'any'}, function (obj) { var value = obj.state.val; if (value === true){ setState parser.1.Denon,true }else{ setState parser.1.Denon,false } });

// für ID_AV_InfosFromParser_1 https://192.168.0.19:10443/ajax/speakers/get_config?type=7&_=1675034364280 on({id: ID_AV_InfosFromParser_1, change: 'any'}, function (obj) { var value = obj.state.val;

xml = String(value)

parser.parseString(xml, function(err,result){
    //Extract the value from the data element
    extractedData = result;
    setState(ID_AV_InfoJSON_1,extractedData)    
    setState(ID_AV_InfoJSON_string_1,JSON.stringify(extractedData))    
})
setState(ID_AV_InfoXML_1,value)    

});

createState(ID_Vorordner_Audio + 'Raw.Bass.SubwooferOutput', '999', {name: 'Trennfrequenz LFE', role: 'state',"type": "mixed","unit": "","def": '999',"read": true,"write": true}) createState(ID_Vorordner_Audio + 'Raw.Bass.LPFforLFE', 0, {name: 'Trennfrequenz LFE', role: 'state',"type": "mixed","unit": "Hz","def": 0,"read": true,"write": true}) createState(ID_Vorordner_Audio + 'Bass.Trennfrequenz', 0, {name: 'Trennfrequenz LFE', role: 'state',"type": "number","unit": "Hz","def": 0,"read": true,"write": true}) createState(ID_Vorordner_Audio + 'Bass.SubwooferModus', 99, {name: 'LFE or LFE+Main', role: 'state',"type": "number","unit": "","def": 99,"read": true,"write": true}) createState(ID_Vorordner_Audio + 'Bass.SubwooferModusPretty', "", {name: 'LFE or LFE+Main', role: 'state',"type": "mixed","unit": "","def": "","read": true,"write": true})

on({id: ID_AV_InfoJSON_1, change: 'ne'}, function (obj) { var value_string = JSON.stringify(obj.state.val); var value = obj.state.val; var oldValue = obj.oldState.val;

var Infos_AV_JSON_1 = value var Infos_Bass = Infos_AV_JSON_1["Bass"]

// SetAV_InfosRaw(ID_Vorordner_Video,Infos_Video,"Resolution") //Wird über AppSniff ausgelesen
SetAV_InfosRawAddFolder(ID_Vorordner_Audio,Infos_Bass,"SubwooferOutput",'Bass.')
SetAV_InfosRawAddFolder(ID_Vorordner_Audio,Infos_Bass,"LPFforLFE",'Bass.')

});

on({id: ID_Vorordner_Audio + 'Raw.Bass.LPFforLFE' , change: "any"}, function (obj) { var value = obj.state.val;

setState(ID_Vorordner_Audio + 'Bass.Trennfrequenz',parseInt(value))

});

on({id: ID_Vorordner_Audio + 'Raw.Bass.SubwooferOutput' , change: "any"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; var Verursacher = obj.id if(value == '1' || value == 1){ SubModeToSet = parseInt(value) SubModeToSetPretty = 'LFE'

}else if(value == '2' || value == 2){
    SubModeToSet = parseInt(value)
    SubModeToSetPretty = 'LFE+Main'
}else{
    SubModeToSet = StringNotAvailable
    SubModeToSetPretty = StringNotAvailable
}
setState(ID_Vorordner_Audio + 'Bass.SubwooferModus',SubModeToSet)
setState(ID_Vorordner_Audio + 'Bass.SubwooferModusPretty',SubModeToSetPretty)

});

function SetAV_InfosRawAddFolder(ID_Vorordner_Audio,Infos_Audio,NameOFInfo,AdditionalFolder){ log(InfosAudio[NameOFInfo]['']) log(ID_Vorordner_Audio + 'Raw.' + AdditionalFolder + NameOFInfo) try { setState(ID_Vorordner_Audio + 'Raw.' + AdditionalFolder + NameOFInfo,String(InfosAudio[NameOFInfo][''])) if(InfosAudio[NameOFInfo][''] == undefined){ setState(ID_Vorordner_Audio + 'Raw.' + AdditionalFolder + NameOFInfo,StringNotAvailable) } } catch (error) { setState(ID_Vorordner_Audio + 'Raw.' + AdditionalFolder + NameOFInfo,StringNotAvailable) } }

Wahrscheinlich ist das falsch... kommt auch mit der Error Meldung: javascript.0 (471) script.js.common.Wohnzimmer.Geräte.getLFE_MAIN compile failed: at script.js.common.Wohnzimmer.Geräte.getLFE_MAIN:1

Wäre aber auch nicht schlimm wenn ich es nicht zum laufen kriege. Bin schon happy darüber, dass ich die Einstellung mittels http-Request URL setzen kann und per Blockly entsprechend automatisieren kann.

mllrmnn commented 1 year ago

Backslash ganz am Anfang weg... Copy Paste Fehler von mir... createState(ID_AV_InfoJSON_string_1, "", {role: 'state',"type": "mixed","unit": "","def": "","read": true,"write": true,name: 'AV Infos in JSON Format'} da gehört auch noch ne runde klammer ans ende. Ich hab die file im ursprünglichen post geupdated.