@Emil Sorry. Didn't write that it's when I'm in my car on my way home.😉
-
Hello,
I have purchased several Flic hubs, Buttons, Twists and trying to get them integrated into Home Assistant.
When the sales pitch originally went out for the Flic Twist .. there was a carrot dangled that Home Assistant support may be considered .. since then .. nothing ..
Can we please, please, please get any clarity if your are even close, or considering any updates on a native Flic integration for Home Assistant to support your Buttons and Twist?
-
One quick question and some general feedback.
I am setting up my flic duo buttons with mqtt to home assistant.
First my two questions
Is it possible to adjust how virtual volume/lights work with twist motion. It's nice to be able to set max volume, but I am less worried about max and more worried about jumping to a volume I don't want.
When I experiemtn and log the output it works pretty well but can be a bit too twitchy.
I would like a max speed increase, or in fact I would like to more see it like a "knob" you hold. Hold it in first angle it increases with 1%/s for small adjustments, angle it further to enter next step where volume is adjusted by x%/s and maybe a third fast one too?
So basically instead of seeing it as on old stereo knob that you turn to a position for a certain volume I would more like to see it as variable speed volume up/down.
Bonus would be to set a "high", "low" volume above/below respectively it would always adjust slower no matter what.Is it possibe to set sensitivity for gesture, I find mine is a bit trigger happy so it says a gesture happened even tho I meant just button press. I would like it to be pretty solid movement before it counts it as gesture.
Bonus statement: Maybe my hand works poorly, but swipe left is often reported as down, the other 3 directions is more clear. Could be nice to be able to set how sure it needs to be to call it a gesture. I would rather have "unclear" result than a false one.
Then I am saying how am doing in general and happy about feedback.
I have created a mqtt module as defined in https://github.com/50ButtonsEach/flic-hub-sdk-mqtt-js
Altho in fairness right now I am just logging to console during testing and setup.Then I listen to my virtual volume and lights I set up via Flic Hub Studio from the app.
And I also listen to buttonUp to detect clicks and gestures.However I found that it would happily send rotate events for volume etc when I was just doing clicks and gestures.
I also tried to setup the other gestures in the app instead of listening on buttonUp but same happened, I got both rotate and gesture events.So I settled for that I have to hold the button for 700ms to enter rotate mode, then it disregards everything else and only streams volume etc
This means, to adjust volume or dimming I need to hold button first but at least I don't mix up commands. Since I find dimming and volume most annoying to do by mistake.
So the only downsides of this is a slight delay when I want to adjust those and I reasonable should avoid long press actions.
-
I had my Matter Bridge commissioned to my Flic hub and all working great,
Accidentally I managed to decommision the bridge from the flic fabric via the iOS Matter settings but it didn't remove from the flic app.
Now I'm in a state where the flic app thinks there is a bridge (and all its associated devices) there but it shows as offline and I can't remove it.
I managed to recommision the Bridge back to flic but now I have a duplicate set of 22 device in my list!
Is there a way I can remove the old bridge from the Flic Hub?
24f86297-d670-4628-8f9d-09b3bef31c63-Screen Shot 2026-01-06 at 8.59.22 AM.png
-
What is it?
Hub TCP server for using the IR module via HTTP.
Both to record of new signals with a given name and to play them back.
Using net since SDK doesn't have the nodejs HTTP-module available.Why?
I really wanted to be able to call my IR module from my phone homescreen or Google Home (via IFTTT). I got it working so I wanted to share it if anyone else find it helpful 🙂The code is what could be called a POC, so code feedback and/or changes are totally welcome.
How does it work?
Record a signal GET {ip}:1338?record={name_of_signal} Plays a signal GET {ip}:1338?cmd={name_of_signal} Cancel recording GET {ip}:1338?cancelRecord=trueExample;
call GET 192.168.0.100:1338?record=volume_up Press Volume Up on remote towards IR module returns 200 OK Signal volume_up stored! call GET 192.168.0.100:1338?cmd=volume_up returns 200 OK Signal sent! Volume goes up 🙂The code
module.json
{ "name": "IRTCP", "version": "1.0.0" }main.js
// main.js const net = require("net"); const ir = require("ir"); const datastore = require("datastore"); const utils = require("./utils"); const respondToClient = function(c, statusCode, message) { c.write( "HTTP/1.1 " + statusCode + "\r\n" + "\r\n" ); c.write(message); c.end(); } const handleCmd = function(c, cmd) { datastore.get(cmd, function(err, strBuffer) { if (!err && strBuffer) { var signal = new Uint32Array(utils.str2ab(strBuffer)); if (!ArrayBuffer.isView(signal)) { return respondToClient(c, "422 Unprocessable Entity", "Unknown signal"); } ir.play(signal, function(err) { if (!err) { return respondToClient(c, "200 OK", "Signal sent"); } return respondToClient(c, "500 Internal Server Error", "Couldn't send signal"); }); } else { return respondToClient(c, "422 Unprocessable Entity", "Unknown cmd"); } }); } const handleRecord = function(c, name) { /* TODO: add a timeout for listening for complete */ ir.record(); console.log("recording signal..."); ir.on("recordComplete", function(signal) { datastore.put(name, utils.ab2str(signal.buffer), function(err) { if (!err) { console.log("Signal " + name + " stored!"); return respondToClient(c, "200 OK", "Signal " + name + " stored!"); } else { return respondToClient(c, "500 Internal Server Error", "Couldn't store signal"); } }); }); } var server = net.createServer(function(c) { console.log('server connected'); c.on('end', function() { console.log('server disconnected'); }); c.on('data', function(data) { console.log(data); var match = data.toString().match(/GET \/\?.[^ ]*/); if (!match) { return respondToClient(c, "403 Forbidden", "Forbidden method"); } var params = utils.parseParams(match[0].split("GET /?")[1]); if (params.cmd) { return handleCmd(c, params.cmd); } else if (params.record && params.record.length > 0) { return handleRecord(c, params.record); } else if (params.cancelRecord) { ir.cancelRecord(); console.log("recording canceled!"); return respondToClient(c, "200 OK", "Recording canceled!"); } else { return respondToClient(c, "403 Forbidden", "Forbidden params"); } }); }); server.listen(1338, "0.0.0.0", function() { console.log('server bound', server.address().port); });utils.js
const ab2str = function(buf) { return String.fromCharCode.apply(null, new Uint16Array(buf)); } const str2ab = function(str) { var buf = new ArrayBuffer(str.length*2); var bufView = new Uint16Array(buf); for (var i=0, strLen=str.length; i < strLen; i++) { bufView[i] = str.charCodeAt(i); } return buf; } const parseParams = function (s) { var obj = {}; var arr = s.split("&"); var temp; for (i = 0; i < arr.length; i++) { temp = arr[i].split("="); obj[temp[0]] = temp[1]; } return obj; }; exports.ab2str = ab2str; exports.str2ab = str2ab; exports.parseParams = parseParams;