@mcm57
genau das ist er. https://github.com/anarchocactus/ioBroker.solvis
Ich stelle ein Request. Da es aber nix besseres gab, habe ich lieber den Adapter von Github genommen.
@mcm57
genau das ist er. https://github.com/anarchocactus/ioBroker.solvis
Ich stelle ein Request. Da es aber nix besseres gab, habe ich lieber den Adapter von Github genommen.
Aaah. Im Instance-Folder is das. Danke.
Also brauche ich für den Adapter selbst gar kein State mit den 'grundlegenden' Einstellungen.
Dann weiß ich erstmal bescheid.
Hi zusammen,
sorry, ich lese hier nicht regelmäßig mit. Hier nochmal das aktuelle Script für den JavaScript-Adapter. Wichtig ist, das der TR-064-Adapter installiert ist. Dann sollte direkt über tr-064.0.states.command
das GetPhonebookList
abgerufen werden:
var xml2js = require('xml2js');
/*var vCardsJS = require('vcards-js');*/
var options = {
explicitArray: false,
mergeAttrs: true
};
var xml2jsParser = new xml2js.Parser(options);
var phonebook = JSON.parse("[]");
var phonebookVCard = "";
var phonebookListDetail = JSON.parse("[]");
createState('javascript.0.FritzBox.phonebook' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
setState ('javascript.0.FritzBox.phonebook', '');
});
createState('javascript.0.FritzBox.phonebookList' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState ('javascript.0.FritzBox.phonebookList', '');
});
createState('javascript.0.FritzBox.phonebookListDetail' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState ('javascript.0.FritzBox.phonebookListDetail', '');
});
createState('javascript.0.FritzBox.phonebookSelected' , {'name':'Status', 'type':'number', 'read':true, 'write':true, 'role':'state', 'def':0 },
function() {
setState ('javascript.0.FritzBox.phonebookSelected', 0);
});
createState('javascript.0.FritzBox.phonebookVCard' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
setState ('javascript.0.FritzBox.phonebookVCard', '');
});
on({ id: "javascript.0.FritzBox.phonebookList"
} , function (obj) {
//console.log(obj.state.val);
if (obj.state.val){
JSON.parse(obj.state.val).NewPhonebookList.split(/\s*,\s*/).forEach(function(myString) {
setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebook","params": {"NewPhonebookID":'+Number(myString)+'}}');
});
}
});
on({ id: "javascript.0.FritzBox.phonebookSelected"
} , function (obj) {
phonebook = JSON.parse("[]");
phonebookVCard = "";
for (let i = 0; i < 1000; i++) {
setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookEntry","params": {"NewPhonebookID":'+obj.state.val+', "NewPhonebookEntryID" : '+ i +' }}');
//console.log('{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookEntry","params": {"NewPhonebookID":'+obj.state.val+', "NewPhonebookEntryID" : '+ i +' }}');
}
//console.log("getPhonebook ID "+obj.state.val+" completed");
});
on({ id: "tr-064.0.states.commandResult"
} , function (obj) {
var commRes = JSON.parse(getState('tr-064.0.states.commandResult').val);
switch (true){
case commRes.hasOwnProperty('NewPhonebookEntryData'):
{
//console.log(JSON.stringify(commRes));
var res = commRes.NewPhonebookEntryData;
xml2jsParser.parseString(res, function (err, result) {
let foundIt = phonebook.find(el => el.contact.uniqueid === result.contact.uniqueid);
if (foundIt ){
//console.log(foundIt);
}else{
phonebook.push(result);
/*fill vcard
var vCard = vCardsJS();
vCard.firstName = result.contact.person.realName;
for (let j=0; j < result.contact.telephony.number.length;j++){
result.contact.telephony.number[j]._
switch (result.contact.telephony.number[j].type){
case 'work':
if( vCard.workPhone.length >0 ){
}else{
vCard.workPhone = result.contact.telephony.number[j]._;
}
break;
case 'home':
if( vCard.homePhone.length >0 ){
}else{
vCard.homePhone = result.contact.telephony.number[j]._;
}
break;
case 'mobile':
if( vCard.cellPhone.length >0 ){
}else{
vCard.cellPhone = result.contact.telephony.number[j]._;
}
break;
}
}
phonebookVCard += '\n'+vCard.getFormattedString();
setState ('javascript.0.FritzBox.phonebookVCard', JSON.stringify(phonebookVCard));
*/
}
});
// sort by name
phonebook.sort(function(a, b) {
var nameA = a.contact.person.realName.toUpperCase(); // ignore upper and lowercase
var nameB = b.contact.person.realName.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
});
setState ('javascript.0.FritzBox.phonebook', JSON.stringify(phonebook));
break;
}
case commRes.hasOwnProperty('NewPhonebookList'):
{
setState ('javascript.0.FritzBox.phonebookList', JSON.stringify(commRes));
break;
}
case commRes.hasOwnProperty('NewPhonebookURL'):
{
commRes.NewPhonebookExtraID=commRes.NewPhonebookURL.substr(commRes.NewPhonebookURL.length-1);
phonebookListDetail.push(commRes);
setState ('javascript.0.FritzBox.phonebookListDetail', JSON.stringify(phonebookListDetail));
//console.log(JSON.stringify(commRes));
break;
}
}
});
setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookList","params": {}}');
Die Anzeige habe ich auch etwas verändert:
<style>
body {
background-color: #ababab;
}
table {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
border: 1px solid black;
}
</style>
<div id="prev2"></div>
<div id="prev1"></div>
<script>
function updateStat (btn){
var objID1 = "javascript.0.FritzBox.phonebookSelected";
this.servConn._socket.emit('setState', objID1, btn.value );
}
vis.conn._socket.emit('getState', "javascript.0.FritzBox.phonebookListDetail", function (err, state) {
let phonebookListDetail =JSON.parse(state.val);
var phonebookID = 1;
var text ="";
for (var i = 0; i < phonebookListDetail.length; i+=1){
text += '<button style="width: 100%; height: 100%; text-align: left;" value=\"'+ phonebookListDetail[i].NewPhonebookExtraID +'\" onclick=updateStat(this)>'+ phonebookListDetail[i].NewPhonebookName +'</button>';
}
document.getElementById("prev2").innerHTML = text;
});
vis.conn._socket.emit('getState', "javascript.0.FritzBox.phonebook", function (err, state) {
let phonebook =JSON.parse(state.val);
var text ="";
text += "<table width=100% style=\"border:1px solid black;border-collapse: collapse;\"><tr><td>Name</td><td>TelNr 1</td><td>TelNr 2</td><td>TelNr 3</td></tr>";
for (let i = 0; i < phonebook.length; i+=1) {
text += "<tr>";
text += "<td>"+phonebook[i].contact.person.realName+"</td>";
//text += "</tr><tr><td> </td>";
var j = 0;
if (phonebook[i].contact.telephony.number.length){
for (j=0;j < phonebook[i].contact.telephony.number.length;j+=1) {
text += "<td>"+phonebook[i].contact.telephony.number[j]._+"</td>";
}
}else {
text += "<td>"+phonebook[i].contact.telephony.number._+"</td>";
j+=1;
}
for(j; j<3; j+=1){
text += "<td> </td>";
}
text += "</tr>";
}
text += "</table>";
document.getElementById("prev1").innerHTML = text;
document.getElementById("prev").innerHTML += "<pre>"+ JSON.stringify(phonebook, null, 3) + "</pre>";
});
</script>
<!--
<div style="display:none">{javascript.0.FritzBox.phonebook}</div>
<div style="display:none">{javascript.0.FritzBox.phonebookListDetail}</div>
-->
Allerdings habe ich da seit längerem nicht viel weiter gebaut.
@medoc
moin,
der Thread hier is zwar schon etwas älter, aber ich benutze seit einiger Zeit das Snapcast als Streaming-Server und Client für einen ZeroW und einen Raspi4. Zur Steuerung nutze ich noch das snapWeb
beim Punkt 2. bin ich etwas weiter gekommen. Ich habe die Datei-Liste erstmal in einem basic-html gebaut und will das dann in ein eigenes Widget im Adapter packen.
Allerdings habe ich da noch einige Probleme. Zum Einen wird der Zurück-Knopf machmal zwei Mal dargestellt.
<div id="prev"></div> <br>
<div id="pathList"></div>
<script>
function updateStat (btn){
var objID1 = "snapcast.0.currentPath";
this.servConn._socket.emit('setState', objID1, btn.value );
}
vis.conn._socket.emit('getState', "snapcast.0.currentPath", function (err, state) {
var pathAndFile =state.val;
var prevPath = pathAndFile.substring(0, pathAndFile.lastIndexOf('/'));
var table = "<table>";
table += "<tr> ";
table += '<td><button style="width: 100%; height: 100%;" value=\"'+ prevPath +'\" onclick=updateStat(this)> <<---- '+prevPath+' </button></td>';
table += '<td>'+ ' ' +'</td>';
table += "</tr> ";
table += "</table>";
document.getElementById("prev").innerHTML += table;
document.getElementById("prev").innerHTML += pathAndFile.substring(pathAndFile.lastIndexOf('/')+1, pathAndFile.length);
});
vis.conn._socket.emit('getState', "snapcast.0.currentPathList", function (err, state) {
var data = JSON.parse(state.val);
var table = "<table>";
for (var i = 0; i < data.length; i++) {
var lbl = "";
if (data[i][Object.keys(data[i])[2]] =="mp3" || data[i][Object.keys(data[i])[2]] == "directory"){
table += '<tr>';
if (data[i][Object.keys(data[i])[2]] == "directory"){
lbl = "---->> ";
}
var pathAndFile = data[i][Object.keys(data[i])[0]] +"/" + data[i][Object.keys(data[i])[1]];
table += '<td><button style="width: 100%; height: 100%; text-align: left;" value=\"'+ pathAndFile +'\" onclick=updateStat(this)>'+ lbl + data[i][Object.keys(data[i])[1]] +'</button></td>';
table += '</tr>';
}
}
table += " </table>";
document.getElementById("pathList").innerHTML += table;
});
</script>
<!--
<div style="display:none">{snapcast.0.currentPathList}</div>
<div style="display:none">{snapcast.0.currentPath}</div>
-->
Und zum Anderen fehlt mir etwas das Verständnis des Widget-Templates.
Ich schäme mich zwar etwas, aber hier der Adapter:
https://github.com/jampr21/ioBroker.snapcast
Hi zusammen,
hat jemand zufällig schon den xmltv EPG in IOBroker eingebunden? Ich habe von meinem TVHeadend den EPG vom DVB-S2. siehe auch: https://github.com/tvheadend/tvheadend/blob/master/docs/markdown/url.md
Viele Grüße
Hi zusammen,
nur zur Info: Ich bin jetzt auch auf Modbus umgestiegen. Denn js-controller 5 ist nicht mehr kompatibel mit dem sma-speedwire Adapter.
Mein Script im 5. post weiter oben ist ziemlich gleich geblieben. Ich habe nur sma-speedwire.0.SPOT_PACTOT mit modbus.0.inputRegisters.30775_Wirkleistung_gesamt_(W) ersetzt.
@mcm57
genau das ist er. https://github.com/anarchocactus/ioBroker.solvis
Ich stelle ein Request. Da es aber nix besseres gab, habe ich lieber den Adapter von Github genommen.
Hi zusammen, ich bin gerade umgestiegen auf js-controller 5 und natürlich hat ein Adapter (Solvis Adapter) nicht überlebt. Ich muss gestehen, ich habe keine Ahnung wo der herkommt. Der läuft schon jahrelang. Weiß jemand, wie ich den wieder zum Laufen bekomme? Habe auch mal einen Blick auf https://github.com/peak3d/iobroker.solvisremote geworfen, bekomme den aber auch nicht installiert.
Oder muss ich mir jetzt ein eigenes JavaScript bauen, um die Heizwerte zu bekommen?
Ich habe einen Solvis max futur Pufferspeicher mit Solvis Control 2 (MA115) und solvis remote. Mit einem Relais wird der Solarüberschuss in einen Heizstab gejagt. Und wir benutzen die Werte, da ein wasserführender Holzofen die Wärmezufur übernimmt (müssen wir Holz nachlegen oder ist Puffer voll).
LG
@killroy2
danke, jetzt ist es Ok. Das war noch vom KNX-Objekte-Laden. Ich habe mich nicht getraut, daran was zu verändern.
Hi zusammen,
ich versuche gerade einen Wert vom Aktor abzurufen.
So sieht er aus:
{
"_id": "openknx.0.Obergeschoss.Heizungsraum.Wirkleistung_A",
"type": "state",
"common": {
"name": "Wirkleistung A",
"type": "number",
"read": true,
"write": false,
"role": "value"
},
"native": {
"dpt": "DPT14.056",
"address": "2/5/11",
"answer_groupValueResponse": false,
"autoread": true
},
"acl": {
"object": 1636,
"state": 1636,
"owner": "system.user.admin",
"ownerGroup": "system.group.administrator"
},
"from": "system.adapter.admin.0",
"user": "system.user.admin",
"ts": 1646756139273
}
wenn ich den aber abrufe mit setState(Wirkleistung_A, {val: 0, ack: false, q:0x10});
wird mein Log zugespammt mit
Read-only state "openknx.0.Obergeschoss.Heizungsraum.Wirkleistung_A" has been written without ack-flag with value "0"
Wenn ich ACK auf true setze, bekomme ich nur die 0 ausgelesen. Ist also keine Option. Hat jemand einen Tipp, wie ich die Meldung im Log weg bekomme?
LG
Hi zusammen,
sorry, ich lese hier nicht regelmäßig mit. Hier nochmal das aktuelle Script für den JavaScript-Adapter. Wichtig ist, das der TR-064-Adapter installiert ist. Dann sollte direkt über tr-064.0.states.command
das GetPhonebookList
abgerufen werden:
var xml2js = require('xml2js');
/*var vCardsJS = require('vcards-js');*/
var options = {
explicitArray: false,
mergeAttrs: true
};
var xml2jsParser = new xml2js.Parser(options);
var phonebook = JSON.parse("[]");
var phonebookVCard = "";
var phonebookListDetail = JSON.parse("[]");
createState('javascript.0.FritzBox.phonebook' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
setState ('javascript.0.FritzBox.phonebook', '');
});
createState('javascript.0.FritzBox.phonebookList' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState ('javascript.0.FritzBox.phonebookList', '');
});
createState('javascript.0.FritzBox.phonebookListDetail' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state'},
function() {
setState ('javascript.0.FritzBox.phonebookListDetail', '');
});
createState('javascript.0.FritzBox.phonebookSelected' , {'name':'Status', 'type':'number', 'read':true, 'write':true, 'role':'state', 'def':0 },
function() {
setState ('javascript.0.FritzBox.phonebookSelected', 0);
});
createState('javascript.0.FritzBox.phonebookVCard' , {'name':'Status', 'type':'string', 'read':true, 'write':true, 'role':'state', 'def':'' },
function() {
setState ('javascript.0.FritzBox.phonebookVCard', '');
});
on({ id: "javascript.0.FritzBox.phonebookList"
} , function (obj) {
//console.log(obj.state.val);
if (obj.state.val){
JSON.parse(obj.state.val).NewPhonebookList.split(/\s*,\s*/).forEach(function(myString) {
setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebook","params": {"NewPhonebookID":'+Number(myString)+'}}');
});
}
});
on({ id: "javascript.0.FritzBox.phonebookSelected"
} , function (obj) {
phonebook = JSON.parse("[]");
phonebookVCard = "";
for (let i = 0; i < 1000; i++) {
setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookEntry","params": {"NewPhonebookID":'+obj.state.val+', "NewPhonebookEntryID" : '+ i +' }}');
//console.log('{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookEntry","params": {"NewPhonebookID":'+obj.state.val+', "NewPhonebookEntryID" : '+ i +' }}');
}
//console.log("getPhonebook ID "+obj.state.val+" completed");
});
on({ id: "tr-064.0.states.commandResult"
} , function (obj) {
var commRes = JSON.parse(getState('tr-064.0.states.commandResult').val);
switch (true){
case commRes.hasOwnProperty('NewPhonebookEntryData'):
{
//console.log(JSON.stringify(commRes));
var res = commRes.NewPhonebookEntryData;
xml2jsParser.parseString(res, function (err, result) {
let foundIt = phonebook.find(el => el.contact.uniqueid === result.contact.uniqueid);
if (foundIt ){
//console.log(foundIt);
}else{
phonebook.push(result);
/*fill vcard
var vCard = vCardsJS();
vCard.firstName = result.contact.person.realName;
for (let j=0; j < result.contact.telephony.number.length;j++){
result.contact.telephony.number[j]._
switch (result.contact.telephony.number[j].type){
case 'work':
if( vCard.workPhone.length >0 ){
}else{
vCard.workPhone = result.contact.telephony.number[j]._;
}
break;
case 'home':
if( vCard.homePhone.length >0 ){
}else{
vCard.homePhone = result.contact.telephony.number[j]._;
}
break;
case 'mobile':
if( vCard.cellPhone.length >0 ){
}else{
vCard.cellPhone = result.contact.telephony.number[j]._;
}
break;
}
}
phonebookVCard += '\n'+vCard.getFormattedString();
setState ('javascript.0.FritzBox.phonebookVCard', JSON.stringify(phonebookVCard));
*/
}
});
// sort by name
phonebook.sort(function(a, b) {
var nameA = a.contact.person.realName.toUpperCase(); // ignore upper and lowercase
var nameB = b.contact.person.realName.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
});
setState ('javascript.0.FritzBox.phonebook', JSON.stringify(phonebook));
break;
}
case commRes.hasOwnProperty('NewPhonebookList'):
{
setState ('javascript.0.FritzBox.phonebookList', JSON.stringify(commRes));
break;
}
case commRes.hasOwnProperty('NewPhonebookURL'):
{
commRes.NewPhonebookExtraID=commRes.NewPhonebookURL.substr(commRes.NewPhonebookURL.length-1);
phonebookListDetail.push(commRes);
setState ('javascript.0.FritzBox.phonebookListDetail', JSON.stringify(phonebookListDetail));
//console.log(JSON.stringify(commRes));
break;
}
}
});
setState ('tr-064.0.states.command', '{"service": "urn:dslforum-org:service:X_AVM-DE_OnTel:1","action": "GetPhonebookList","params": {}}');
Die Anzeige habe ich auch etwas verändert:
<style>
body {
background-color: #ababab;
}
table {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
border: 1px solid black;
}
</style>
<div id="prev2"></div>
<div id="prev1"></div>
<script>
function updateStat (btn){
var objID1 = "javascript.0.FritzBox.phonebookSelected";
this.servConn._socket.emit('setState', objID1, btn.value );
}
vis.conn._socket.emit('getState', "javascript.0.FritzBox.phonebookListDetail", function (err, state) {
let phonebookListDetail =JSON.parse(state.val);
var phonebookID = 1;
var text ="";
for (var i = 0; i < phonebookListDetail.length; i+=1){
text += '<button style="width: 100%; height: 100%; text-align: left;" value=\"'+ phonebookListDetail[i].NewPhonebookExtraID +'\" onclick=updateStat(this)>'+ phonebookListDetail[i].NewPhonebookName +'</button>';
}
document.getElementById("prev2").innerHTML = text;
});
vis.conn._socket.emit('getState', "javascript.0.FritzBox.phonebook", function (err, state) {
let phonebook =JSON.parse(state.val);
var text ="";
text += "<table width=100% style=\"border:1px solid black;border-collapse: collapse;\"><tr><td>Name</td><td>TelNr 1</td><td>TelNr 2</td><td>TelNr 3</td></tr>";
for (let i = 0; i < phonebook.length; i+=1) {
text += "<tr>";
text += "<td>"+phonebook[i].contact.person.realName+"</td>";
//text += "</tr><tr><td> </td>";
var j = 0;
if (phonebook[i].contact.telephony.number.length){
for (j=0;j < phonebook[i].contact.telephony.number.length;j+=1) {
text += "<td>"+phonebook[i].contact.telephony.number[j]._+"</td>";
}
}else {
text += "<td>"+phonebook[i].contact.telephony.number._+"</td>";
j+=1;
}
for(j; j<3; j+=1){
text += "<td> </td>";
}
text += "</tr>";
}
text += "</table>";
document.getElementById("prev1").innerHTML = text;
document.getElementById("prev").innerHTML += "<pre>"+ JSON.stringify(phonebook, null, 3) + "</pre>";
});
</script>
<!--
<div style="display:none">{javascript.0.FritzBox.phonebook}</div>
<div style="display:none">{javascript.0.FritzBox.phonebookListDetail}</div>
-->
Allerdings habe ich da seit längerem nicht viel weiter gebaut.
@glasfaser
Beim Anlegen des Containers kann nach Drücken des Knopfes 'Advanced Settings' auf dem Reiter 'Network' sollte der Haken 'use the same network as Docker Host' gesetzt werden. Sonst binden sich die Ports an die Docker-eigene IP.
@medoc
moin,
der Thread hier is zwar schon etwas älter, aber ich benutze seit einiger Zeit das Snapcast als Streaming-Server und Client für einen ZeroW und einen Raspi4. Zur Steuerung nutze ich noch das snapWeb
@qlink uuups? Warum bin ich noch auf Version 0.5.7? Ich checke das mal. Daaaanke