Kurzes Update.
Das Script & Blockly scheint fertig. Damit kann ich nun recht generisch Datenpunkte für openHasp-Displays erstellen bzw. für die diversen Buttons.
@paul53 hat Starthilfe gegeben. Danke nochmal.
Den Rest dann mit chatgpt beendet. Waren noch paar kleine Stolpersteine drin.
Wenn ich auch passende Scripte fertig und alles getestet habe, dann schreibe ich mal eine Anleitung für openHasp.
cbed5891-de9b-4916-8db9-71066cb384d4-grafik.png
<xml xmlns="https://developers.google.com/blockly/xml">
<variables>
<variable id="t]mHQ2(O[i~,~{Z1[+%!">button_id</variable>
<variable id="mPT5a/ZZM;ltIo{jt;]v">buttonfunktion</variable>
<variable id="O5fjg~@mC^kh:.OT[4tI">speicherpfad</variable>
<variable id="r2OFNb5JSoE#g];#4K3Y">pretopic</variable>
<variable id="5gtZow7y)14]oqV=GyN|">hostname</variable>
<variable id="`wmra-.jA.[a)@dMnQN7">type</variable>
</variables>
<block type="procedures_defcustomnoreturn" id="@UFkkX.yv%])Ff}F2;|j" x="238" y="163">
<mutation statements="false">
<arg name="button_id" varid="t]mHQ2(O[i~,~{Z1[+%!"></arg>
<arg name="buttonfunktion" varid="mPT5a/ZZM;ltIo{jt;]v"></arg>
<arg name="speicherpfad" varid="O5fjg~@mC^kh:.OT[4tI"></arg>
<arg name="pretopic" varid="r2OFNb5JSoE#g];#4K3Y"></arg>
<arg name="hostname" varid="5gtZow7y)14]oqV=GyN|"></arg>
<arg name="type" varid="`wmra-.jA.[a)@dMnQN7"></arg>
</mutation>
<field name="NAME">paul53</field>
<field name="SCRIPT">Y29uc3QgY3JlYXRlVG9waWMgPSAoYWN0aW9uKSA9PiBgJHtwcmV0b3BpY30vJHtob3N0bmFtZX0vJHthY3Rpb259LyR7YnV0dG9uX2lkfWA7DQpjb25zdCBjcmVhdGVJRCA9IChhY3Rpb24pID0+IGAwX3VzZXJkYXRhLjAuJHtzcGVpY2hlcnBmYWR9LiR7aG9zdG5hbWV9LiR7YWN0aW9ufS4ke2J1dHRvbl9pZH1gOw0KDQpjb25zdCBzdGF0ZXRvcGljID0gY3JlYXRlVG9waWMoJ3N0YXRlJyk7DQpjb25zdCBjb21tYW5kdG9waWMgPSBjcmVhdGVUb3BpYygnY29tbWFuZCcpICsgKHR5cGUudG9Mb3dlckNhc2UoKSA9PT0gJ251bWJlcicgPyAnLnZhbCcgOiAnJyk7DQoNCmNvbnN0IHN0YXRlX2lkID0gY3JlYXRlSUQoJ3N0YXRlJyk7DQpjb25zdCBjb21tYW5kX2lkID0gY3JlYXRlSUQoJ2NvbW1hbmQnKTsNCg0KLy8gU3RhbmRhcmR3ZXJ0IGbDvHIgZGVmDQpjb25zdCBnZXREZWZhdWx0VmFsdWUgPSAodCkgPT4gKHQgPT09ICdudW1iZXInID8gMCA6IHQgPT09ICdib29sZWFuJyA/IGZhbHNlIDogJycpOw0KDQpjb25zdCBzdGF0ZV9jb21tb24gPSB7DQogICAgbmFtZTogYnV0dG9uZnVua3Rpb24sDQogICAgcm9sZTogInN0YXRlIiwNCiAgICB0eXBlOiAic3RyaW5nIiwNCiAgICByZWFkOiB0cnVlLA0KICAgIHdyaXRlOiBmYWxzZSwNCiAgICBkZWY6ICcnLA0KICAgIGN1c3RvbTogew0KICAgICAgICAibXF0dC1jbGllbnQuMCI6IHsgZW5hYmxlZDogdHJ1ZSwgcHVibGlzaDogZmFsc2UsIHN1YnNjcmliZTogdHJ1ZSwgdG9waWM6IHN0YXRldG9waWMgfQ0KICAgIH0NCn07DQoNCmNvbnN0IGNvbW1hbmRfY29tbW9uID0gew0KICAgIG5hbWU6IGJ1dHRvbmZ1bmt0aW9uLA0KICAgIHJvbGU6ICJzdGF0ZSIsDQogICAgdHlwZSwNCiAgICByZWFkOiB0cnVlLA0KICAgIHdyaXRlOiB0cnVlLA0KICAgIGRlZjogZ2V0RGVmYXVsdFZhbHVlKHR5cGUpLA0KICAgIGN1c3RvbTogew0KICAgICAgICAibXF0dC1jbGllbnQuMCI6IHsgZW5hYmxlZDogdHJ1ZSwgcHVibGlzaDogdHJ1ZSwgc3Vic2NyaWJlOiBmYWxzZSwgdG9waWM6IGNvbW1hbmR0b3BpYyB9DQogICAgfQ0KfTsNCg0KY3JlYXRlU3RhdGUoc3RhdGVfaWQsICcnLCBzdGF0ZV9jb21tb24pOw0KY3JlYXRlU3RhdGUoY29tbWFuZF9pZCwgZ2V0RGVmYXVsdFZhbHVlKHR5cGUpLCBjb21tYW5kX2NvbW1vbik7</field>
<comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
</block>
<block type="comment" id="$RQ:rwIC/g6xPOV+A1Ss" x="237" y="212">
<field name="COMMENT">Adapter: mqtt-client.0&#10;button_id: Den Button angeben&#10;buttonfunktion: Was soll durch den Button ausgelöst werden&#10;speicherpfad: hinter userdata_0.0&#10;pretopic: siehe mqtt-setting des hasp devices&#10;hostname des hasp-devices&#10;typ des Buttons (bool, string, number)</field>
<next>
<block type="on" id="V?L;5Nr}OxT)BT]~^#Jc">
<field name="OID">0_userdata.0.test</field>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id="0),V(RPzI|S:?3|,7W]!">
<value name="IF0">
<block type="on_source" id="3z%t2xus(;q~YGyZh}SN">
<field name="ATTR">state.val</field>
</block>
</value>
<statement name="DO0">
<block type="procedures_callcustomnoreturn" id="=gS(Blp?cNt|^k7%1[k%">
<mutation name="paul53">
<arg name="button_id"></arg>
<arg name="buttonfunktion"></arg>
<arg name="speicherpfad"></arg>
<arg name="pretopic"></arg>
<arg name="hostname"></arg>
<arg name="type"></arg>
</mutation>
<value name="ARG0">
<block type="text" id="E~iotn9wF;Let({7%t2E">
<field name="TEXT">p1b7</field>
</block>
</value>
<value name="ARG1">
<block type="text" id="FAP!atq!u%WrvXl^R2ts">
<field name="TEXT">Lampe Ecke Helligkeit</field>
</block>
</value>
<value name="ARG2">
<block type="text" id="umuTAU1|5gG|sv/$[=6a">
<field name="TEXT">Büro</field>
</block>
</value>
<value name="ARG3">
<block type="text" id="f{Ht+f@lncWjnT7EMvY7">
<field name="TEXT">hasp</field>
</block>
</value>
<value name="ARG4">
<block type="text" id="Jr_osU%Iy/{u}}oP=Os3">
<field name="TEXT">buero_sofa</field>
</block>
</value>
<value name="ARG5">
<block type="text" id="||K]*]sydI[Jq6;7:*O|">
<field name="TEXT">number</field>
</block>
</value>
<next>
<block type="control" id="I@W^acpevmW@{].wv{Cb">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">0_userdata.0.test</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="logic_boolean" id="S=gT0|j);wtj0Jsc1Maa">
<field name="BOOL">FALSE</field>
</block>
</value>
</block>
</next>
</block>
</statement>
</block>
</statement>
</block>
</next>
</block>
</xml>
const createTopic = (action) => `${pretopic}/${hostname}/${action}/${button_id}`;
const createID = (action) => `0_userdata.0.${speicherpfad}.${hostname}.${action}.${button_id}`;
const statetopic = createTopic('state');
const commandtopic = createTopic('command') + (type.toLowerCase() === 'number' ? '.val' : '');
const state_id = createID('state');
const command_id = createID('command');
// Standardwert für def
const getDefaultValue = (t) => (t === 'number' ? 0 : t === 'boolean' ? false : '');
const state_common = {
name: buttonfunktion,
role: "state",
type: "string",
read: true,
write: false,
def: '',
custom: {
"mqtt-client.0": { enabled: true, publish: false, subscribe: true, topic: statetopic }
}
};
const command_common = {
name: buttonfunktion,
role: "state",
type,
read: true,
write: true,
def: getDefaultValue(type),
custom: {
"mqtt-client.0": { enabled: true, publish: true, subscribe: false, topic: commandtopic }
}
};
createState(state_id, '', state_common);
createState(command_id, getDefaultValue(type), command_common);